R1D19 Moonshots Day 2; Clickjacking for the greater good.
On day two of my moonshot, I glue together all of the missing pieces to get the data to flow from pardot to inka.
Pardot allows you to inject arbitrary javascript into any form that you create. I used this to my advantage and basically stole the submit button event, temporarily sending data back to my own server for further processing (and eventual order input into inka.io) and then resubmitting the form as usual.
The code to get this to work on the JS side looks something like this:
(function() {
var form = document.forms[0]
function sendOrder(order, event) {
xhr = new XMLHttpRequest();
xhr.open("POST", "https://$MY_SERVICE", true);
xhr.setRequestHeader("Content-type": "application/json");
xhr.onreadystatechange = function() {
if(xhr.readyState = XMLHttpRequest.DONE && xhr.status == 200) {
event.target.submit();
}
}
xhr.send(order);
}
form.addEventListener("submit", function(event) {
event.preventDefault();
// Code to Process Form
sendOrder(order, event);
}
})();
The key thing to keep in mind is that if you do event.target.submit() before the XMLHTTPRequest finishes, then it may never process the full request. This is why we pass it into the function, and perform the resubmission of the form after the response has gone through.
This was a fun little hack, but the solution is far from perfect.
Problems
The biggest risk here is that anyone can submit this form now 10,000 times without any real checks in place. As much as we love our customers, we don't really want to send 10,000 T-shirts to spam bots.It’s also overly complex and the form parser is very jenky because it’s making some very poor assumptions about what this from will always look like. Since the form is ultimately generated by pardot, it is subject to change without notice at any time.
Further Improvements
Solving the first problem would be required before I felt comfortable having this live in production. Some ideas would be to do some rate limiting, or intelligent checking to verify that the form submission came form a real human being (perhaps counting the time that it took for them to fill out a form?)However any sort of javascript validation is error prone as we have seen in this lovely $170 Million mistake.
Another improvement would be to send an email to someone in the event that we were not able to process an order so that a human being could attempt to do it manually.
Despite some of theses setbacks, I was able to have pardot send from data to my laptop via ngrok, process the data, and automatically place a T-Shirt order on inka.io.
Thank you for reading! Share your thoughts with me on bluesky, mastodon, or via email.
Check out some more stuff to read down below.
Most popular posts this month
- SQLite DB Migrations with PRAGMA user_version
- My Custom Miniflux CSS Theme
- 2024
- 2023
- Ladybird on Debian Stable
Recent Favorite Blog Posts
This is a collection of the last 8 posts that I bookmarked.
- Pluralistic: AI "journalists" prove that media bosses don't give a shit (11 Mar 2026) from Pluralistic: Daily links from Cory Doctorow
- Avi Alkalay: Uniqlo T-Shirt Bash Script Easter Egg from Fedora People
- Offline 23 hours a day from Derek Sivers blog
- Pluralistic: California can stop Larry Ellison from buying Warners (28 Feb 2026) from Pluralistic: Daily links from Cory Doctorow
- On Alliances from Smashing Frames
- Acting ethically in an imperfect world from Smashing Frames
- Diffusion of Responsibility from Smashing Frames
- My AI Adoption Journey from Mitchell Hashimoto
Articles from blogs I follow around the net
Experimenting with Starlette 1.0 with Claude skills
Starlette 1.0 is out! This is a really big deal. I think Starlette may be the Python framework with the most usage compared to its relatively low brand recognition because Starlette is the foundation of FastAPI, which has attracted a huge amount of buzz t…
via Simon Willison's Weblog: Entries March 22, 2026Speeding Up Django Startup Times with Lazy Imports
At Fancer we are building the security suite for startups. Startups use a lot of SaaS tools and services which means we are building a lot of integrations. Most of these go through API calls but we also try to leverage SDKs to make our lives a little bit …
via Anže's Blog March 22, 2026USR stablecoin depegs in $24 million exploit
The Resolv USD stablecoin, also known as USR, lost its intended dollar peg and dropped to around $0.14 after an exploiter was able to mint and sell tens of millions of unbacked tokens. USR is an asset-backed stablecoin that uses cryp…
via Web3 is Going Just Great March 22, 2026Generated by openring