1

我已经阅读了一些关于拒绝跨域请求的问题,但都只是声明依赖客户端保护(同源策略)。是否有任何可以在服务器端完成的保护层?我应该依赖 header-origin、header-referer 吗?有人说 header referer get 被一些反间谍软件程序修改。有人说 ff doesint 包括 origin 标头选项(但确实如此),有人说 chrome 不包括等等 :) 。
我知道可以修改标头(即使使用 setrequestheader 方法也可以修改引用者),但是,如果您曾经为此做过任何保护服务器端,请分享任何想法。

PS:一种可能性是标记每个请求(所有类型的请求,仅获取数据的请求,更改服务器上数据的请求等),但这将是一个痛苦的屁股......

PPS:天哪,不要发送关于同步器令牌模式的垃圾邮件......正如我在第一篇 PS 中所说的那样,这将是一个解决方案,还有其他想法吗?

4

2 回答 2

0

市长的问题是您要保护哪种攻击?

如果您想防止 CSRF,那么您需要带有随机安全令牌的流程表单。

<input type="hidden" name="token" value="random value generated on server side for each request" />

提交表单后,您需要比较请求中的令牌和存储在服务器端会话中的令牌。

如果您想拒绝从其他域加载某种资源(例如从您的服务器加载 evil.com 上的图像或脚本),那么您可以向每个资源添加类似的令牌。

<img src="/images/mysuperimg.png?token=<token>" />

等等

于 2012-04-05T07:10:30.747 回答
0

我想你听说过CSRF吗?

这是 CSRF 的工作原理以及如何防止它的概述:

任何人都可以从您的网站请求页面,就像任何人也可以在您的网站上发布一样。假设您有一个注册表单。可以复制您的表单,并放入任何 HTML 页面,删除 JS 验证,并无限地向您发送垃圾邮件。听起来像是威胁对吧?

但是,您可以通过使用会话 ID 来防止这种情况。这是一个唯一的字符串(通常是 MD5 或 SHA-1),在呈现页面之前存储在 PHP 中的会话变量中。此会话 ID 也会在您的表单上以隐藏的输入表单呈现。现在,当提交表单时,PHP 会检查随表单发送的会话 id 是否与存储在会话变量中的会话 id 匹配。如果它是有效的,你继续,并且存储在服务器中的那个被取消,这样它就不会被重用。

此外,如果某个时间已经过去,则该会话 ID 应该过期。因此,假设用户在表单上停留的时间超过 15 分钟。使用该表格将是无效的。您必须刷新页面才能获得新的会话 ID


现在您可能会问如何在页面请求而不是表单上使用它?

我知道通过 cookie 将会话ID 发送到服务器的 2 种方法,或者通过在 url 中附加您的会话 ID。

对于 cookie,它的工作方式相同。如果您的页面是由您的服务器生成的,则该页面会在您的服务器上创建会话 id 并将副本作为 cookie 发送。下一页请求,您读取请求的cookie,获取它的会话ID,与服务器上的比较,如果相等,则请求有效,您继续。否则无效。

对于禁用 cookie 的用户,您可以在页面上每个链接的 url 中附加 sessionid。请注意,在某些网站上,它们有一个 url 参数sidsessid等等?他们就是这样通过的。您页面中的每个链接都将附加此 ID。单击链接后,服务器所做的就是从 url 获取该会话 id,并将其与服务器进行比较。

很长的答案:D

于 2012-04-05T07:34:36.643 回答