我认为我理解CSRF以及如何使用表单键可以防止这种情况,但这只对来自表单的POST数据有用,对吧?在我的网站中,我让登录用户通过单击删除按钮删除一些项目,删除按钮将它们发送到delete.php?id = {item_id}。
在delete.php上,我检查项目是否属于用户,如果是,则脚本将其删除。 如何阻止其他网站发布链接,如www.mysite.com/delete.php?id=3。我知道攻击者必须在我的情况下猜测id。
但总的来说,如何在URL中为GET数据或数据停止CSRF?
使用img标记或锚标记进行CSRF的攻击者与获取和发布数据的关系如何?
非常感谢您提前,我将非常感谢您的任何建议。
答案 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>