我已经阅读了一些有关拒绝跨域请求的问题,但所有人都只是依赖于客户端保护(同源策略)。服务器端是否有任何保护层?我应该依赖于header-origin,header-referer?有人说标题引用被某些反间谍程序修改了。有人说ff不包括原始标题选项(但它确实如此),有人说chrome不等等:) 我知道标题可以修改(即使使用setrequestheader方法也可以修改引用),但是,如果您曾为此事做过任何保护服务器端,请分享任何ideeas。
P.S。 :一种可能性是标记每个请求(所有类型的请求,仅获取数据的请求,更改服务器上的数据的请求等),但这将是一个痛苦... ...
P.P.S。 :omg不会发送有关同步器令牌模式的垃圾邮件......正如我在第一篇中所说的那样。是的,这将是一个解决方案,任何其他想法?
答案 0 :(得分: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>" />
等
答案 1 :(得分:0)
我想你听说过CSRF?
这里概述了CSRF的工作原理及其防范方法:
任何人都可以从您的网站请求网页,就像任何人都可以在您的网站上发布POST一样。假设您有一份注册表。可以复制您的表单,并放入任何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或通过在网址中附加您的会话ID来实现。
对于cookie,它的工作方式相同。如果您的页面是由服务器生成的,则该页面会在您的服务器上创建会话ID,并将副本作为cookie发送。下一页请求,您读取请求的cookie,获取它的会话ID,与服务器上的那个进行比较,如果相等,请求有效,您继续。否则,它无效。
对于已禁用Cookie的用户,您可以将sessionid附加到页面上每个链接的网址中。请注意,在某些网站上,他们的网址参数为sid
或sessid
,依此类推?这就是他们如何通过它。您网页中的每个链接都会附加此ID。点击链接后,所有服务器都会从网址获取该会话ID,并将其与服务器进行比较。
很长的回答:D