Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CSRF仅适用于ajax_Php_Jquery_Ajax_Security - Fatal编程技术网

Php CSRF仅适用于ajax

Php CSRF仅适用于ajax,php,jquery,ajax,security,Php,Jquery,Ajax,Security,我最近一直在研究一种通过使用令牌来阻止攻击发生的方法。据我理解: 1) 用户登录,将会话cookie设置为已登录,并生成CSRF令牌并将其保存到会话 2) 用户提交表单(带有令牌),表单应与会话中的令牌匹配 假设我有一个page1.php,它有一个sqlSELECT来获取所有用户的帐户信息,然后在同一个页面中,我还有一个ajax按钮来更改page2.php的帐户信息。显然,我保护page2.php不受CSRF的影响(因为这是一个post请求),但如何保护page1.php?如果ajax从远程源调

我最近一直在研究一种通过使用令牌来阻止攻击发生的方法。据我理解:

1) 用户登录,将会话cookie设置为已登录,并生成CSRF令牌并将其保存到会话

2) 用户提交表单(带有令牌),表单应与会话中的令牌匹配

假设我有一个page1.php,它有一个sql
SELECT
来获取所有用户的帐户信息,然后在同一个页面中,我还有一个ajax按钮来更改page2.php的帐户信息。显然,我保护page2.php不受CSRF的影响(因为这是一个post请求),但如何保护page1.php?如果ajax从远程源调用此页面,或者在攻击者网站上放置iframe,那么这肯定会打印所有受害者帐户信息吗


如果是这样的话,为什么我似乎找不到任何关于保护所有页面免受CSRF攻击的信息,而我只在ajax中找到了用于保护所有页面免受CSRF攻击的资源?

我不确定我是否明白这一点,但CSRF的令牌应该是一个nonce,它在每次调用时都会发生变化

对于来自其他地方的调用,ajax请求还应该检查该调用是否来自具有正确实体的有效用户,就像对站点的任何“常规”调用一样

如果是这样的话,为什么我在电视上找不到任何东西 保护所有页面免受CSRF攻击,我只找到 在ajax中防止CSRF攻击


通常,您要做的是在“常规”页面中使用的表单的隐藏输入中设置一个nonce。

假设您在处有一个页面,其中包含一些数据和生成的CSRF令牌。攻击者创建并在application.com的有效用户访问时向application.com发出请求(通过ajax或iframe,无所谓),以获取应用程序数据。标准csrf

这对攻击者不起作用的原因是同源策略。当受害用户位于攻击者.com上时,对application.com的请求将跨域。如果它是iframe,则会显示数据,但攻击者.com将无法访问它,它只会显示给可以在application.com上查看的用户。如果是ajax调用,同样适用,则由浏览器确保,攻击者.com上的javascript将无法访问响应

对于ajax调用,可以通过application.com在响应中发送的access control allow origin and related response Header(COR)显式启用对跨域响应的访问

请注意,尽管是跨域的,但仍会进行调用(在某些情况下,飞行前请求会起作用,但现在我们不要讨论这个问题)。只有响应是攻击者无法访问的,这足以防止csrf

(另请注意,application.com应该通过发送
x-frame-options:sameorigin
标题来防止在iframe中显示,以防止点击劫持和类似攻击,但这不是问题所在。)

假设页面上有一个sql select,但没有 请帖。现在,如果要从远程源调用此页面 通过ajax或在他们的网站上放置iframe,这肯定会打印出来 所有受害者的数据

确保所有发送“机密”信息的请求(无论是作为网页还是作为ajax调用的数据(或将来的任何内容)请验证是否有有效的会话处于活动状态。如果没有,请确保服务器端部分不会发布任何机密信息,而是抛出一个错误,并确保您的ajax客户端理解该错误,并为普通用户执行正确的操作(如告诉他们未登录,并让他们修复该错误)

如果是这样的话,为什么我在电视上找不到任何东西 保护所有页面免受CSRF攻击,我只找到 在ajax中防止CSRF攻击

对于常规post请求,表单通常会输出一个隐藏的输入字段,其中包含CSRF令牌。仅此而已

但一定要确保处理请求的代码验证隐藏字段是否存在并用正确的值填充


还要确保任何修改内容的请求都是CSRF保护的。例如,非ajax上下文中的delete按钮应该通过发送和验证CSRF令牌来保护(因此,该按钮最终成为一个表单,其中包含一个隐藏的CSRF字段。

假设,您应该更加担心此查询的SQL注入。此外,在未确认用户已登录会话之前,您不应该公开用户数据。会话仍然在Ajax上工作。感谢您的观点,但我希望保留代码。)问题的实质是什么?sql注入不是本次讨论的主题。安全性是,当存在公然违反基本最佳实践的情况时,您很难指责我指出了这一点。还有一些检查确保用户登录,但如果会话和cookie仍在网络上,则仍然存在那么攻击者仍然可以使用该信息,对吗?不一定,每个请求生成一个令牌更安全,但并不总是需要的。在大多数情况下,在会话期间只使用一个令牌是完全安全的,正如这里所指出的:我没有发现任何关于它是“完全安全”的说法,也没有发现什么“大多数情况”将在链接中引用。我还为您上次错过的问题添加了一行。1)我粘贴了错误的链接,我将在不久后尝试查找正确的链接2)我想你误解了我的问题-我的意思是,假设一个页面在没有启动post的情况下自动浏览用户仪表板数据,那么就没有任何地方可以阻止CSRF的发生…如果你以各种形式更改CSRF令牌,你就可以阻止浏览器的后台功能以及防止