如果您想在表单中包含 Flash 插件,例如 Uploadify,如何防止 CSRF?

信息安全 Web应用程序 php 攻击 应用安全 csrf
2021-09-06 18:31:27

什么是 CSRF?

我需要一个不仅来自维基百科的基本定义。

我了解 SQL 注入、XSS、cookie 中毒,但我无法完全理解这一点。

我正在使用一个框架CakePHP,它有一个自动阻止这个 CSRF 的组件。但是,每当我对表单执行某些操作时,例如使用 jQuery 来更改字段的值。或者当我包含一些适用于像Uploadify这样的 Flash 插件的 Ajax 时,我需要禁用 CSRF。

那么,当表单中涉及此类元素时,原则上我该如何防止 CSRF?

1个回答

CSRF 或跨站点请求伪造基本上是一个坏人欺骗好人的浏览器代表坏人在您的网站上执行功能。

这是一个例子:

  1. 好的用户登录您的网站并获得有效会话
  2. 坏用户诱骗好用户点击指向恶意网站的链接
  3. 恶意网站包含一个带有伪造数据的表单,该表单发布到您的网站(但是由于它是从客户端发送的,您的网站认为它来自好用户)
  4. 然后,您的站点会看到好用户提交了表单并处理了该操作。

让我们把它放到上下文中:

  1. 好的用户是您网站的管理员。
  2. 在管理面板中,优秀用户可以通过填写如下所示的表单来添加用户:

    <form action="/new_user.php" name="myform" method="POST">
        <input type="text" name="new_username">
        <input type="password" name="new_password">
        <input type="Submit">
    </form>
    
  3. 好的用户点击指向恶意站点的链接,其中包含以下 javascript:

    <form action="http://www.yoursite.com/new_user.php" name="myform" method="POST">
        <input type="hidden" name="new_username" value="MaliciousHax0r">
        <input type="hidden" name="new_password" value="MaliciousPass">
    </form>
    <script type="text/javascript">
        document.myform.submit();
    </script>
    
  4. 您的应用程序现在收到 Good user 代表 Bad user 提交的请求。由于它来自恰好登录到您网站的好用户,所以一切都很好,您的网站会处理请求。

现在请记住,这是一个简单的示例,Good 用户会看到提交发生,这应该引发一个危险信号,但是使用稍微更复杂的方法,例如 javascript 中的 XMLHttpRequest() 将对 Good 用户保持沉默/未知。

坏用户现在已经在您的系统上获得了一个帐户。

如何消除 CSRF:

  1. 诀窍是向每个表单添加一个令牌,该令牌具有为每个请求生成的随机值。
  2. 提交表单时,您的应用程序会检查以确保令牌已通过,并与加载表单时生成的随机令牌相匹配。

恶意站点无法访问此令牌,因此无法提供所需的内容,并且不会处理表单提交。

如何在不禁用 CakePHP 中的 CSRF 保护的情况下使其他工具工作:

我不知道。检查 CSRF 保护、CakePHP 和其他插件的文档。

质疑在 CSRF 保护中使用这些插件是否值得损失,并考虑替代解决方案。

CSRF 资源:

https://www.fortify.com/vulncat/en/vulncat/javascript/csrf.html