[{"data":1,"prerenderedAt":264},["ShallowReactive",2],{"note-your-ai-says-its-secure-how-to-check":3,"notes-list":228},{"id":4,"title":5,"author":6,"body":7,"date":216,"description":217,"extension":218,"featured":219,"image":220,"meta":221,"navigation":222,"path":223,"seo":224,"sitemap":225,"stem":226,"tags":220,"updated":220,"__hash__":227},"blog\u002Fblog\u002Fyour-ai-says-its-secure-how-to-check.md","Your AI says it's secure: how to check","Jeremy Hutchcraft",{"type":8,"value":9,"toc":205},"minimark",[10,14,25,28,33,36,39,42,53,64,68,71,74,77,81,84,87,93,96,105,109,112,115,124,128,131,137,140,149,153,156,165,169,172,175,179,182,185,192],[11,12,13],"p",{},"You asked your AI whether the app is secure. It said yes. It probably listed the reasons, with little green check marks.",[11,15,16,17,24],{},"That answer is worth nothing. Not because the AI is lying, but because it would say the same thing either way. One study found that people who wrote code with an AI assistant produced ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2211.03622",[22],"nofollow","less secure code and were more confident it was secure",". That is the trap in one sentence.",[11,26,27],{},"So don't ask. Check. Here are seven things you can do this afternoon without being an engineer. Use test accounts and made-up data for all of them.",[29,30,32],"h2",{"id":31},"_1-knock-on-the-door-without-a-key","1. Knock on the door without a key",[11,34,35],{},"Open a private browser window, so you are not logged in. Now try to visit pages that should need a login. Paste in the address of your dashboard, a customer page, an admin screen.",[11,37,38],{},"If any of them load, you have a problem that no feature will fix.",[11,40,41],{},"A good half of an app is invisible. The screen you see talks to an address behind the scenes that hands over the data. Your AI can tell you what those addresses are. Ask it for the list, then try one from the outside:",[43,44,50],"pre",{"className":45,"code":47,"language":48,"meta":49},[46],"language-bash","curl -i https:\u002F\u002Fyourapp.example\u002Fapi\u002Fcustomers\n","bash","",[51,52,47],"code",{"__ignoreMap":49},[11,54,55,56,59,60,63],{},"That command asks for the customer list without logging in. You want to see a refusal, usually the number ",[51,57,58],{},"401"," or ",[51,61,62],{},"403"," near the top. If you see names and email addresses, stop reading this and go fix that.",[29,65,67],{"id":66},"_2-make-two-accounts-and-try-to-snoop","2. Make two accounts and try to snoop",[11,69,70],{},"Create two test accounts, A and B. Log in as A and open something that belongs to A: an order, a profile, an invoice. Look at the address bar. There is often a number or a code in it.",[11,72,73],{},"Change that number to one that belongs to B.",[11,75,76],{},"If A can now see B's stuff, every customer can see every other customer's stuff. It is an easy hole to ship without noticing, because the app \"works\" perfectly in a demo with one user.",[29,78,80],{"id":79},"_3-look-for-keys-left-in-the-open","3. Look for keys left in the open",[11,82,83],{},"Apps use secret keys to talk to payment processors, databases and email services. A secret key in the wrong place is a house key taped to the front door.",[11,85,86],{},"If you have the code on your computer, run this from inside the project folder:",[43,88,91],{"className":89,"code":90,"language":48,"meta":49},[46],"git grep -nE \"sk_live|service_role|SECRET|PRIVATE_KEY|password\\s*=\"\n",[51,92,90],{"__ignoreMap":49},[11,94,95],{},"It searches every file for the usual shapes of a secret. Getting some lines back is not automatically bad. Getting back a long random-looking string sitting right there in a file is. Secrets belong in the hosting provider's settings, not in the code.",[11,97,98,99,104],{},"This is not rare. In January 2026, security researchers at Wiz found an AI-built app whose founder said he wrote none of the code. Its database was open to the internet and ",[18,100,103],{"href":101,"rel":102},"https:\u002F\u002Fwww.wiz.io\u002Fblog\u002Fexposed-moltbook-database-reveals-millions-of-api-keys",[22],"exposed 1.5 million API keys",".",[29,106,108],{"id":107},"_4-ask-to-see-the-rules-not-to-hear-about-them","4. Ask to see the rules, not to hear about them",[11,110,111],{},"Somewhere in your app there are rules that decide who can read which data. Ask your AI to show you the actual rules for each kind of record, and to tell you which records have none.",[11,113,114],{},"\"Show me\" is the important part. \"Yes, access rules are in place\" is an assurance. A list you can read is evidence. If the answer for your customer table is that anyone can read it, you just found the hole from check 2 without lifting a finger.",[11,116,117,118,123],{},"When a researcher looked at 1,645 apps built with one popular AI app builder, ",[18,119,122],{"href":120,"rel":121},"https:\u002F\u002Fmattpalmer.io\u002Fposts\u002Fstatement-on-CVE-2025-48757\u002F",[22],"170 of them were exposing personal data and keys",". He works for a competing company, so read it with that in mind. The counting is still the counting.",[29,125,127],{"id":126},"_5-check-the-parts-you-didnt-write","5. Check the parts you didn't write",[11,129,130],{},"Your app is built on top of a lot of code written by strangers. That is normal. It also means you inherit their security holes. This lists the known ones:",[43,132,135],{"className":133,"code":134,"language":48,"meta":49},[46],"npm audit\n",[51,136,134],{"__ignoreMap":49},[11,138,139],{},"If your app isn't built with JavaScript, ask your AI for the matching command. A few low-severity warnings are a normal Tuesday. Anything marked high or critical needs an answer.",[11,141,142,143,148],{},"While you are there, ask the AI one more question: is every package in this project real, and did you choose it on purpose? AI models sometimes ",[18,144,147],{"href":145,"rel":146},"https:\u002F\u002Fwww.usenix.org\u002Fconference\u002Fusenixsecurity25\u002Fpresentation\u002Fspracklen",[22],"invent package names that don't exist",". Anyone can register one of those names and put something nasty behind it.",[29,150,152],{"id":151},"_6-find-out-what-the-ai-itself-can-break","6. Find out what the AI itself can break",[11,154,155],{},"If you build with an agent, ask what it has access to. Can it reach the live database? Can it delete things? Is there a backup, and has anyone ever tried restoring from it?",[11,157,158,159,164],{},"In 2025 a coding agent ",[18,160,163],{"href":161,"rel":162},"https:\u002F\u002Fincidentdatabase.ai\u002Fcite\u002F1152\u002F",[22],"deleted a company's live database"," during a period when it had been told to change nothing. The data was recovered. A backup nobody has tested is a hope, not a backup.",[29,166,168],{"id":167},"_7-check-whose-name-is-on-everything","7. Check whose name is on everything",[11,170,171],{},"Log in to the place your code lives, the place your app is hosted, and the place your domain is registered. Are those accounts yours? Under your email, with your card?",[11,173,174],{},"If the answer is \"my developer set that up,\" or \"it's in the AI tool's account,\" you don't fully own your product yet. That is a security problem and a business problem in one.",[29,176,178],{"id":177},"what-this-does-not-cover","What this does not cover",[11,180,181],{},"This is a smoke test. It finds the fire that is already burning. It will not find the subtle things: a payment flow that can be tricked, a password reset that leaks who your customers are, the checks that only happen on the screen and not behind it.",[11,183,184],{},"Passing all seven means you have cleared the lowest bar. Failing even one means the app is not ready for real customers, however good it looks.",[11,186,187,188,104],{},"For a wider view of what tends to go wrong, read ",[18,189,191],{"href":190},"\u002Fblog\u002Fai-security-risks-small-business","The holes AI code ships with",[11,193,194,195,199,200,204],{},"And if you would rather have a person do the reading, that is what my ",[18,196,198],{"href":197},"\u002Fservices","second opinion"," is for: I go through the app, write down what I find, and tell you what I would fix first. Or ",[18,201,203],{"href":202},"\u002Fcontact","book the free half hour"," and tell me what you have.",{"title":49,"searchDepth":206,"depth":206,"links":207},2,[208,209,210,211,212,213,214,215],{"id":31,"depth":206,"text":32},{"id":66,"depth":206,"text":67},{"id":79,"depth":206,"text":80},{"id":107,"depth":206,"text":108},{"id":126,"depth":206,"text":127},{"id":151,"depth":206,"text":152},{"id":167,"depth":206,"text":168},{"id":177,"depth":206,"text":178},"2026-10-08","Seven checks a non-technical owner can run on an AI-built app this afternoon, what a bad result looks like, and what these checks will not catch.","md",false,null,{},true,"\u002Fblog\u002Fyour-ai-says-its-secure-how-to-check",{"title":5,"description":217},{"loc":223,"lastmod":216},"blog\u002Fyour-ai-says-its-secure-how-to-check","3dgVbSXjcCBxJ7Nfd1UU3_dTdGu8sBrcfqseQMnZhlg",[229,233,237,241,242,247,250,255,260],{"path":230,"title":231,"description":232,"date":216,"updated":220,"featured":219},"\u002Fblog\u002Fhow-i-build-with-agents","How I build with agents, and where I don't trust them","AI agents write most of the code I ship. Here is how the work is split between them and me, the jobs I hand over without worry, and the claims I never take their word for.",{"path":234,"title":235,"description":236,"date":216,"updated":220,"featured":222},"\u002Fblog\u002Fjudgement-over-tokens","Judgement over tokens","Anyone can prompt an app into existence now. The hard part is knowing when the machine is wrong, and that is the part you are actually paying for.",{"path":238,"title":239,"description":240,"date":216,"updated":220,"featured":219},"\u002Fblog\u002Fwhat-a-buyer-opens-first","What a buyer opens first","When somebody wants to buy your software company, they send a technical person to look under the hood. Here is what that person asks for, and the folder I build so the answers are already there.",{"path":223,"title":5,"description":217,"date":216,"updated":220,"featured":219},{"path":243,"title":244,"description":245,"date":246,"updated":216,"featured":219},"\u002Fblog\u002Fai-agents-small-business-safety-checklist","AI agents: a safety checklist before you let them work","AI agents can use files, browsers, apps and automations. Run this checklist before you give one real access to your business or your product.","2026-04-17",{"path":190,"title":191,"description":248,"date":249,"updated":216,"featured":219},"AI writes code that works in the demo and leaves the same handful of security holes behind. Here are the five I look for first, in plain English, and why the AI leaves them.","2026-04-16",{"path":251,"title":252,"description":253,"date":254,"updated":216,"featured":219},"\u002Fblog\u002Fwhy-most-ai-projects-fail-for-small-businesses","Why AI-built MVPs stall","The first 80% of an AI-built product shows up in a weekend. Then every fix breaks something else. Here is why that happens and how to get moving again.","2026-04-15",{"path":256,"title":257,"description":258,"date":259,"updated":216,"featured":219},"\u002Fblog\u002Fwhat-does-an-ai-consultant-do","What you pay a senior builder for","AI made the typing cheap. Here is what is left on the bill when you hire a senior person to build your product, and how to tell one from somebody with a chat window.","2026-04-13",{"path":261,"title":262,"description":263,"date":254,"updated":220,"featured":219},"\u002Fblog\u002Fai-use-policy-for-small-business-template","AI Use Policy for Small Business: A Template You Can Use Today","A practical AI use policy for small business teams, including approved tools, data rules, review requirements, and a one-page template.",1791574787601]