1

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

当您在用户墙上(在我的社区站点中)写一条消息时,它会运行一个 ajax 调用,将消息插入数据库,然后在成功时向下滑动并显示它。

工作正常没有问题。

所以我重新思考了一下,我为此使用 POST 方法,如果它是 GET 方法,您可以轻松地执行 ?msg=haxmsg&usr=12345679。但是你能做些什么来绕过 POST 方法呢?

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

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

我就像哇,劫持 POST 方法这么容易吗?我想它可能更安全一些。

我想知道我能做些什么来防止这种劫持?因为我什至不想知道真正的黑客可以用这个“洞”做什么。page_protect 确保会话来自同一个 http 用户代理等,这可以正常工作(尝试在不登录的情况下运行表单,它只是将我引导到起始页)但是不需要很长时间才能弄清楚登录首先然后运行它。

任何建议都非常感谢。我想让我的 ajax 调用尽可能安全,并且它们都在 POST 方法上运行。我可以对 insertwall.php 做什么,以检查它是否来自服务器或其他东西..

谢谢

4

2 回答 2

4

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

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

于 2010-12-25T23:21:40.920 回答
1

根据您的评论...</p>

您的服务器之外的任何东西都在您的控制之外。您必须在服务器的边界而不是在浏览器中定义要允许的内容。

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

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

(直到我们谈到中间人的主题,在这种情况下,研究CSRF 预防和 SSL 加密)

于 2010-12-25T21:00:31.887 回答