diff --git a/src/allmydata/test/web/test_web.py b/src/allmydata/test/web/test_web.py index e7c309d99..b285cd01e 100644 --- a/src/allmydata/test/web/test_web.py +++ b/src/allmydata/test/web/test_web.py @@ -782,10 +782,25 @@ class MultiFormatPageTests(unittest.TestCase): class Web(WebMixin, WebErrorMixin, testutil.StallMixin, testutil.ReallyEqualMixin, unittest.TestCase): + maxDiff = None + def test_create(self): pass - maxDiff = None + def test_frame_options(self): + """ + All pages deny the ability to be loaded in frames. + """ + d = self.GET("/", return_response=True) + def responded(result): + _, _, headers = result + self.assertEqual( + [b"DENY"], + headers.getRawHeaders(b"X-Frame-Options"), + ) + d.addCallback(responded) + return d + def test_welcome_json(self): """ There is a JSON version of the welcome page which can be selected with the diff --git a/src/allmydata/webish.py b/src/allmydata/webish.py index d1a60f495..bd404bbd4 100644 --- a/src/allmydata/webish.py +++ b/src/allmydata/webish.py @@ -49,6 +49,10 @@ class MyRequest(appserver.NevowRequest): self.client = self.channel.transport.getPeer() self.host = self.channel.transport.getHost() + # Adding security headers. These will be sent for *all* HTTP requests. + # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options + self.responseHeaders.setRawHeaders("X-Frame-Options", ["DENY"]) + # Argument processing. ## The original twisted.web.http.Request.requestReceived code parsed the