2015年5月20日 星期三

Frame Hijacking 防止其他站台用Frame包住自家的網站

建立簡單的三個站台

w1.aaa.com
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="w1._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            w1
        </div>
    </form>
</body>
</html>

w2.bbb.com
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="w2._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            w2
        </div>
        <br />
        <div>
            <iframe src="http://w1.aaa.com" />
        </div>
    </form>
</body>
</html>


w3.ccc.com
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="w3._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            w3
        </div>
        <br />
        <div>
            <iframe src="http://w1.aaa.com" />
        </div>
    </form>
</body>
</html>


在w2和w3這兩個站台中,都可以用iframe把w1給包進來

在w1站台中加入一個全域header
<?xml version="1.0" encoding="utf-8"?>
<!--
  如需如何設定 ASP.NET 應用程式的詳細資訊,請造訪
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>

    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
    </system.web>

    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="X-Frame-Options" value="SAMEORIGIN" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>

</configuration>

w2和w3就不能用frame包住w1了

改用Content-Security-Policy
需要注意網站的通訊協定,如果有http和https的差別,就需要把通訊協定也明確指出
<?xml version="1.0" encoding="utf-8"?>
<!--
  如需如何設定 ASP.NET 應用程式的詳細資訊,請造訪
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>

    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
    </system.web>

    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Content-Security-Policy" value="frame-ancestors 'self' http://w2.bbb.com" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>

</configuration>

就可以指定特定的站台可以用frame包住w1