<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>http &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/http/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Wed, 19 Nov 2025 04:40:56 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>http &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Mastodon Now Sends Referer Headers! Hurrah!]]></title>
		<link>https://shkspr.mobi/blog/2024/12/mastodon-now-sends-referer-headers-hurrah/</link>
					<comments>https://shkspr.mobi/blog/2024/12/mastodon-now-sends-referer-headers-hurrah/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 14 Dec 2024 12:34:25 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[fediverse]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[mastodon]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=54457</guid>

					<description><![CDATA[Back in 2022, I wrote this rather grumpy post on Mastodon, the federated social media platform.  @Edent@mastodon.socialTerence EdenMastodon enforces a &#34;noreferrer&#34; on all external links.I have mixed feelings about that.As a blogger, I want to see *where* visitors are coming from. I also like to see (and sometimes join in) with the conversations they&#039;re having.But, I get that people want privacy…]]></description>
										<content:encoded><![CDATA[<p>Back in 2022, I wrote this rather grumpy post on Mastodon, the federated social media platform.</p>

<blockquote class="social-embed" id="social-embed-109323917419768019" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://mastodon.social/@Edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar" src="https://files.mastodon.social/accounts/avatars/000/007/112/original/37df032a5951b96c.jpg" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">@Edent@mastodon.social</p>Terence Eden</div></a><img class="social-embed-logo" alt="Mastodon" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-label='Mastodon' role='img' viewBox='0 0 512 512' fill='%23fff'%3E%3Cpath d='m0 0H512V512H0'/%3E%3ClinearGradient id='a' y2='1'%3E%3Cstop offset='0' stop-color='%236364ff'/%3E%3Cstop offset='1' stop-color='%23563acc'/%3E%3C/linearGradient%3E%3Cpath fill='url(%23a)' d='M317 381q-124 28-123-39 69 15 149 2 67-13 72-80 3-101-3-116-19-49-72-58-98-10-162 0-56 10-75 58-12 31-3 147 3 32 9 53 13 46 70 69 83 23 138-9'/%3E%3Cpath d='M360 293h-36v-93q-1-26-29-23-20 3-20 34v47h-36v-47q0-31-20-34-30-3-30 28v88h-36v-91q1-51 44-60 33-5 51 21l9 15 9-15q16-26 51-21 43 9 43 60'/%3E%3C/svg%3E"></header><section class="social-embed-text" itemprop="articleBody"><p>Mastodon enforces a "noreferrer" on all external links.</p><p>I have mixed feelings about that.</p><p>As a blogger, I want to see *where* visitors are coming from. I also like to see (and sometimes join in) with the conversations they're having.</p><p>But, I get that people want privacy and don't want to "leak" where they're visiting from.</p><p>Is it such a bad thing to tell a website "I was referred from this specific server"?</p><div class="social-embed-media-grid"></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://mastodon.social/@Edent/109323917419768019"><span aria-label="61 likes" class="social-embed-meta">❤️ 61</span><span aria-label="16 replies" class="social-embed-meta">💬 16</span><span aria-label="29 reposts" class="social-embed-meta">🔁 29</span><time datetime="2022-11-11T07:09:55.396Z" itemprop="datePublished">07:09 - Fri 11 November 2022</time></a></footer></blockquote>

<p>When you click on this link - <a href="https://www.bbc.co.uk/news">https://www.bbc.co.uk/news</a> - your browser says "Hey! BBC! Please can I have your <code>/news</code> page? BTW, I was referred here by <code>shkspr.mobi</code>. THANKS!"  This is called the "<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer">Referer</a>" and, yes, it is <a href="https://en.wikipedia.org/wiki/HTTP_referer#Etymology">mispelt</a>.</p>

<p>One the one hand, sending the referer is good; it lets the linked-to server know who is linking to it. That allows them to see where traffic is coming from. On the other hand, this <em>could</em> be bad for much the same reason.</p>

<p>If you run a server <code>anarcho_terrorists.biz</code>, you probably don't want the FBI knowing that your members are sharing links to their pages. If you run a small personal server, you may not want anyone knowing that you personally linked to them. If you run a server for a marginalised community, you may not want a hate-site to know your members are linking to you.</p>

<p>But if you're a large-ish, general purpose, non-private site - like Mastodon.social - where's the harm in allowing referer headers?</p>

<p>Anyway, for historic reasons, Mastodon blocked the referer header. This, I believe, was sensible for smaller servers but a miss-step for larger servers.  As I pointed out last week:</p>

<blockquote class="social-embed" id="social-embed-113611619218784737" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://mastodon.social/@Edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar" src="https://files.mastodon.social/accounts/avatars/000/007/112/original/37df032a5951b96c.jpg" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">@Edent@mastodon.social</p>Terence Eden</div></a><img class="social-embed-logo" alt="Mastodon" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-label='Mastodon' role='img' viewBox='0 0 512 512' fill='%23fff'%3E%3Cpath d='m0 0H512V512H0'/%3E%3ClinearGradient id='a' y2='1'%3E%3Cstop offset='0' stop-color='%236364ff'/%3E%3Cstop offset='1' stop-color='%23563acc'/%3E%3C/linearGradient%3E%3Cpath fill='url(%23a)' d='M317 381q-124 28-123-39 69 15 149 2 67-13 72-80 3-101-3-116-19-49-72-58-98-10-162 0-56 10-75 58-12 31-3 147 3 32 9 53 13 46 70 69 83 23 138-9'/%3E%3Cpath d='M360 293h-36v-93q-1-26-29-23-20 3-20 34v47h-36v-47q0-31-20-34-30-3-30 28v88h-36v-91q1-51 44-60 33-5 51 21l9 15 9-15q16-26 51-21 43 9 43 60'/%3E%3C/svg%3E"></header><section class="social-embed-text" itemprop="articleBody"><p>Two years later.</p><p>Want to know one of the major reasons Mastodon didn't catch on with journalists and large website owners?</p><p>It is *invisible* in referrer statistics.</p><p>Here's my blog from the last month.</p><p>BlueSky now sends me more traffic than Bing.</p><p>How much traffic does Mastodon send? It is impossible to know due to the "noreferrer" header in all links.</p><p>(I'm not saying your privacy isn't important. But you can't grow a community if no-one knows you exist.)</p><div class="social-embed-media-grid"><a href="https://files.mastodon.social/media_attachments/files/113/611/599/519/383/213/original/f32f26cb4a0f015a.png" class="social-embed-media-link"><img class="social-embed-media" alt="1 google.com 10,957 12,1112 news.ycombinator.com 1,681 1,7633 duckduckgo.com 415 4584 css-tricks.com 353 3875 reddit.com 317 3736 yandex.ru 352 3567 google.co.uk 280 3058 bsky.app 252 2969 bing.com 254 282" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://mastodon.social/@Edent/113611619218784737"><span aria-label="305 likes" class="social-embed-meta">❤️ 305</span><span aria-label="57 replies" class="social-embed-meta">💬 57</span><span aria-label="248 reposts" class="social-embed-meta">🔁 248</span><time datetime="2024-12-07T12:48:52.705Z" itemprop="datePublished">12:48 - Sat 07 December 2024</time></a></footer></blockquote>

<p>I'm not the only one to make this point - it has been a popular complaint for some time.</p>

<p>A few days ago, <a href="https://github.com/mastodon/mastodon/pull/33214">Mastodon changed to allow this to be configurable</a>.</p>

<p>This is <em>excellent</em> news. Website owners will be able to (somewhat) accurately see how much traffic Mastodon sends them.  That way they can determine if there is a suitably large audience to engage with on the Fediverse.</p>

<p>It is, of course, slightly more complicated than that!</p>

<ul>
<li>Instance owners can opt-in to allowing Referer headers (it is off by default).</li>
<li>The <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#directives">policy</a> means that only the domain name is sent; not the full page.</li>
<li>Mastodon is federated and there are thousands of sites. Even if they all opted-in, their statistics will be fragmented.</li>
<li>Apps can set their own Referer header - leading to more fragmentation.</li>
<li>Even if they do opt-in, users can set their browsers not to send Referer headers.</li>
</ul>

<p>Nevertheless, I'm delighted with this change. Hopefully it will allow the Fediverse to grow and attract more users.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=54457&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/12/mastodon-now-sends-referer-headers-hurrah/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I made a mistake in verifying HTTP Message Signatures]]></title>
		<link>https://shkspr.mobi/blog/2024/03/i-made-a-mistake-in-verifying-http-message-signatures/</link>
					<comments>https://shkspr.mobi/blog/2024/03/i-made-a-mistake-in-verifying-http-message-signatures/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 14 Mar 2024 12:34:05 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[ActivityPub]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49885</guid>

					<description><![CDATA[It&#039;s never great to find out you&#039;re wrong, but that&#039;s how learning and personal growth happens.  HTTP Message Signatures are hard. There are lots of complex parts and getting any aspect wrong means certain death.  In a previous post, I wrote A simple(ish) guide to verifying HTTP Message Signatures in PHP. It turns out that it was too simple. And far too trusting.  An HTTP Message Signature is a…]]></description>
										<content:encoded><![CDATA[<p>It's never great to find out you're wrong, but that's how learning and personal growth happens.</p>

<p>HTTP Message Signatures are hard<sup id="fnref:hard"><a href="https://shkspr.mobi/blog/2024/03/i-made-a-mistake-in-verifying-http-message-signatures/#fn:hard" class="footnote-ref" title="You might think the Entscheidungsproblem is hard, but that's just peanuts compared to etc. etc." role="doc-noteref">0</a></sup>. There are lots of complex parts and getting any aspect wrong means certain death<sup id="fnref:death"><a href="https://shkspr.mobi/blog/2024/03/i-made-a-mistake-in-verifying-http-message-signatures/#fn:death" class="footnote-ref" title="Or cake." role="doc-noteref">1</a></sup>.</p>

<p>In a previous post, I wrote <a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/">A simple(ish) guide to verifying HTTP Message Signatures in PHP</a>. It turns out that it was <em>too</em> simple. And far too trusting.</p>

<p>An HTTP Message Signature is a header which is separate to the message it signs.  You might receive a JSON message like this:</p>

<pre><code class="language-json">{
   "actor":   "https://example.com/user/Alice",
   "message": "We strike at dawn!"
}
</code></pre>

<p>How do you know that <em>really</em> came from Alice? You look at the header of the message. It will be something like:</p>

<pre><code class="language-_">Signature: 
   keyId="https://example.org/user/Alice#main-key",
   algorithm="rsa-sha256",
   headers="(request-target) host date digest",
   signature="/AJ4Dv/wSL3XE1dLjFHCYVc7AF4f3+Q10G/r8+6cPsooiUh2K3YX3z++Nclo4qKHYr61yu+T4OMqUry1T6ZHmZqmNkg1RpVg=="
</code></pre>

<p>We want to check that Alice signed this message with her <em>private</em> key. So we grab her <em>public</em> key given by the <code>keyId</code>.
From there, we do some fancy maths using RSA-SHA256 and conclude that, when you put together the <code>(request-target) host date digest content-type</code> and compare them to the public key, they can only have be signed by the private key. Hurrah!</p>

<p>Did you spot the mistake I made? It wasn't in the maths, or the complex ordering of the data, or the algorithm choice, or some weird Unicode problem.</p>

<p>I made an error in <em>trust</em>.</p>

<p>Take a look at the Signature again.</p>

<p>The <code>keyId</code> is from example.<strong>org</strong>. But the actor is from example.<strong>com</strong>.</p>

<p>This message <em>is</em> signed correctly. It <em>is</em> cryptographically valid. <strong>But it wasn't signed by the actor in the message!</strong></p>

<p>In this case, the fix is simple.  Get the public key from <code>keyId</code>. Then <em>independently</em> get the named actor's public key.  If they match, all is well. If not, skulduggery is afoot.</p>

<p>I'm <em>almost</em> tempted to say that you should <em>ignore</em> the provided <code>keyId</code> entirely; the source of truth is the actor's key - and the best way to get that is directly from the actor's profile.</p>

<p>Please explain why I'm wrong in the comments.</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:hard">
<p>You might think the <i lang="de">Entscheidungsproblem</i> is hard, but that's just <em>peanuts</em> compared to etc. etc.&nbsp;<a href="https://shkspr.mobi/blog/2024/03/i-made-a-mistake-in-verifying-http-message-signatures/#fnref:hard" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:death">
<p>Or cake.&nbsp;<a href="https://shkspr.mobi/blog/2024/03/i-made-a-mistake-in-verifying-http-message-signatures/#fnref:death" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49885&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/03/i-made-a-mistake-in-verifying-http-message-signatures/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[A simple(ish) guide to verifying HTTP Message Signatures in PHP]]></title>
		<link>https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/</link>
					<comments>https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 27 Feb 2024 12:34:04 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[ActivityPub]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[mastodon]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49733</guid>

					<description><![CDATA[Mastodon makes heavy use of HTTP Message Signatures. They&#039;re a newish almost-standard which allows a server to verify that a request made to it came from the person who sent it.  This is a quick example to show how to verify these signatures using PHP. I don&#039;t claim that it covers every use-case, and it is no-doubt missing some weird edge cases. But it successfully verifies messages sent by…]]></description>
										<content:encoded><![CDATA[<p>Mastodon makes heavy use of <a href="https://datatracker.ietf.org/doc/rfc9421/">HTTP Message Signatures</a>. They're a newish almost-standard which allows a server to verify that a request made to it came from the person who sent it.</p>

<p>This is a quick example to show how to verify these signatures using PHP. I don't claim that it covers every use-case, and it is no-doubt missing some weird edge cases. But it successfully verifies messages sent by multiple Fediverse servers.</p>

<p>Let's step through it with an example of a message sent from Mastodon to my server.</p>

<h2 id="headers"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#headers">Headers</a></h2>

<p>The HTTP request starts with these headers:</p>

<pre><code class="language-_">User-Agent:  http.rb/5.1.1 (Mastodon/4.3.0-nightly.2024-02-23; +https://mastodon.social/)
Host:  example.com
Date:  Sun, 25 Feb 2024 10:48:22 GMT
Accept-Encoding:  gzip
Digest:  SHA-256=Hqu/6MR2imi8DTzbNp5PNEAFSyk0poN7+x5F+Z4vZMg=
Content-Type:  application/activity+json
Signature:  keyId="https://mastodon.social/users/Edent#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="P07V5I2zflR8FRsDMHshHmhgOwSkjWevujEbOyKMwjycrdVXjTD0ACiLuc5lTqDEXZ/...4eg=="
Connection:  Keep-Alive
Content-Length:  2857
</code></pre>

<p>Some of those you may be familiar with, some not.  The first thing we'll do is a sanity check; was this message sent recently? Because clocks drift in and out of synchronisation, we'll check if the message was within ±30 seconds.</p>

<pre><code class="language-php">$headers = getallheaders();
if ( !isset( $headers["Date"] ) ) { return null; }  //  No date set
$dateHeader = $headers["Date"];
$headerDatetime  = DateTime::createFromFormat('D, d M Y H:i:s T', $dateHeader);
$currentDatetime = new DateTime();

// Calculate the time difference in seconds
$timeDifference = abs( $currentDatetime-&gt;getTimestamp() - $headerDatetime-&gt;getTimestamp() );
return ( $timeDifference &lt; 30 );
</code></pre>

<p>That was easy! On to the next bit.</p>

<h2 id="digest"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#digest">Digest</a></h2>

<p>A message posted to the server usually has a body. In this case it is a long string of JSON data.  To ensure the message hasn't been altered in transit, one of the headers is:</p>

<pre><code class="language-_">Digest:  SHA-256=Hqu/6MR2imi8DTzbNp5PNEAFSyk0poN7+x5F+Z4vZMg=
</code></pre>

<p>That says, if you do a SHA-256 hash of the JSON you received, and convert that hash to Base64, it should match the digest in the header.</p>

<pre><code class="language-php">$digestString = $headers["Digest"];
//  Usually in the form `SHA-256=Hqu/6MR2imi8DTzbNp5PNEAFSyk0poN7+x5F+Z4vZMg=`
//  The Base64 encoding may have multiple `=` at the end. So split this at the first `=`
$digestData = explode( "=", $digestString, 2 );
$digestAlgorithm = $digestData[0];
$digestHash = $digestData[1];

//  There might be many different hashing algorithms
//  TODO: Find a way to transform these automatically
if ( "SHA-256" == $digestAlgorithm ) {
    $digestAlgorithm = "sha256";
} else if ( "SHA-512" == $digestAlgorithm ) {
    $digestAlgorithm = "sha512";
}

$json = file_get_contents( "php://input" );

//  Manually calculate the digest based on the data sent
$digestCalculated = base64_encode( hash( $digestAlgorithm, $json, true ) );

return ( $digestCalculated == $digestHash );
</code></pre>

<p>But, of course, if someone has manipulated the JSON, they may also have manipulated the digest. So it is time to look at the signature.</p>

<h2 id="the-signature"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#the-signature">The Signature</a></h2>

<p>Let's take a look at the signature header:</p>

<pre><code class="language-_">Signature:
  keyId="https://mastodon.social/users/Edent#main-key",
  algorithm="rsa-sha256",
  headers="(request-target) host date digest content-type",
  signature="P07V5I2zflR8FRsDMHshHmhgOwSkjWevujEbOyKMwjycrdVXjTD0ACiLuc5lTqDEXZ/...4eg=="
</code></pre>

<p>This contains 4 pieces of information.</p>

<ol>
<li><code>keyID</code> - a link to the user's public key.</li>
<li><code>algorithm</code> - the algorithm used by this signature.</li>
<li><code>headers</code> - the headers which make up the string to be signed.</li>
<li><code>signature</code> - the signature string.</li>
</ol>

<p>Let's split them up so they can be used:</p>

<pre><code class="language-php">//  Examine the signature
$signatureHeader = $headers["Signature"];

// Extract key information from the Signature header
$signatureParts = [];
//  Converts 'a=b,c=d e f' into ["a"=&gt;"b", "c"=&gt;"d e f"]
               // word="text"
preg_match_all('/(\w+)="([^"]+)"/', $signatureHeader, $matches);
foreach ($matches[1] as $index =&gt; $key) {
    $signatureParts[$key] = $matches[2][$index];
}
</code></pre>

<p>Let's tackle each part in order.</p>

<h3 id="get-the-users-public-key"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#get-the-users-public-key">Get the user's public key</a></h3>

<p>You might think you can just get <code>https://mastodon.social/users/Edent#main-key</code> - but you would be wrong.</p>

<p>Firstly, you need to tell the key server that you want the JSON representation of the URl - otherwise you'll end up with HTML.</p>

<pre><code class="language-php">$publicKeyURL = $signatureParts["keyId"];
$context   = stream_context_create(
    [ "http" =&gt; [ "header" =&gt; "Accept: application/activity+json" ] ] 
);
$userJSON  = file_get_contents( $publicKeyURL, false, $context );
</code></pre>

<p>That gets you the JSON representation of the user.  On Mastodon, the key can be found at:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/jsonkey.pnh-fs8.png" alt="Screenshot of JSON. As described in text." width="938" height="355" class="aligncenter size-full wp-image-49734"></p>

<p>I don't know how to automatically find the key, so I've hard-coded its location.</p>

<pre><code class="language-php">$userData  = json_decode( $userJSON, true );
$publicKey = $userData["publicKey"]["publicKeyPem"];
</code></pre>

<h3 id="get-the-algorithm"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#get-the-algorithm">Get the algorithm</a></h3>

<p>This is rather straightforward. It's just the text in the signature header:</p>

<pre><code class="language-php">$algorithm = $signatureParts["algorithm"];
</code></pre>

<h3 id="reconstruct-the-signing-header"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#reconstruct-the-signing-header">Reconstruct the signing header</a></h3>

<p>Let's take a look at the third piece of the puzzle:</p>

<p><code>headers="(request-target) host date digest content-type"</code></p>

<p>This says "The signature is based on the following parts in order". So we only care about the headers which make up the request, the host, the date, the digest, and the content type. Other servers may require different parts of the headers.</p>

<p>Again, let's tackle them in order.</p>

<h4 id="request-target"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#request-target"><code>(request-target)</code></a></h4>

<p>This means the method of the request and the target it was sent to.  In our example, this is a <code>POST</code> sent to the path <code>/inbox</code>.</p>

<h4 id="host"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#host"><code>host</code></a></h4>

<p>This is the HTTP host the message was sent to.  This should be retrieved from the server, not taken from the sent headers.</p>

<h4 id="date-digest-content-type"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#date-digest-content-type"><code>date digest content-type</code></a></h4>

<p>These are the values from the headers which were sent with the request.</p>

<h4 id="putting-it-all-together"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#putting-it-all-together">Putting it all together</a></h4>

<p>Annoyingly, the HTTP headers are written in Title-Case whereas the headers in the Signature are in lower-case. So some conversion is necessary:</p>

<pre><code class="language-php">//  Manually reconstruct the header string
$signatureHeaders = explode(" ", $signatureParts["headers"] );
$signatureString = "";
foreach ($signatureHeaders as $signatureHeader) {
    if ( "(request-target)" == $signatureHeader ) {
        $method = strtolower( $_SERVER["REQUEST_METHOD"] );
        $target = strtolower( $_SERVER["REQUEST_URI"] );
        $signatureString .= "(request-target): {$method} {$target}\n";
    } else if ( "host" == $signatureHeader ) {
        $host = strtolower( $_SERVER["HTTP_HOST"] );    
        $signatureString .= "host: {$host}\n";
    } else {
        //  In the HTTP header, the keys use Title Case
        $signatureString .= "{$signatureHeader}: " . $headers[ ucwords( $signatureHeader, "-" ) ] . "\n";
    }
}

//  Remove trailing newline
$signatureString = trim( $signatureString );
</code></pre>

<p>This results in a string like this:</p>

<pre><code class="language-_">(request-target): post /inbox
host: example.com
date: Sun, 25 Feb 2024 10:48:22 GMT
digest: SHA-256=Hqu/6MR2imi8DTzbNp5PNEAFSyk0poN7+x5F+Z4vZMg=
content-type: application/activity+json
</code></pre>

<h2 id="get-the-signature"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#get-the-signature">Get the signature</a></h2>

<p>The signature that we are sent is in Base64.</p>

<p><code>signature="P07V5I2zflR8FRsDMHshHmhgOwSkjWevujEbOyKMwjycrdVXjTD0ACiLuc5lTqDEXZ/...4eg=="</code></p>

<p>It needs to be decoded before we can use it.</p>

<pre><code class="language-php">$signature = base64_decode( $signatureParts["signature"] );
</code></pre>

<h2 id="verify-the-signature"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#verify-the-signature">Verify the signature</a></h2>

<p>We're nearly there!  Luckily, we don't have to do any crazy cryptography by hand. We use PHP's <a href="https://www.php.net/manual/en/function.openssl-verify"><code>openssl_verify()</code></a>:</p>

<pre><code class="language-php">//  Finally! Calculate whether the signature is valid
$verified = openssl_verify(
    $signatureString, 
    $signature, 
    $publicKey, 
    $algorithm
);
</code></pre>

<p>That takes the reconstructed string based on the headers, the signature which was sent, the public key we retrieved, and the algorithm.</p>

<p>If it all matches, it will return <code>true</code>.  If not... time for some debugging!</p>

<h2 id="but-what-about"><a href="https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/#but-what-about">But what about...?</a></h2>

<p>This is <em>not</em> a complete solution. My code almost certainly contains bugs, unforeseen edge-cases, memory leaks, black holes, and poisonous frogs.  This is intended to step you through the practical process of verifying an HTTP Message Signature.</p>

<p>Then you should get a properly tested and validated library and use that instead.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49733&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/02/a-simpleish-guide-to-verifying-http-message-signatures-in-php/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[HTTP Signature Infinite Loop?]]></title>
		<link>https://shkspr.mobi/blog/2024/02/http-signature-infinite-loop/</link>
					<comments>https://shkspr.mobi/blog/2024/02/http-signature-infinite-loop/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 26 Feb 2024 12:34:28 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[ActivityPub]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[fediverse]]></category>
		<category><![CDATA[http]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49728</guid>

					<description><![CDATA[I&#039;m trying to get my head round HTTP Signatures as they&#039;re used extensively in the Fediverse.  Conceptually, they&#039;re relatively straightforward.  You send me a normal HTTP request. For example, you want to POST something to https://example.com/data  You send me these headers:  POST /data Host: example.com Date: Sat, 24 Feb 2024 14:43:48 GMT Accept-Encoding: gzip Digest:…]]></description>
										<content:encoded><![CDATA[<p>I'm trying to get my head round <a href="https://www.rfc-editor.org/rfc/rfc9421.html">HTTP Signatures</a> as they're used extensively in the Fediverse.</p>

<p>Conceptually, they're relatively straightforward.</p>

<p>You send me a normal HTTP request. For example, you want to POST something to <code>https://example.com/data</code></p>

<p>You send me these headers:</p>

<pre><code class="language-_">POST /data
Host: example.com
Date: Sat, 24 Feb 2024 14:43:48 GMT
Accept-Encoding: gzip
Digest: SHA-256=aaC57TDzM0Wq+50We2TkCsdMDvdqON92edg7KI+Hk8M=
Content-Type: application/activity+json
Signature: keyId="https://your_website.biz/publicKey",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="JGQ53kEoIiMWRp9By9jajVGCOCu4n7XBeiA1uY5xLcnAxL2Y1GIgU/...=="
Connection: Keep-Alive
Content-Length: 751
</code></pre>

<p>In order to verify the contents of the message, I need to do three things:</p>

<ol>
<li>Check the SHA-256 hash of the message matches the content of the "Digest" header.</li>
<li>Check the timestamp is somewhat fresh.</li>
<li>Check the signature matches.</li>
</ol>

<p>The first is simple: <code>base64_encode( hash( "sha256", $request_body, true ) )</code>.</p>

<p>The second is a matter of opinion. I might be happy to receive messages from the distant past or far in the future. For the sake of a little clock drift, let's allow 60 seconds either way.</p>

<p>The third gets <em>complicated</em>.</p>

<p>First, I need to get the public key published at <code>keyId="https://your_website.biz/publicKey"</code>.</p>

<p>Next, I need to know which algorithm is being used to sign the headers: <code>algorithm="rsa-sha256"</code></p>

<p>Then, I need to know which headers - and in what order - are being signed: <code>headers="(request-target) host date digest content-type"</code></p>

<p>So I create a string using the received details which matches those headers in that specific order:</p>

<pre><code class="language-_">(request-target) POST /data
Host: example.com
Date: Sat, 24 Feb 2024 14:43:48 GMT
Digest: SHA-256=aaC57TDzM0Wq+50We2TkCsdMDvdqON92edg7KI+Hk8M=
Content-Type: application/activity+json
</code></pre>

<p>I can verify if the signature - <code>signature="JGQ53kEoIiMWRp9By9jajVGCOCu4n7XBeiA1uY5xLcnAxL2Y1GIgU/...=="</code> matches by:</p>

<pre><code class="language-php">openssl_verify(
    $headersString, 
    $signature, 
    $publicKey, 
    $algorithm
);
</code></pre>

<p>If that's <code>TRUE</code> then all is well.</p>

<p>But can you spot the implicit problem?</p>

<p><em>How</em> do I get your server's public key?</p>

<p>I just GET <code>https://your_website.biz/publicKey</code> - but if your server uses something like <a href="https://docs.joinmastodon.org/admin/config/#authorized_fetch">Authorised Fetch</a> then I have to sign my request to you.</p>

<p>Which means your server will need to validate my signature by obtaining my public key. Which it will get by signing a request and sending it to me. Which, before I return my public key, I will need to validate your signature by obtaining your public key. Which I will get by signing a request... and so on.</p>

<p>This <a href="https://www.w3.org/wiki/SocialCG/ActivityPub/Authentication_Authorization#Instance_actors">deadlock loop</a> is documented. The usual way around it is either for the <em>sending</em> server to <a href="https://socialhub.activitypub.rocks/t/authorized-fetch-and-the-instance-actor/3868">use an instance-specific signature</a> which can be retrieved by an unsigned request, or to allow any unsigned request to access a user's public key.</p>

<p>I get why things happen this way - I just wish it were easier to implement!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49728&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/02/http-signature-infinite-loop/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Sometimes gzip beats Brotli]]></title>
		<link>https://shkspr.mobi/blog/2023/08/sometimes-gzip-beats-brotli/</link>
					<comments>https://shkspr.mobi/blog/2023/08/sometimes-gzip-beats-brotli/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 09 Aug 2023 11:34:25 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[http]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46387</guid>

					<description><![CDATA[Perhaps this was obvious to you, but it wasn&#039;t to me. So I&#039;m sharing in the hope that you don&#039;t spend an evening trying to trick your webserver into doing something stupid.  For years, HTTP content has been served with gzip compression (gz). It&#039;s basically the same sort of compression algorithm you get in a .zip file. It&#039;s pretty good!  But there&#039;s a new(er) compression algorithm called Brotli…]]></description>
										<content:encoded><![CDATA[<p>Perhaps this was obvious to you, but it wasn't to me. So I'm sharing in the hope that you don't spend an evening trying to trick your webserver into doing something stupid.</p>

<p>For years, HTTP content has been served with gzip compression (gz). It's basically the same sort of compression algorithm you get in a .zip file. It's pretty good!</p>

<p>But there's a new(er) compression algorithm called <a href="https://datatracker.ietf.org/doc/html/rfc7932">Brotli</a> (br). It's Better, Faster, Stronger, Harder than gzip. Mostly.</p>

<p>Looking through my browser's request logs, I noticed everything was being transferred with Brotli compression <em>except</em> for one specific text file was being served as gz.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/Screenshot-from-2023-07-24-09-46-53.png" alt="Screenshot showing a transfer with the content-encoding as gzip." width="382" height="362" class="aligncenter size-full wp-image-46388">

<p>What's going on?</p>

<p>Well, let's take a look at the file's size.</p>

<p><code>curl -s "https://openbenches.org/api/benches.tsv" | wc -c</code></p>

<p>That downloads the file, counts the number of bytes, then formats it for readability.  It's 2,727,104 bytes.</p>

<p>Now let's request it as a gzipped file:</p>

<p><code>curl -s -H'Accept-Encoding: gzip' "https://openbenches.org/api/benches.tsv" | wc -c</code>
It's 1,085,372 bytes.</p>

<p>Finally, requesting a Brotli compressed transfer:
<code>curl -s -H'Accept-Encoding: br' "https://openbenches.org/api/benches.tsv" | wc -c</code></p>

<p>That's 1,0<strong>9</strong>8,151 bytes. A whole 12,779 bytes <em>larger</em>!</p>

<p>My server was correct in using gzipped rather than Brotli for this specific file.</p>

<p>But, that's not the entire case here! I manually compressed the full file using different compression levels. Here's a quick graph showing the filesize at different compression strengths:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/brotli-vs-gzip.png" alt="Graph showing how Brotli is a generally better algorithm, but at lower strengths it is outperformed by gzip's higher strengths." width="718" height="425" class="aligncenter size-full wp-image-46390">

<p>So, in this case, Brotli ≤ 3 is <em>worse</em> than gzip ≥ 5.</p>

<p>I suspect my host's server is configured to prioritise faster compression over absolutely smallest file size. That's probably a reasonable trade-off. I couldn't see a way to tell it to use a higher strength Brotli algorithm all the time - but I would probably be chasing marginal gains.</p>

<p>So, there you go. Don't be surprised if you occasionally see gzip where you expect to see Brotli.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46387&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/08/sometimes-gzip-beats-brotli/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Some new HTTP verbs]]></title>
		<link>https://shkspr.mobi/blog/2022/09/some-new-http-verbs/</link>
					<comments>https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 13 Sep 2022 11:34:17 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[internet]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43528</guid>

					<description><![CDATA[Hyper-Text Transfer Protocol is, by some measure, the most popular way for computers to talk to each other on the Internet.  Generally speaking, clients (like browsers) talk to servers using a set number of HTTP &#34;verbs&#34;. This tells the server what sort of thing the client is trying to do.  The two most popular verbs are probably POST - which lets you send data to a server - and  GET - which lets…]]></description>
										<content:encoded><![CDATA[<p>Hyper-Text Transfer Protocol is, by some measure, the most popular way for computers to talk to each other on the Internet<sup id="fnref:madeup"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fn:madeup" class="footnote-ref" title="I just made up that &quot;fact&quot;. But it feels right, doesn't it?" role="doc-noteref">0</a></sup>.</p>

<p>Generally speaking<sup id="fnref:complicated"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fn:complicated" class="footnote-ref" title="It is a lot more complicated than that. If you want to have a rant about precise definitions, please do so on your own blog." role="doc-noteref">1</a></sup>, clients (like browsers) talk to servers using a set number of HTTP "verbs". This tells the server what sort of thing the client is trying to do.</p>

<p>The two most popular<sup id="fnref:again"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fn:again" class="footnote-ref" title="I can't be bothered to actually back this up with statistics." role="doc-noteref">2</a></sup> verbs are probably <code>POST</code> - which lets you send data to a server - and  <code>GET</code> - which lets you get data back from a server.</p>

<p>There are <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods">other HTTP verbs</a> like <code>DELETE</code> to delete data, and <code>PATCH</code> to change data. But it is a fairly limited set of actions.</p>

<p>What would be some interesting or useful verbs to add to HTTP's vocabulary?</p>

<h2 id="payments"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#payments">Payments</a></h2>

<p>I think the most obvious one would be <code>BUY</code>.</p>

<p>A client sends a <code>GET</code> request to a server. The server responds with <a href="https://http.cat/402">HTTP Status <code>402</code> Payment Required</a> which includes payment details. The client sends <code>BUY</code> along with confirmation that they've sent the payment<sup id="fnref:buy"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fn:buy" class="footnote-ref" title="How? I dunno? A signed response from a payment provider? A crypto receipt? Something like that." role="doc-noteref">3</a></sup>. The server responds with the content.</p>

<h2 id="mistakes"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#mistakes">Mistakes</a></h2>

<p>What about if you make a mistake using <code>POST</code>, <code>PUT</code>, or <code>DELETE</code>? Wouldn't you like to use HTTP <code>UNDO</code>?</p>

<blockquote class="social-embed" id="social-embed-1562878651158257666" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1562875597050720258" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Your deepest wish comes true and you get to add one more HTTP Verb to the specification.<br><br>Which one do you choose?<hr class="social-embed-hr"><label for="poll_1_count">Buy: (6)</label><br><meter class="social-embed-meter" id="poll_1_count" min="0" max="100" low="33" high="66" value="12.5">6</meter><br><label for="poll_2_count">Forgive: (10)</label><br><meter class="social-embed-meter" id="poll_2_count" min="0" max="100" low="33" high="66" value="20.8">10</meter><br><label for="poll_3_count">Prevaricate: (20)</label><br><meter class="social-embed-meter" id="poll_3_count" min="0" max="100" low="33" high="66" value="41.7">20</meter><br><label for="poll_4_count">Something else - what?: (12)</label><br><meter class="social-embed-meter" id="poll_4_count" min="0" max="100" low="33" high="66" value="25.0">12</meter></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1562875597050720258"><span aria-label="3 likes" class="social-embed-meta">❤️ 3</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="2 reposts" class="social-embed-meta">🔁 2</span><time datetime="2022-08-25T18:52:33.000Z" itemprop="datePublished">18:52 - Thu 25 August 2022</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/chthonicionic" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRjADAABXRUJQVlA4ICQDAADQDQCdASowADAAPq1GnEmmI6KhLizIwBWJZQC9i7y3rEB0g+Oj7+0D6Z4iGQI4FcKKtBqvjyo/cChHkzveddeaY43ZcsdIuOmqa3Y2xJ26C7xefdq44K5rLBcuu0g2vx7p09PQQp/Vo5X4yG3Ra7ii8IALAyByAAD+BQLIY1tBXfK5PlIIX94Fs79p9t9Akb9B4PBc6TkCqSi/0zZui7QbeG5To/2dA27PUH2Fq6zaHkdRs2RXBld0pmjdS98qcZT8FTgTNBggjBO8IytPQIZPW2WyabL3IFcDupVwG1gxP02zCOzVnZZbMI56+UoqeSMsYrgc4tOYMM36AL7Vjyx/2MBTnsou/1RyWhHlH6CsxCQ7+peCyKB5nK2SZkQ8VZQRuKY+AIu7Hn2XfKZP/f8bUbMeMMyVqISMu6IZ9pjPJdqnhAnIZPXDVTYAEHSAhGOLny4h+ZShKG607ApeL/P3G3KVS+E2Kwkb8a5p3VpvJCaSgk0cIyvIicCEw2doHX6m7ynIZ/ll05dsGsic7GS957jHrujd0LTK629FrIQ+4H2DKxJXQCXbaK8kU6m8nX5xwtTfV8zdIhr+a69Y3AsbzO+E1huMSpo+vMnhJFsp7tJd6950FNLMhepj03Ev8CSbmoRvEyf4DVNa3CPo8PShQeAW+HigeJ9TVNoG4LRm8+jXWaW33PNx384aPJivGoQeOiOco9vg1pVUYkpEfXUuHAAXC5dAE72GhICVKshvJUF6M7UpAPPo2HB5jM8Bmrl57v8ls835reoCW6UrnwPLJIe4vDqs2sBMGWkux+pA00MIzsLj9do3PDpPgcyvmMR6e+xyjIcde0Z9A5F5mmxaiZ7qQpDnsvetoHaCmQSCGdD1Cn/UJV1BV27wPupVtCJYOXYlBD+tk0+V8+fqOUqNBdQIRW6fZMNbYeMR2Gw0ptYcTwPAPvnnDxmzsUMx543izdn9TixQPLr3O141r5SsFduS3CuPe1Adf76PL05pFHksFhKYyLcXebtJlAgEtkOsdvLw6OeN+5DGDWE6Gk1U2HIeG3B3rlRIKb3V49QTlcQAAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">ཀ།༨ཇ ་།་འ།སབཇའ</p>@chthonicionic</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1562875597050720258">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Possibly it’s forgive, but … UNDO</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/chthonicionic/status/1562878651158257666"><span aria-label="1 likes" class="social-embed-meta">❤️ 1</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-08-25T19:04:41.000Z" itemprop="datePublished">19:04 - Thu 25 August 2022</time></a></footer></blockquote>

<p>Let's not get in to a discussion about <a href="https://blog.mestwin.net/idempotent-methods-in-http/">idempotency</a><sup id="fnref:idempotent"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fn:idempotent" class="footnote-ref" title="FINE! Have a discussion about the implications. It bet it won't end in bloodshed." role="doc-noteref">4</a></sup></p>

<h2 id="halt-and-catch-fire"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#halt-and-catch-fire">Halt And Catch Fire</a></h2>

<p>Some CPUs have peculiar instructions which can be (ab)used to make them <a href="http://www.catb.org/jargon/html/H/HCF.html">self-destruct</a>. So why not extend that to HTTP⸮</p>

<p>&lt;https://twitter.com/whalecoiner/status/1562878271960002560&gt;</p>

<p>Remember that scene in <em>every</em> Star Trek movie where the captain shouts "Computer! Initiate self-destruct sequence. Confirmation code Heliotrope Banana Daguerreotype." Let's extend that so that clients can request that a (virtual?) machine shuts down.</p>

<h2 id="wont-you-please-please-help-me"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#wont-you-please-please-help-me">Won't you please <em>please</em> help me?</a></h2>

<p>APIs - and other services - are sometimes difficult to use. In the Linux<sup id="fnref:linux"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fn:linux" class="footnote-ref" title="…or as I’ve recently taken to calling it, GNU plus Linux…" role="doc-noteref">5</a></sup> world we just type <code>-h</code> or <code>--help</code> after every command and get some more-or-less useful help text.</p>

<p>So what about HTTP <code>HELP</code>? Return a machine- or human-readable document explaining what commands the server responds to. Pretty sure that'd be useful.</p>

<h2 id="who-are-you-who-who"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#who-are-you-who-who">Who are you? Who? Who?</a></h2>

<p>Cookies have gotten out of hand. And, frankly, they're a security disaster. Why should a server send a client a token to store? Let's reverse that with HTTP <code>REMEMBER</code>.</p>

<p>The client sends the server a suitably complex string and a validity period. The server is then compelled to remember the client's authorisation. Perfect<sup id="fnref:perfect"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fn:perfect" class="footnote-ref" title="I'm not sure this makes any more sense than doing it the cookie way. But, hey, that's what brainstorming is for!" role="doc-noteref">6</a></sup>!</p>

<p>And when you want to log out, an HTTP <code>FORGET</code> is easier than clearing your cookies. Imagine that, a log-out button in your browser which worked everywhere...!</p>

<h2 id="over-to-you"><a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#over-to-you">Over to you</a></h2>

<p>So, if you were made God-Emperor-For-Life of the IETF, which new HTTP verbs would you add?</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:madeup">
<p>I just made up that "fact". But it feels right, doesn't it?&nbsp;<a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fnref:madeup" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:complicated">
<p>It is a lot more complicated than that. If you want to have a rant about precise definitions, please do so on your own blog.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fnref:complicated" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:again">
<p>I can't be bothered to actually back this up with statistics.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fnref:again" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:buy">
<p>How? I dunno? A signed response from a payment provider? A crypto receipt? Something like that.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fnref:buy" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:idempotent">
<p>FINE! Have a discussion about the implications. It bet it won't end in bloodshed.&nbsp;<a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fnref:idempotent" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:linux">
<p>…or as I’ve recently taken to calling it, GNU plus Linux…&nbsp;<a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fnref:linux" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:perfect">
<p>I'm not sure this makes any more sense than doing it the cookie way. But, hey, that's what brainstorming is for!&nbsp;<a href="https://shkspr.mobi/blog/2022/09/some-new-http-verbs/#fnref:perfect" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43528&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/09/some-new-http-verbs/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Why Does Twitter Think Facebook is Swedish?]]></title>
		<link>https://shkspr.mobi/blog/2015/01/why-does-twitter-think-facebook-is-swedish/</link>
					<comments>https://shkspr.mobi/blog/2015/01/why-does-twitter-think-facebook-is-swedish/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 02 Jan 2015 12:10:36 +0000</pubDate>
				<category><![CDATA[usability]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=20403</guid>

					<description><![CDATA[I&#039;ve nothing against the Swedes. Lovely people. Sweden is the third-largest country in the European Union by area. But I&#039;m not from there. Neither, as far as I am aware, is Facebook.  But Twitter seems to think so.  When I share a link to Twitter on Facebook, this (sometimes) happens.    And sometimes, I get this delightfully mangled Unicode atrocity!    So, what&#039;s going on?  When Facebook wants…]]></description>
										<content:encoded><![CDATA[<p>I've nothing against the Swedes. Lovely people. Sweden is the third-largest country in the European Union by area. But I'm not from there. Neither, as far as I am aware, is Facebook.</p>

<p>But Twitter seems to think so.</p>

<p>When I share a link to Twitter on Facebook, this (sometimes) happens.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/10/Twitter-Swedish-fs8.png" alt="Twitter-Swedish-fs8" width="709" height="395" class="aligncenter size-full wp-image-11176">

<p>And sometimes, I get this delightfully mangled Unicode atrocity!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/10/Twitter-Swedish-Unicode-fs8.png" alt="Twitter-Swedish-Unicode-fs8" width="709" height="663" class="aligncenter size-full wp-image-11169">

<p>So, what's going on?</p>

<p>When Facebook wants to display a link, its servers send a quick web request to the URL that the user has typed into the box. When Twitter receives that request, it looks at where it has come from and tries to localise its content.</p>

<p>If you're a German, you probably want the Twitter website to be in German. That's fairly sensible. But when you receive a request from one country on behalf of another, what should you do?</p>

<p>Here are the headers which Facebook sends with every request.</p>

<pre>User-Agent: facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
Accept: */*
Accept-Encoding: deflate, gzip
Range: bytes=0-524287
Host: example.com
Connection: keep-alive
IP: 31.13.110.120</pre>

<p>That IP address, according to most geolocation databases, <a href="https://web.archive.org/web/20150418235324/http://geomaplookup.net/?ip=31.13.110.120">is from Ireland</a> - however some <a href="http://www.ip2location.com/demo/31.13.110.120">list it as being Swedish</a>.</p>

<p>Twitter is, arguably, doing the right thing here. They're seeing an IP from Sweden, and serving it up a Swedish page.</p>

<p>Yes, their IP database is out of date, but even if it wasn't I'm not sure everyone on Facebook want to be reading in <a href="https://en.wikipedia.org/wiki/Irish_language">Gaeilge</a> or English.</p>

<p>Facebook knows what language the user speaks. It really ought to be including the <a href="https://www.w3.org/International/questions/qa-accept-lang-locales">HTTP "Accept-Language" header</a> in its requests.</p>

<p>It's really easy! All that HTTP request needs is:</p>

<pre>Accept-Language: en-gb;q=0.8, en;q=0.7</pre>

<p>That means "I want British English, but I'll accept any other form of English".</p>

<p>Hey presto! Twitter will see a request from Sweden / Ireland and rather than dumbly looking at the IP will make an intelligent choice based on the user's language preferences as determined by Facebook.</p>

<p>I spoke to someone informally at Facebook about this.  They claimed that this is a user privacy measure.  Facebook sending your language preferences to a third party could be an unwanted invasion of privacy.  Personally, I think that's a load of rubbish.  Could an attacker send you a specially crafted link and find out that you secretly read Facebook in <a href="https://en.wikipedia.org/wiki/Pashto_language">Pashto</a>? Perhaps.  But because this doesn't happen all the time, I suspect it's just a piece of sloppy engineering.</p>

<p>As we say in Sweden, "Ibland användbarhet innebär att arbeta lite hårdare för att se till misstag i andra företags datorer påverkar inte dina användare negativt!"</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=20403&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2015/01/why-does-twitter-think-facebook-is-swedish/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Why Are @VirginMedia Hijacking My HTTP Connections?]]></title>
		<link>https://shkspr.mobi/blog/2014/11/why-are-virginmedia-hijacking-my-http-connections/</link>
					<comments>https://shkspr.mobi/blog/2014/11/why-are-virginmedia-hijacking-my-http-connections/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 19 Nov 2014 07:05:45 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[isp]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[virign]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=20040</guid>

					<description><![CDATA[It is a truth universally acknowledged, that an ISP in possession of a good Internet connection must be in want of a customer.  One would think that, in these capitalist times, ISPs would compete over who could provide the fastest speed, the best service, and the lowest price.  Sadly, in the UK, our ISPs seem to compete on who can be slightly less awful than each other.  Last night, I did what…]]></description>
										<content:encoded><![CDATA[<p>It is a truth universally acknowledged, that an ISP in possession of a good Internet connection must be in want of a customer.</p>

<p>One would think that, in these capitalist times, ISPs would compete over who could provide the fastest speed, the best service, and the lowest price.  Sadly, in the UK, our ISPs seem to compete on who can be <em>slightly</em> less awful than each other.</p>

<p>Last night, I did what many people normally do with their Internet connection.  I made an HTTP request to open a website.  Rather than receiving the site I had requested, I received this monstrosity from Virgin Media - my ISP.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/11/Virgin-Websafe-fs8.png" alt="Virgin Websafe" width="423" height="722" class="aligncenter size-full wp-image-20042">

<p>I really was baffled.  At first, I thought the site I was trying to reach had been blocked by the infallible British justice system.  This is what Virgin customers see when they try to access a site blocked by the Great Firewall of Cameron:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/11/Virgin-Blocked-fs8.png" alt="Virgin Blocked" width="423" height="722" class="aligncenter size-full wp-image-20041">

<p>I'd made several web requests during that session but, crucially, this was the first one that I had made over HTTP.  The rest had all been secured via HTTPS.  It wasn't even a salacious site I was visiting - unless <a href="http://www.dailydot.com/geek/barbie-engineer-book-girls-game-developers/">cultural criticism of Barbie</a> is too hot to handle nowadays.</p>

<p>Here's the thing though.  I've a number of devices in my house, all of which make HTTP requests.  My solar panels, my tablet, my TV, my radio, all chattering across the 'net on Port 80.  Any one of them could have had their session hijacked.  Perhaps they would have failed gracefully - perhaps not?</p>

<p>Perhaps some cheap piece of kit is sending usernames and passwords in plain text - now all that information has been redirected to my ISP.</p>

<p>I wasn't able to catch the exact exchange, nor the HTTP status code that redirected my session.  All I do know is that my ISP broke the trust that it has with me.  I pay Virgin to send and receive bits.  Nothing more, nothing less.  I don't want it interfering with my traffic outside the bounds of normal operations.</p>

<p>What next?</p>

<ul>
    <li>Sorry to interrupt you ordering from Pizza Hut - we'd really like you to try a slice from Dominos?</li>
    <li>Sorry to interrupt you listening via Pandora - we've done a deal with Spotify, so try that instead!</li>
    <li>Sorry to interrupt you placing an order with a new ISP - please give us another chance!</li>
</ul>

<p>Virgin send me an email with my bill.  They also post me endless leaflets asking me to upgrade to their TV service.  If they wanted to contact me about their new "Web Safe" system, they have ample opportunities to do so without monkeying around with the service that I'm actually paying for!</p>

<p>This sort of session hijacking is... I struggle to adequately describe it.  Disgraceful is probably the word that comes closest.  It is a Man In The Middle (MITM) attack.  It <a href="http://www.legislation.gov.uk/ukpga/1990/18/section/3">impairs the operation of my computer</a>.  It's just <em>rude!</em></p>

<p>And, the icing on the cake, Web Safe <em>isn't very good</em>.</p>

<p>There's a <a href="http://community.virginmedia.com/t5/Switched-On-Families/block-gambling-betting-sites-nothing-else/td-p/2405823">plaintive thread on Virgin Media's community forums asking for help with Web Safe</a>:</p>

<blockquote><p>is there a way to block only on-line betting/gambling sites i.e. make it impossible for anyone in the house to gamble away real money ?

</p><p>I don't see any obvious solution on the f-secure or the web safe pages.</p></blockquote>

<p>I don't want to filter my connection - but I appreciate that some people want to place limits in order to protect themselves.  Web Safe can't do that.  You can only opt out of sex, drugs, and <del>rock'n'roll</del> crime.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/11/Virgin-Web-Safe-Options-fs8.png" alt="Virgin Web Safe Options" width="833" height="359" class="aligncenter size-full wp-image-20046">

<h2 id="why-is-virgin-media-doing-this"><a href="https://shkspr.mobi/blog/2014/11/why-are-virginmedia-hijacking-my-http-connections/#why-is-virgin-media-doing-this">Why is Virgin Media doing this?</a></h2>

<blockquote><p>As part of our commitment to the UK government's initiative to improve child safety online, we're giving all our customers the chance to decide if they want to switch on Web Safe, our suite of parental controls.

</p><p>From October until December, you will occasionally be redirected to a branded Virgin Media web page when you're browsing the web.

</p><p>Please watch out for any other pages claiming to encourage you to switch on parental controls during this period, as these will not be from us, and may put your online security at risk.

</p><p><cite>From <a href="http://store.virginmedia.com/discover/broadband/security/web-safe-notice.html">Virgin Web Safe FAQs.</a></cite>
</p></blockquote>

<p>Yup, Call-Me-Dave and Theresa May-Not have decided that we aren't sufficiently puritanical in our online browsing.  Despite their hectoring and scaremongering, <a href="http://thedrum.com/news/2014/07/23/most-households-opt-out-david-camerons-porn-filter">fewer than 15% of households have switched on the censorship software</a>.</p>

<p>Even the language of it leaves me crawling with horror.  "There are some things online that you might not want your family to see" is reminiscent of the <a href="http://en.wikipedia.org/wiki/Mervyn_Griffith-Jones">Lady Chatterly trial</a>'s infamous "Is it a book that you would even wish your wife or your servants to read?"</p>

<p>Let me briefly enumerate some of the many ways that Web Safe is a bad idea.</p>

<ul>
    <li>It only works on your domestic connection. If you - or your wife - wants to get around it, switch off WiFi and use mobile data instead.</li>
    <li>As mentioned above, it's now an extra vector for web criminals to phish for your details.</li>
    <li>The risk of false positives - Virgin Media has a <a href="https://my.virginmedia.com/my-apps/websafe/feedback">page where you can tell them</a> that they've over-zealously blocked an innocent page - <a href="https://www.openrightsgroup.org/blog/2014/blockedproject">such as a church</a>.</li>
    <li>The risk of false negatives - if you believe that Virgin Media are doing their job, you may believe that you are surfing encased in a cyber-condom and are completely free from the risks of infection.</li>
    <li>It fundamentally alters the relationship between the subscriber and the ISP. It allows them to pro-actively censor material that you request.</li>
    <li>By demonstrating their ability to hijack your browsing sessions - because the Government asked them nicely - it shows that they take no interest in standing up for the rights of their customers.</li>
    <li>It equates the free expression of sexuality with violence, hate, and criminal activity.  If your house contains a person who is confused about their sexuality - <a href="https://web.archive.org/web/20150419043743/https://tommorris.org/posts/2540">cutting off their chance to understand what's happening to them is barbaric</a>.</li>
    <li>It's likely that these filters will also <a href="http://www.theregister.co.uk/2013/12/16/internet_censorship_twitter_campaign_pr0n/">block sexual health charities</a>.  That's probably a bad thing, right?</li>
</ul>

<p>Web Safe is a rotten product which is being foisted upon users in a manner which is unbecoming of a decent ISP.</p>

<p>If you want to stop the government pushing more censorship and control onto the Internet, please <a href="https://www.openrightsgroup.org/join/">join the Open Rights Group</a>.</p>

<blockquote class="social-embed" id="social-embed-534804757698080768" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Dear <a href="https://twitter.com/virginmedia">@virginmedia</a>, don't hijack my HTTP sessions. It is incredibly rude, potentially dangerous, &amp; an abuse of trust. <a href="https://twitter.com/edent/status/534804757698080768/photo/1">pic.x.com/ak0sr7mxvw</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/B2wCF-hIMAA3mXt.png" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/534804757698080768"><span aria-label="13 likes" class="social-embed-meta">❤️ 13</span><span aria-label="5 replies" class="social-embed-meta">💬 5</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2014-11-18T20:26:05.000Z" itemprop="datePublished">20:26 - Tue 18 November 2014</time></a></footer></blockquote>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=20040&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2014/11/why-are-virginmedia-hijacking-my-http-connections/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Path - Privacy & Security Problems]]></title>
		<link>https://shkspr.mobi/blog/2012/01/path-privacy-security-problems/</link>
					<comments>https://shkspr.mobi/blog/2012/01/path-privacy-security-problems/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 16 Jan 2012 11:19:43 +0000</pubDate>
				<category><![CDATA[mobile]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssl]]></category>
		<guid isPermaLink="false">http://shkspr.mobi/blog/?p=5261</guid>

					<description><![CDATA[I&#039;m trying out the new Android app for Path - the new social networking service.  I&#039;ve discovered something rather troubling...  Most of the app&#039;s communication with the Path servers is over SSL.  This means that no-one can see the data you&#039;re sending and receiving.  If there are snoops on your network, they will only be able to see the encrypted data flowing back and forth.  In general, this is…]]></description>
										<content:encoded><![CDATA[<p>I'm trying out the new Android app for Path - the new social networking service.  I've discovered something rather troubling...</p>

<p>Most of the app's communication with the Path servers is over SSL.  This means that no-one can see the data you're sending and receiving.  If there are snoops on your network, they will only be able to see the encrypted data flowing back and forth.  In general, this is a good thing.</p>

<p>Apart from images.  If your friends are posting images, they are sent over http.  <strong>No security</strong>.  Anyone monitoring your network connection will be able to see all the images you're viewing.</p>

<p>Now, that's bad enough - but it turns out that all the images you <em>send</em> are visible to the the world even if you've set your post to private.</p>

<p>The images are sent over SSL, but as soon as you return to your "Path", a thumbnail is shown of what you've just posted!</p>

<p>Here's a picture of the logs, so you can see what's happening.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2012/01/path-ssl.png" alt="path ssl" title="path ssl" width="600" height="339" class="aligncenter size-full wp-image-5262">

<p>So, every image you post or see - including the avatars of your friends - are visible to all.  A rather serious security and privacy problem.</p>

<p>Oh, does anyone know what the unencrypted call to "sendgrid.net" is all about?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=5261&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2012/01/path-privacy-security-problems/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
