【问题标题】:How to protect against cross domain http requests? (server side)如何防止跨域http请求? (服务器端)
【发布时间】:2012-04-18 21:45:48
【问题描述】:

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

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

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

【问题讨论】:

  • 会话管理是防止跨域请求的好方法。
  • @scuzzy 请更具体一些。

标签: php http cross-domain


【解决方案1】:

我想你听说过CSRF

以下是 CSRF 工作原理及其预防方法的概述:

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

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

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


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

我知道2 ways to send over session ids to the server,这是通过 cookie 或通过在 url 中附加您的 sessionid。

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

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

很长的答案:D

【讨论】:

  • 你的长答案 :) 添加了 P.P.S. :)
【解决方案2】:

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

如果您想防止 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>" />

等等

【讨论】:

  • 你的答案 :) 添加了 P.P.S. :P
猜你喜欢
  • 2018-03-02
  • 2017-06-06
  • 1970-01-01
  • 2011-09-27
  • 2018-12-05
  • 1970-01-01
  • 2015-07-25
  • 2014-07-23
  • 1970-01-01
相关资源
最近更新 更多