Hubby, Dad of TWO Girls! Speaker on InfoSec & Software Crafting. Engineering software & building teams since mid 90s. Volunteer @rebuildingblack He/Him

Austin, TX
Now more than ever, this affirmation is critical to the survival of our very Soul as a Nation: Black Lives Matter. #GeorgeFloydMurder
2
4
59
This hit me right in the feels
This is what AI is made for. Murtaugh is too old for this 💩 and Riggs has to find a new partner. I absolutely love how they brought in every character from that era and even combined two different characters for one actor in a couple different scenes. 🤣🤣🤣💥🔫
1
1
94
In the age of LLM-bootstrapped one-person shops, be mindful of whom you lay off, and how strong your "Moat" is. Today's layoffs are tomorrow's competition.
BREAKING: Microsoft, $MSFT, is offering buyouts to 60,000 workers as part of the company’s efforts to cut costs amid AI adoption, per Bloomberg. Personnel on select teams in the US, Canada, India, and the UK at a vice president level and below will be eligible. This reflects ~27% of Microsoft's total workforce.
1
2
131
🟣 Chris Holland retweeted
Congrats to @killa who solved stealmybitcoin.com hours ago but I screwed up which key went on the server (the flag was a root wallet WIF instead of the branch WIF). Check out their awesome writeup here: github.com/KillaBoi/StealMyB…
43
219
2,058
511,016
Well apparently that bitcoin was successfully stolen after 19.28 hours. This reminds me when @Cloudflare did a cool challenge like this after the openssl #HeartBleed vulnerability which helped boost the popularity of @letsencrypt
1
3
190
The various layers of a Stack and why upgrading is hard.
Replying to @stevemcgregory
It'd be nice if folks were having conversations. But instead, it's just the usual one-line snarky takes backed by no constructive argument like "PHP is <insert expletive>". And I've seen same takes directed at literally every other stack out there. And my point is, all stacks are, for the most part, "fine". They've all had their share of CVEs, and with LLM-driven research, there will be an explosion of more, very soon. They're all designed to be patched with mature package managers that support version-pinning. It's just that these upgrades remain the responsibilities of the developers. What happens though is developers start a project on a given stack at a given point in time. If you look at a "stack" you have these moving parts: The Stack Layers, from high level to low level: - Layer 1: The Application Framework (Laravel, Symfony, Spring, .Net, Django, Rails) - Layer 2: A wild flurry of 3rd-party Libraries - Layer 3: The Language / Runtime (C#, Java, PHP, Python, Ruby) - Layer 4: The Operating System (Linux, Windows) Layer 1: So the developer starts building a SaaS application in a given Application Framework (AF). Their application right-away starts getting coupled to this framework's, call it, "API". Now right here, if you embrace an "Onion" or "Hexagonal" Architecture, you can dramatically limit this coupling, making it orders of magnitude easier to upgrade the AF down the road. Most devs have never heard of those though, couple all their code tightly to the framework, and live and die by its very paradigms which have absolutely nothing to do with their business logic. Some frameworks are biased toward this tight coupling, others make it easier on you. I have opinions with specifics but I'll keep them to myself. The key factor is you absolutely are not required to lean into any bias. It's just that most developers don't spend time thinking through this. Layer 2: As their needs evolve, they start adding 3rd party libraries to their application. Some of these libraries are tightly coupled to the Layer 1 framework, call them "extensions of the framework". Other libraries are self-contained and don't care about the framework. But they definitely care about the language version, Layer 3. If you want to upgrade a Layer 2 Library, you'll often need to upgrade your Layer 3 language version. Layer 3: The language/runtime cares about Layer 4, the Operating System. Upgrading it will eventually require you to upgrade Layer 4, the OS. Layer 4: The OS ... largely avoids getting upgraded. Say you built an application on a Layer 3 language runtime of PHP 8.1, CVE comes out and people say upgrade. So you look for a minor version patch for PHP 8.1, and none exists, as clearly indicated by PHP's widely published version support schedule. So you try to emergency-upgrade to PHP 8.2 ... HAHA. Whoops your Layer 3 language PHP 8.2 is not compatible with your Layer 4 OS version. So you upgrade the OS. Assuming you're successful, now three of your 15 Layer 2 3rd-party Libraries break when you run your Unit Tests. (because you did write unit tests ... RIGHT? And you do TDD, RIGHT?) But you can't update your Layer 2 Libraries because they depend on other Layer 2 Libraries which depend on a specific version of your Layer 1 framework. FML. These challenges exist across all stacks. Folks are out there deriding a Layer 3 language, not even qualifying a Layer 1 framework, all of which have always had very robust version management and upgrade paths since their inception, but that nobody ever leverages. Blaming the stack is counterproductive. Conversations need to be had on better Software Engineering practices. Which is exactly why I started my original post the way I did, calling out TDD, Onion/Hexagonal architectures, Domain-Driven Design and the Data Mapper pattern.
108
I did say we would all get humbled.
So anyway who was saying you deserve it for running PHP again..?
2
149
#PHP Then and Now:
Replying to @mattxancap
Oh 100% all this. But the PHP you knew back then, and the PHP that's actually deployed out there are two completely different beasts. Unrecognizable. And a lot of folks with experience similar to yours have remained anchored in opinions which are simply not informed by reality of the past 20 years at least. And I hear you, I lived thru those years as well, I remember C-compiled binaries, shell and perl scripts in cgi-bin folders whose stdin/out was the web server socket. Those were terrifying days. I remember Netscape Enterprise Server. I remember the first "Servlet" specs and APIs that follow, and Tomcat. PHP 5.0 released in 2004 made PHP one of the first web-application-enabling interpreted languages with a very clean implementation of Object-Oriented Paradigms. Interface. Abstract Class. Class. private, public, protected methods and members. It already supported explicit types on method arguments, just not on method return types. With these core language capabilities, and frameworks such as Symfony, you could actually build very-well architected web applications leveraging some of the better practices I laid out in my original post (TDD, Onio/Hex architecture, DDD, Data Mapper, etc.) Method return types were introduced 10 years later in PHP 7 in 2015. Since then PHP and application frameworks built on top of it have continued to flourish.
104
🟣 Chris Holland retweeted
php vulnerabilities: time to clarify what really happened here's my conversation with @derickr, a member of php internals. we go through the full timeline and the facts watch here: piped.video/5X5csEbmHqs?si=uAk7…
3
21
115
12,741
Proudly watching my agents do test-driven development. I feel like Dr. Ellie Arroway in "Contact": "So Beautiful."
1
4
168
it's part of an agentic workflow i built for my team in Feb 2026, and we've all been on it 100% since May 2026, it's called "AI Forging". It leverages a mature plugin called "superpowers" and it adds things around it.
29
putting aside folks throwing shade at @dhh i do think there's sensible merit to consider porting a codebase from any interpreted / virtual runtime to Rust w/ Agentic workflows. I was actually exploring various Rust-adaptations to paradigms I espouse. Especially since we have historically pre-AI built everything in TDD workflows. And our Agentic workflows have been ( aiforging.dev )
Somewhere, a CTO just found out their servers still run PHP 5.6 💀
70
Lot of #PHP snark going around right now from folks who've either never written software, or never done it in PHP (in the last 20 years). I've architected, designed and hand-coded copious amounts of software in Java/Spring/Hibernate, .Net/C# Entity Framework and PHP/Symfony/Doctrine, applying very similar patterns and better practices of completely stack-agnostic concepts such as: - Test-Driven Development (and given half-day and full-day hands-on live-coding workshops at conferences worldwide) - Onion/Hexagonal Architecture - Domain-Driven Design - Data Mapper ORMs Beyond workshops, I have spoken on these topics at conferences worldwide as well. I might argue that I am not completely devoid of clue when it comes to these stacks' capabilities. In fact, I have hired, coached and cross-trained engineers across these 3 stacks. And I can assure you PHP shines within these paradigms, with an extremely vibrant, mature and robust ecosystem of Application Frameworks, Security Frameworks and Tools, and Open-Source Software Components and Libraries. PHP is not WordPress. WordPress is not PHP. If you care about quality software, PHP is a great home for you. So is Java. So is C#. So are other languages. If you suck at software you'll suck in any stack. If you're good, each stack has strengths you can play to. NOW let's talk about security. This vulnerability, is the very first RCE to this level in PHP's history. It was reported back in August. AI did help. A lot. (Wiz claims one researcher did in a week what would previously have taken a team months) Previous PHP RCEs had limited attack surfaces: - 2024 - Windows CGI Only - 2019 - One specific nginx setup - 2012 - CGI only None of which applied to reasonably-better practice typical Linux + Nginx + php-fpm deployments. This right here was ... unique, I think even across any stack. The only language-runtime equivalent to it was probably Windows IIS Code Red. That's not to say other stacks didn't have framework-level vulnerabilities with devastating impacts, if memory needs refreshed: Ruby — Rails CVE-2013-0156: every Rails app, default config, pre-controller, botnet-exploited. The strongest analogue in any stack. Java — Struts 2 CVE-2017-5638 (Equifax). Log4Shell needed the app to log attacker input; Spring4Shell needed WAR-on-Tomcat + JDK 9+ + POJO binding. Node — React2Shell CVE-2025-55182 (Dec 2025, CVSS 10, CISA KEV): default create-next-app exploitable, but Express/Fastify/Nest untouched. .NET — MS10-070 padding oracle (2010) leaked web.config/machineKey on every ASP (dot NET) site; RCE was a derived second step. Kestrel/ASP.NET Core has never had an RCE. Look ... let's drop the snark. LLM-driven vulnerability research and breaching frameworks are about to humble the absolute heck out of all of us. They already have. If you think your stack is not at risk, think again.
45
83
385
24,054
100% all of this:
Stop judging PHP by the spaghetti vomited out by the least skilled devs in 2005. Modern PHP has strict typing, dependency injection, mature frameworks, proper separation of concerns, asynchronous processing, static analysis, and comprehensive testing. Symfony and Laravel aren't accidents. They're the result of decades of engineering influenced by the best of Ruby on Rails and .NET Bad architecture isn't a language feature. And PHP has evolved into a form considerably more intelligent than most of its haters.
1
45
some additional context, while conversing with @stevemcgregory
Replying to @stevemcgregory
It'd be nice if folks were having conversations. But instead, it's just the usual one-line snarky takes backed by no constructive argument like "PHP is <insert expletive>". And I've seen same takes directed at literally every other stack out there. And my point is, all stacks are, for the most part, "fine". They've all had their share of CVEs, and with LLM-driven research, there will be an explosion of more, very soon. They're all designed to be patched with mature package managers that support version-pinning. It's just that these upgrades remain the responsibilities of the developers. What happens though is developers start a project on a given stack at a given point in time. If you look at a "stack" you have these moving parts: The Stack Layers, from high level to low level: - Layer 1: The Application Framework (Laravel, Symfony, Spring, .Net, Django, Rails) - Layer 2: A wild flurry of 3rd-party Libraries - Layer 3: The Language / Runtime (C#, Java, PHP, Python, Ruby) - Layer 4: The Operating System (Linux, Windows) Layer 1: So the developer starts building a SaaS application in a given Application Framework (AF). Their application right-away starts getting coupled to this framework's, call it, "API". Now right here, if you embrace an "Onion" or "Hexagonal" Architecture, you can dramatically limit this coupling, making it orders of magnitude easier to upgrade the AF down the road. Most devs have never heard of those though, couple all their code tightly to the framework, and live and die by its very paradigms which have absolutely nothing to do with their business logic. Some frameworks are biased toward this tight coupling, others make it easier on you. I have opinions with specifics but I'll keep them to myself. The key factor is you absolutely are not required to lean into any bias. It's just that most developers don't spend time thinking through this. Layer 2: As their needs evolve, they start adding 3rd party libraries to their application. Some of these libraries are tightly coupled to the Layer 1 framework, call them "extensions of the framework". Other libraries are self-contained and don't care about the framework. But they definitely care about the language version, Layer 3. If you want to upgrade a Layer 2 Library, you'll often need to upgrade your Layer 3 language version. Layer 3: The language/runtime cares about Layer 4, the Operating System. Upgrading it will eventually require you to upgrade Layer 4, the OS. Layer 4: The OS ... largely avoids getting upgraded. Say you built an application on a Layer 3 language runtime of PHP 8.1, CVE comes out and people say upgrade. So you look for a minor version patch for PHP 8.1, and none exists, as clearly indicated by PHP's widely published version support schedule. So you try to emergency-upgrade to PHP 8.2 ... HAHA. Whoops your Layer 3 language PHP 8.2 is not compatible with your Layer 4 OS version. So you upgrade the OS. Assuming you're successful, now three of your 15 Layer 2 3rd-party Libraries break when you run your Unit Tests. (because you did write unit tests ... RIGHT? And you do TDD, RIGHT?) But you can't update your Layer 2 Libraries because they depend on other Layer 2 Libraries which depend on a specific version of your Layer 1 framework. FML. These challenges exist across all stacks. Folks are out there deriding a Layer 3 language, not even qualifying a Layer 1 framework, all of which have always had very robust version management and upgrade paths since their inception, but that nobody ever leverages. Blaming the stack is counterproductive. Conversations need to be had on better Software Engineering practices. Which is exactly why I started my original post the way I did, calling out TDD, Onion/Hexagonal architectures, Domain-Driven Design and the Data Mapper pattern.
67
some additional context, while conversing with @mattxancap
Replying to @mattxancap
Oh 100% all this. But the PHP you knew back then, and the PHP that's actually deployed out there are two completely different beasts. Unrecognizable. And a lot of folks with experience similar to yours have remained anchored in opinions which are simply not informed by reality of the past 20 years at least. And I hear you, I lived thru those years as well, I remember C-compiled binaries, shell and perl scripts in cgi-bin folders whose stdin/out was the web server socket. Those were terrifying days. I remember Netscape Enterprise Server. I remember the first "Servlet" specs and APIs that follow, and Tomcat. PHP 5.0 released in 2004 made PHP one of the first web-application-enabling interpreted languages with a very clean implementation of Object-Oriented Paradigms. Interface. Abstract Class. Class. private, public, protected methods and members. It already supported explicit types on method arguments, just not on method return types. With these core language capabilities, and frameworks such as Symfony, you could actually build very-well architected web applications leveraging some of the better practices I laid out in my original post (TDD, Onio/Hex architecture, DDD, Data Mapper, etc.) Method return types were introduced 10 years later in PHP 7 in 2015. Since then PHP and application frameworks built on top of it have continued to flourish.
94
Just to set fair expectations to anybody new to my timeline: According to @ZianESmith , you shouldn't pay any attention to my opinions on Software Engineering because i have pronouns in my bio, and i have ... *checks notes*, dared to build things in C#/.Net. But at least it's possible that i'm not a bad person. So I've got *that* going for myself. But Python is *the* answer, for sure. CVE-2021-3177 was never a thing. Buddy, I'm happy to take you seriously. It'd help my tiny inferior brain if you'd be inclined to make some kind of point anchored in some form of informed opinion. Logical arguments help me connect the dots better. For one, you might one day learn that for a long time now, you can code and deploy .Net applications on Linux. You can even use vi. I might recommend @JetBrainsRider but hey ... whatever floats one's boat.
1
1
186
Now would be a good time to throw a couple bucks at @ThePHPF who, since 5 years ago, has greatly bolstered the PHP ecosystem. Mad props to all the folks who worked tirelessly toward responsible disclosures and prompt patch releases, despite those who undermined their efforts. nitter.siddz.com/chrisholland/status/21…
I just sponsored @ThePHPF. Go sponsor your open source dependencies! (at @LonghornPHP ) github.com/sponsors/ThePHPF?…
1
7
593
Oh wow.
141
Yea.
Me after patching my servers for the php2shell exploit.
1
107