{"id":6130,"date":"2026-08-09T12:22:35","date_gmt":"2026-08-09T12:22:35","guid":{"rendered":"https:\/\/dalelane.co.uk\/blog\/?p=6130"},"modified":"2026-08-09T17:15:18","modified_gmt":"2026-08-09T17:15:18","slug":"why-we-cant-have-nice-things","status":"publish","type":"post","link":"https:\/\/dalelane.co.uk\/blog\/?p=6130","title":{"rendered":"Why we can&#8217;t have nice things"},"content":{"rendered":"<p><strong>Looking at the server request logs for <a href=\"https:\/\/machinelearningforkids.co.uk\/\">Machine Learning for Kids<\/a> is a depressing reminder of what it means to run something on the Internet nowadays.<\/strong><\/p>\n<p>I was skimming through the request logs for the Machine Learning for Kids servers yesterday <sup><a href=\"https:\/\/dalelane.co.uk\/blog\/?p=6130#footnote\">[1]<\/a><\/sup>, and what jumped out at me was the constant rate of requests to non-existent paths that I just generate HTTP 404 responses for. <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/images.dalelane.co.uk\/2026-08-08-mlforkids\/log-lines.png\" style=\"width: 100%; max-width: 600px; border: thin black solid;\"\/><\/p>\n<p>These aren&#8217;t someone accidentally mistyping a URL. <\/p>\n<p>I grepped an excerpt from the log for requests that got an HTTP-404 response and <a href=\"https:\/\/gist.github.com\/dalelane\/c036c122cf13c47ee516c06d8941c403\">put the result in a gist<\/a>.<\/p>\n<p><!--more-->The result is an interesting reminder of the reality of the Internet nowadays. <\/p>\n<p>Have a quick scroll at <a href=\"https:\/\/gist.github.com\/dalelane\/c036c122cf13c47ee516c06d8941c403\">gist.github.com\/dalelane<\/a> &#8211; I think the URL and user-agent properties are probably the most interesting bits.<\/p>\n<p>The requests that caught my eye first were just looking for credential files that I might&#8217;ve accidentally left on the server, such as <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/.ftpconfig<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/backend\/sftp-config.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/sftp.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/winscp.ini<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/deploy.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/.idea\/deployment.xml<\/code>.<\/p>\n<p>But the more I looked, I started to see how thousands of requests were systematically trying permutations of prefixes for different platforms and frameworks combined with common names of credentials files. <\/p>\n<p>A few examples of prefixes I recognised:<\/p>\n<table border=1 cellpadding=10>\n<tr>\n<th>path prefix<\/th>\n<th>platform \/ framework<\/th>\n<\/tr>\n<tr>\n<td><code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/.aws\/<\/code><\/td>\n<td>AWS<\/td>\n<\/tr>\n<tr>\n<td><code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/.amplify\/<\/code><\/td>\n<td>AWS Amplify<\/td>\n<\/tr>\n<tr>\n<td><code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/laravel\/<br \/>\/storage\/app\/private\/<\/code><\/td>\n<td>Laravel PHP framework<\/td>\n<\/tr>\n<tr>\n<td><code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold;\">\/node_modules\/<br \/>\/frontend\/<br \/>\/backend\/<\/code><\/td>\n<td>Node.js \/ React<\/td>\n<\/tr>\n<\/table>\n<p>A few examples of credential files suffixes that keep coming up:<\/p>\n<p><code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.local<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.prod<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.production<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.staging<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.dev<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.development<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.test<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.bak<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.backup<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.old<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.save<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.txt<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.example<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.dist<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.aws<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.s3<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.ses<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.env.sendgrid<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">web.config<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.boto<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.s3cfg<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.dockercfg<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">credentials<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">credentials.csv<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">credentials.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">credentials.bak<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">rootkey.csv<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">accesskeys.csv<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">terraform.tfstate<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">terraform.tfstate.backup<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">aws-exports.js<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">aws-exports.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">awsconfiguration.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">amplify-meta.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">appsettings.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">appsettings.aws.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">appsettings.production.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">smtp_credentials.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">mailgun\/mail_config.json<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">api\/sendgrid_key.txt<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">api\/secrets.sql<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">postgres_dump.sql<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">database.mongodump.zip<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">dump.sqlite<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">.kube\/config.txt<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">cloudflare_api_key.txt<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">shopify\/config.yml<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">truststore.p12<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">ssl\/keystore.p12<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">tls.pem<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">id_ecdsa.pub<\/code><\/p>\n<p>The thoroughness of it is kind of amazing. <\/p>\n<p>There are hundreds of requests that assume it&#8217;s a WordPress server, with requests to paths starting with <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-includes\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-admin\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-json\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-content\/<\/code>. <\/p>\n<p>At least one client seemed to be trying every known WordPress subdirectory path, but there are lots of requests looking for specific WordPress plugins such as <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-content\/plugins\/gravitysmtp<\/code> and <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-content\/plugins\/revslider<\/code>, presumably because these are plugins with known vulnerabilities?<\/p>\n<p>Lots of requests were trying to find WordPress database credentials with requests to paths such as <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-config.php.bak<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-config.php.backup<\/code> and <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/wp-config.php.old<\/code>.<\/p>\n<p>Hundreds of requests were looking for admin panels and consoles, with requests to paths such as <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/admin<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/administrator<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/phpmyadmin\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/phpMyAdmin\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/PMA\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/pma\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/myadmin\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/mysql\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/mysqladmin\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/dbadmin\/<\/code>, <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/db\/<\/code>.<\/p>\n<p>Some requests were looking for info about a git repository, with requests to paths such as <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/.git\/HEAD<\/code> and <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/.git\/config<\/code>.<\/p>\n<p>In an interesting sign of the times, there are requests to paths like <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/mcp<\/code> and <code style=\"color: #770000;background-color: #FFFFC0;padding: 0.2em 0.4em;font-weight: bold; font-size: 0.9em;\">\/sse<\/code>, presumably looking for unauthenticated <a href=\"https:\/\/modelcontextprotocol.io\/\">Model Context Protocol<\/a> servers they can exploit. <\/p>\n<p>Speaking of AI, in addition to regular spiders and web crawlers, I also see requests from web crawlers for AI services, including PerplexityBot, OAI-SearchBot and Google-Extended.  <\/p>\n<p>I&#8217;m sure there are more patterns in the logs &#8211; as someone who runs a WordPress site, and has worked on React sites and Node.js and MCP servers, those were just the URLs that jumped out at me. I imagine that someone with a different tech background will recognise other things in there. <\/p>\n<p>Moral of the story? <\/p>\n<p>Firstly, a reminder that there are some bad actors on the Internet who spoil it for the rest of us. <\/p>\n<p>Secondly&#8230; I need to set up some more firewall rules.<\/p>\n<p><\/p>\n<hr \/>\n<p><sup><strong><a name=\"footnote\">[1]<\/a><\/strong><\/sup> &#8211; <strong>Why was I looking at the request logs?<\/strong><\/p>\n<p>There was <a href=\"https:\/\/cloud.ibm.com\/status\/history?query=CHG16822921&#038;item=CHG16822921\">a maintenance window this weekend<\/a> for the <a href=\"https:\/\/www.ibm.com\/watson\">IBM watsonx Assistant<\/a> service that I use in <a href=\"https:\/\/machinelearningforkids.co.uk\/\">Machine Learning for Kids<\/a> for <a href=\"https:\/\/dalelane.co.uk\/blog\/?p=5119\">projects to recognise text<\/a>.  Existing models would&#8217;ve kept working, but for a few hours on Saturday morning students who tried to train a new model will have seen an &#8220;Unknown error&#8221; message. <\/p>\n<p>I&#8217;ve <a href=\"https:\/\/github.com\/IBM\/taxinomitis\/commit\/575b62528e640e1c36f4c16067f1af6008a841ea\">improved this now<\/a> so in future maintenance windows students will see <a href=\"https:\/\/github.com\/IBM\/taxinomitis\/commit\/575b62528e640e1c36f4c16067f1af6008a841ea#diff-56a88c6c76434e092f6bb8d0cb72796daae37f7e2212f15716c53cfa7925be69R35\">a message explaining the reason<\/a>, but I was curious to see how many students would&#8217;ve hit &#8220;Unknown error&#8221; before I fixed that, so I had a quick look through the request logs to see failed model training requests.  <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Looking at the server request logs for Machine Learning for Kids is a depressing reminder of what it means to run something on the Internet nowadays. I was skimming through the request logs for the Machine Learning for Kids servers yesterday [1], and what jumped out at me was the constant rate of requests to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[587],"class_list":["post-6130","post","type-post","status-publish","format-standard","hentry","category-code","tag-mlforkids-tech"],"_links":{"self":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/posts\/6130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6130"}],"version-history":[{"count":8,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/posts\/6130\/revisions"}],"predecessor-version":[{"id":6138,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=\/wp\/v2\/posts\/6130\/revisions\/6138"}],"wp:attachment":[{"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dalelane.co.uk\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}