保护形式劫持黑客

时间:2010-12-25 20:44:30

标签: php html csrf-protection

是的,你好今天我发现了我网站的黑客攻击。

当你在用户墙上(在我的社区网站上)写一个msg时,它会运行一个ajax调用,将msg插入数据库,然后成功滑下并显示它。

没问题就行得很好。

所以我正在重新思考,我正在使用POST方法,如果它是GET方法你可以轻松做到吗?msg = haxmsg& usr = 12345679。但你怎么能绕过POST方法呢?

我制作了一个新的html文档,制作了一个表单并在操作中设置了“site.com/insertwall.php”(通常在ajax中使用的文件),我创建了一些输入字段,其名称与我完全相同使用ajaxcall(msg,uID(userid),BuID(通过userid))并提交了一个提交按钮。

我知道我有一个page_protect()函数需要你登录,如果你不是,你将成为index.php的标题。所以我登录(在我的site.com上启动会话)然后我按下了这个提交按钮。然后我在我的网站上看到它发了一条新消息。

我就像哇,劫持POST方法是如此容易,我想也许它更安全一些。

我想知道如何防止这种劫持?因为我甚至不想知道真正的黑客可以用这个“洞”做什么。 page_protect确保会话来自同一个http用户代理,所以,这样工作正常(试图在没有登录的情况下运行表单,它只是将我标题为startpage)但是你不会花很长时间才能找到登录首先运行它。

任何建议都很受欢迎。我想尽可能保持我的ajax调用最安全,并且所有调用都在POST方法上运行。我可以对insertwall.php做什么,检查它是来自服务器还是什么......

谢谢

2 个答案:

答案 0 :(得分:4)

此漏洞称为跨站点请求伪造(CSRF)。 您必须在表单中添加随机标记值(隐藏输入)。

$_SESSION['token'] = md5(rand()); //example
//ur code
if($_SESSION["token"] != $_POST["token"]){
    echo 'Invalid Request!';
}
else{
    //action
}

答案 1 :(得分:1)

根据您的评论...

服务器外的任何内容都无法控制。您必须在服务器的边界定义要放入的内容,而不是在浏览器中定义。

因此,例如,如果您想让人们发送消息,那么您必须在服务器上施加您想要施加的任何限制(仅登录用户,仅限于朋友,仅在月亮打蜡时等)。

您发送到浏览器的内容可以被视为与您的API交互的应用程序。人们可能会以您不期望的方式与您的API进行交互,但如果您的所有安全性都由服务器处理,那么您就是安全的。

(直到我们讨论中间人的主题,在这种情况下查看CSRF prevention并使用SSL加密)