【问题标题】:protect php script against csrf...without php session (cross site)保护 php 脚本免受 csrf...没有 php 会话(跨站点)
【发布时间】:2016-05-26 07:46:11
【问题描述】:

我有一个将 POST 数据发布到 PHP 脚本的公共表单。

此表单不在同一个域中,也不使用 PHP,因此无法围绕 PHP 会话建立保护。

我们的目标是只允许这个表单发布在那个 PHP脚本上。

How do I provide more security for checking source of the request 讲述了如何使用 PHP 会话实现 CSRF 保护,但我想知道没有它我该如何保护我的?有可能吗?

【问题讨论】:

    标签: php session cross-domain csrf


    【解决方案1】:

    与 GET 请求相比,POST 请求更难伪造,所以你可以做到这一点,这很好。只需确保您没有在脚本中使用 $_REQUEST。

    你不能在这里使用会话,但原则是一样的——你必须在表单和你的 PHP 脚本之间实现某种“握手”。如果会话不是一个选项,有几种不同的方法。

    最简单的做法是检查 http 引荐来源网址。如果表单在 http 并且脚本在 https 下,这将不起作用,也可以使用开放重定向漏洞来克服。

    另一种方法是验证码。我知道,这些天对用户不友好或不流行,但这会使请求伪造变得更加困难,因为黑客无法在没有任何用户输入的情况下使他的漏洞利用在幕后工作。您应该查看 reCAPTCHA(谷歌的“我不是机器人”复选框):https://www.google.com/recaptcha/intro/index.html

    这是一个棘手的情况,因为一个主机上的表单和另一个主机上的脚本本身基本上就是 CSRF,所以你想允许它,但只允许一个主机。没有任何用户交互的完整安全性在这里可能是不可能的,所以尽量让潜在的黑客尽可能难地弄乱你的脚本,或者在 UX 方面受苦。我个人会选择 reCAPTCHA。

    【讨论】:

    • 感谢您的回答。关于验证码,我不明白:它如何保护对 PHP 处理脚本的直接访问不受非形式/人为尝试的影响?对我来说,这是在表单方面实现的东西,不是吗?
    • 您验证脚本中的验证码以查明表单背后是否有人,无论您选择自己实现还是使用外部服务(如 reCAPTCHA)。这意味着您可以过滤掉任何伪装成人类的脚本,并避免对表单的任何“无意”调用。
    • 澄清一下,是用户自己想在另一台主机上使用表单,无论如何他都会这样做:)。验证码将有助于防止 CSRF,这意味着黑客在用户不知情的情况下诱骗用户提交表单。 CSRF 定义等:owasp.org/index.php/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2013-02-07
    相关资源
    最近更新 更多