防止网址中的跨网站请求伪造

时间:2013-06-08 18:21:21

标签: php security csrf

我认为我理解CSRF以及如何使用表单键可以防止这种情况,但这只对来自表单的POST数据有用,对吧?在我的网站中,我让登录用户通过单击删除按钮删除一些项目,删除按钮将它们发送到delete.php?id = {item_id}。

在delete.php上,我检查项目是否属于用户,如果是,则脚本将其删除。 如何阻止其他网站发布链接,如www.mysite.com/delete.php?id=3。我知道攻击者必须在我的情况下猜测id。

但总的来说,如何在URL中为GET数据或数据停止CSRF?

使用img标记或锚标记进行CSRF的攻击者与获取和发布数据的关系如何?

非常感谢您提前,我将非常感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

$_POST$_GET之间预期差异的一个很好的例子。 $_GET应该用于读取数据,而$_POST应该用于对其进行操作。您可以使用带有一个提交按钮的表单,而将您的令牌用作隐藏输入,而不是链接。如果需要,您甚至可以使用CSS将按钮设置为类似链接的样式。

答案 1 :(得分:1)

扩展我的评论,

假设您正在使用cookie /会话来跟踪用户登录。简单地再次使用哈希值md5,让它成为您的确认。

if (isset($_GET['delete'] && md5($_COOKIE["PHPSESSID"])==$_GET['confirm'])) {
    //delete something
}

然后,对于HTML,您可以声明:

<a href="www.mysite.com/delete.php?id=3&confirm=<?php echo md5($_COOKIE["PHPSESSID"]);?>">Delete</a>