Hijacking Headers

by Bret Lowrey

HTML

<script src="https://wzrd.in/standalone/minimist@latest"></script>
<script src="https://wzrd.in/standalone/expect@latest"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/superagent/2.3.0/superagent.min.js"></script>
<body>
  Fetching header...
</body>

Babel + JSX

const interceptHeaders = (headerMatch, callback) => {
  let setRequestHeader = XMLHttpRequest
    .prototype.setRequestHeader;
  XMLHttpRequest.prototype.setRequestHeader = function() {
    const [key, val] = arguments;
    if (key && key.includes(headerMatch)) {
      callback(val, key);
    }
    setRequestHeader.apply(this, arguments);
  };
};

const test = () => {
  const time = new Date().getTime();
  interceptHeaders('csrf-token', csrf => {
    expect(csrf).toEqual(time);
    document.body.innerHTML = 'Header set as: ' + csrf;
  });
  superagent.get('https://httpbin.org/headers')
    .set('x-csrf-token', time)
    .end();
};
test();