是的,你好今天我发现了我网站的黑客攻击。
当你在用户墙上(在我的社区网站上)写一个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做什么,检查它是来自服务器还是什么......
谢谢
答案 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加密)