允许获取请求但仅限于我的域名?

时间:2010-02-11 04:09:12

标签: security http cookies post web

在我的网站上,我可以使用GET请求触发某些内容,例如隐藏或删除评论的功能。我不是很担心,但如果有人使用img src = url设计攻击来删除评论或电子邮件,那将会非常烦人。有办法防止这种情况吗?

我使用httponlycookies作为登录数据。如果有人提出img src或变体请求提交有效的登录cookie?我应该使用POST吗? POST会减慢网站的速度吗?有很少的cookie,所以浏览器可以提交cookie和POST一个数据包,但我不知道POST和cookie是否必须分开。

所有这些答案似乎都有其他问题需要考虑。所以我会把它变成一个wiki,这样人们可以更多地了解而不是看着接受的答案。

4 个答案:

答案 0 :(得分:3)

你在这里混淆了几个常见问题。

首先,其他人所说的攻击被称为伪造的跨站请求。可能会导致来自其他域的GET或POST,并且因为请求将转到您的域,它将传递您的域的Cookie,其中包含会话详细信息。

要解决此问题,当用户登录时,会生成一个令牌(一些随机字符串),表示您网站上的所有链接和表单都会在该会话期间传回。当请求进入时,从cookie中获取会话详细信息,并查找该会话应该为哪个令牌添加/发布。如果尚未传递正确的令牌,则可以忽略该请求/通知用户/日志详细信息以进行进一步调查。我推荐最后一个,因为在实现这个时你可能会错过一些链接或表单,这些链接或表单将无效。用户可能只是离开而不是花时间通知您。

其次,GET请求应该是安全的(即只是导致数据显示而不进行任何更改),并且POST应该用于所有数据更改请求。首先,万一蜘蛛设法跟踪链接,导致蜘蛛不应该造成的变化。其次,作为刷新页面的用户的备份 - 浏览器应该提醒他们他们将重新提交请求并且他们想要继续。我说作为备份,因为所有请求都应该以这样的方式编写,即如果重新提交它们是无害/忽略的,即没有请求删除最后一项的按钮,而是查找最后一项的id是1423并且具有删除1423的按钮请求;如果提交两次,那么第二次验证时应注意到项目1423不再存在并且不会导致进一步的更改。

答案 1 :(得分:1)

  

我应该使用POST吗?会POST   减慢网站速度?有很多   浏览器可能提交的小饼干   一个数据包的cookie和POST   但是我不知道POST和   饼干必须是单独的。

是的,最好在您的情况下使用POST来降低安全风险。并且不赞成速度超过安全性,使用POST和是的帖子和cookie不会相互冲突。

最后,我建议您选择 html purifier ,以确保您的网址和表单安全。

答案 2 :(得分:1)

您正在讨论的风险被称为跨站点请求伪造攻击。防止它的标准方法是双重发布cookie(一次在cookie中,一次在表单中),或者攻击者无法通过包含的图像猜测的其他一些唯一令牌。有关检测和预防的更多详细信息,请参阅:

http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

答案 3 :(得分:1)

我主要同意status203。除了他所说的POST没有真正帮助之外,还有几点意见:

1)只有正确编写应用程序,GET才是安全的。我见过使用GET甚至进行更改的应用程序。其次,在这个主题上,如果您将JSON数据作为数组返回并且您的入口点不受CSRF保护,则在某些浏览器上,攻击者可能会通过诱骗受害者访问具有< script src =“{{的网站来窃取受害者的数据。 3}};然后重写数组构造函数。

2)其次,虽然在参数中有随机的东西,然后检查会话中存储的内容,但是如果你没有会话(例如你有数百台服务器并且不想服用点击查询DB)。因此,一种替代方案是将MD5(session_cookie)包括为CSRF令牌。这允许您在不使用数据库和攻击者的情况下进行验证,而无需XSS无法获取session_cookie,因此无法构造令牌。请注意,我不建议使用session_cookie本身作为令牌,因为它会产生更糟糕的问题 - 当referrer泄露或隐藏表单字段时,如果页面已保存。