我正在遇到有关Rails中的Authenticity Token的一些问题,因为我现在已经多次了.
但我真的不想只是解决这个问题而继续下去.我真的很想了解真实性令牌.那么,我的问题是,您是否有关于此主题的完整信息来源,或者您是否会花时间在此详细解释?
我试图了解CSRF的整个问题以及预防它的适当方法.(资源我已阅读,理解并同意:OWASP CSRF预防报告表,关于CSRF的问题.)
据我了解,CSRF的漏洞是通过假设(从网络服务器的角度来看)传入HTTP请求中的有效会话cookie反映经过身份验证的用户的意愿而引入的.但是,原始域的所有cookie都被浏览器神奇地附加到请求上,因此实际上所有服务器都可以通过请求中存在的有效会话cookie来推断该请求来自具有经过身份验证的会话的浏览器; 它无法进一步假设该浏览器中运行的代码,或者它是否真正反映了用户的意愿.防止这种情况的方法是在请求中包含其他身份验证信息("CSRF令牌"),这些信息由浏览器的自动cookie处理以外的某些方式携带.然后,松散地说,会话cookie验证用户/浏览器,并且CSRF令牌验证在浏览器中运行的代码.
简而言之,如果您使用会话cookie来验证Web应用程序的用户,您还应该为每个响应添加一个CSRF令牌,并在每个(变异)请求中要求匹配的CSRF令牌.然后,CSRF令牌从服务器到浏览器进行往返回服务器,向服务器证明发出请求的页面是由该服务器批准(甚至由该服务器生成).
关于我的问题,这是关于在该往返中用于该CSRF令牌的特定传输方法.
看起来很常见(例如在AngularJS,Django,Rails中)将CSRF令牌从服务器发送到客户端作为cookie(即在Set-Cookie头中),然后让客户端中的Javascript将其从cookie中删除并附加它作为单独的XSRF-TOKEN标头发送回服务器.
(另一种方法是由例如Express推荐的方法,其中由服务器生成的CSRF令牌通过服务器端模板扩展包含在响应主体中,直接附加到将其提供回服务器的代码/标记,例如作为一个隐藏的表单输入.这个例子是一个更多的Web 1.0-doh的做事方式,但是可以很好地推广给更多JS的客户端.)
为什么使用Set-Cookie作为CSRF令牌的下游传输是如此常见/为什么这是一个好主意?我想所有这些框架的作者都仔细考虑了他们的选择,并没有弄错.但乍一看,使用cookie解决基本上对cookie的设计限制似乎很愚蠢.实际上,如果您使用cookie作为往返传输(Set-Cookie:服务器的下游标头告诉浏览器CSRF令牌,而Cookie:上游标题,浏览器将其返回给服务器)您将重新引入漏洞正试图解决.
我意识到上面的框架不会使用cookie来进行CSRF令牌的整个往返; 他们使用Set-Cookie下游,然后在上游使用其他东西(例如X-CSRF-Token标头),这确实可以关闭漏洞.但即使使用Set-Cookie作为下游传输也可能具有误导性和危险性; 浏览器现在将CSRF令牌附加到每个请求,包括真正的恶意XSRF请求; 充其量只会使请求变得比它需要的更大,而在最坏的情况下,一些善意但误导的服务器代码实际上可能会尝试使用它,这将是非常糟糕的.此外,由于CSRF令牌的实际预期接收者是客户端Javascript,这意味着此cookie不能仅使用http保护.因此,在Set-Cookie标头中向下游发送CSRF令牌对我来说似乎非常不理想.
我已经读到了Same Origin Policy,但是为了更好地理解这个问题:有人可以写一个简单的代码(用任何语言)来演示SOP停止的攻击吗?
在SOP出现之前怎么可能攻击某人?
所以我有一个PHP文件的基本.ajax()POST方法.
我需要哪些安全措施?
一些帖子提到使用您通过AJAX发送并在PHP文件中验证的隐藏MD5输入字段.这是一个足够好的方法吗?
我正在开发一个完全由ajax驱动的应用程序,其中所有请求都通过基本上相当于一个主控制器,在它的骨头上看起来像这样:
if(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
fetch($page);
}
Run Code Online (Sandbox Code Playgroud)
这通常足以防止跨站点请求伪造吗?
当每个请求没有刷新整个页面时,拥有一个旋转令牌是相当不方便的.
我想我可以传递和更新唯一令牌作为一个全局javascript变量与每个请求 - 但不知何故感觉笨拙,似乎本质上不安全.
编辑 - 也许静态令牌,如用户的UUID,会比什么都好?
编辑#2 - 正如鲁克所指出的,这可能是一个令人头疼的问题.我已经阅读了两种方式的猜测,并听到有关旧版本的闪存可用于此类恶作剧的远程窃窃私语.由于我对此一无所知,所以我会向任何可以解释这是CSRF风险的人提供奖励.否则,我将它交给Artefacto.谢谢.
我想检测浏览器是否通过AJAX(AngularJS)发出请求,以便我可以返回JSON数组,或者我是否必须呈现模板.我怎样才能做到这一点?
我对网络安全性很陌生,当我阅读更多关于不同攻击媒介的内容时,我的头脑很难说它们首先被允许.这就像网络设计的破坏安全模型一样容易受到攻击.
我也对模糊和不精确的信息感到惊讶.例如,起初单原始策略听起来不错,然后我读到它只适用于XHR,哦,顺便说一句,实际上并没有阻止XHR跨源POST,这是典型的CSRF攻击.很高兴我继续读.
还有一个Origin头,服务器可以使用它来确保请求来自正确的位置 - 但是oops,它在浏览器中设置不一致,如果没有设置,你不能确定它是否是是因为同源请求,还是某些浏览器没有得到它的请求类型(可能是IMG标签?).继续阅读.
因此,正确的方法似乎是在会话cookie中设置CSRF令牌,并将该令牌添加到表单/链接,然后在提交时将它们与服务器端进行比较.从理论上讲(并且为了这个问题而排除所有XSS攻击),来自另一个选项卡的CSRF尝试可能会对包含cookie的表单发出POST请求,但没有将表单输入元素设置为匹配令牌(因为它无法从cookie中读取令牌,因此服务器将拒绝该请求.工作但kludgy,并确保你永远不会忘记检查!
记住这一想法一秒钟,这是我的问题 - 为什么浏览器在一个请求中发送会话cookie,该请求来自不是cookie的起源的页面?
我的意思是,浏览器会拒绝将Cookie发送到不同的域名,但是很高兴从不同的来源发送它们?如果他们没有,会破碎吗?它是否是对CSRF的强大防御,只需要服务器做他们正在做的事情 - 检查有效的会话cookie?
编辑:也许这是改善情况的尝试?https://tools.ietf.org/html/draft-west-origin-cookies-01
我的研究表明,只有Host,Referer和User-Agent头可以被欺骗.(来源)
这是一个正确的假设吗?我正在建设的网站的安全性可能要求"x-requested-with"不能伪造.这远非理想,但可能是我唯一的途径.
我一直在研究一个经典的 SPA,其中前端应用程序存在app.example.com而 API 存在api.example.com,因此需要使用 CORS 请求。已设置服务器以返回 CORS 标头,工作正常。
每当 AJAX 请求不简单时,浏览器都会OPTIONS向服务器发出额外请求,以确定它是否可以使用有效负载进行调用。在 MDN 上查找简单请求
问题是:执行 OPTIONS 请求的实际好处是什么,尤其是在安全方面?
我的应用程序的某些用户具有显着的地理延迟,并且由于预检缓存不会持续很长时间,因此预检请求会导致延迟成倍增加。
我希望使POST请求变得简单,但只是嵌入Content-Typeofapplication/json否定了这一点。一种潜在的解决方案是通过text/plain在 url 中使用或编码来“破解”它。因此,我希望能够充分了解 CORS 预检请求对 Web 安全的作用。谢谢。
在阅读了很多关于CORS和飞行前请求之后,我仍然不明白为什么在飞行前有一些例外.如果Content-Type是'text/plain'或'application/json',为什么重要?
如果我做对了,CORS的值是限制返回的数据(它不关心POST是否破坏了数据库,它只关心浏览器无法读取该操作的输出).但如果这是真的(可能不是)为什么有飞行前请求呢?仅仅检查响应中的"Access-Control-Allow-Cross-Origin-Request:true"标题是否足够?
到目前为止我找到的最佳答案是:CORS - 引入预检请求背后的动机是什么?问题,但它对我来说仍然有点混乱.