【问题标题】:How to authenticate an AJAX request to a PHP file?如何验证对 PHP 文件的 AJAX 请求?
【发布时间】:2013-10-21 09:42:05
【问题描述】:

在我的网站上,我有一个注册页面,它发出 AJAX 请求以检查用户名在输入后是否可用。该文件名为 check.php,与 registration.php 文件位于同一目录中。当数据发布到 check.php 时,它将在 MySQL 数据库中执行查询并返回使用该用户名找到的用户数。

如果有人将数据发布到 check.php 文件,他们也会看到结果。我需要以某种方式停止这种情况,我已经阅读了一些我需要“验证”每个请求的答案。这可能是一个非常大的话题,尽管我不太确定要搜索什么来找到更多关于它的信息。验证每个请求是否是停止不必要的用户名检查的好方法?如果是这样,如果有人能指出我如何做到这一点,我将不胜感激。

【问题讨论】:

  • 既然您在注册页面上使用它,我假设“合法”使用此 PHP 的“用户”不是注册客户端?因此,任何人 都可以访问您的页面并执行一些输入并获得回报。如果这是真的,那么“保护”它的意义何在?
  • @Passerby 你说得对,我用了一个愚蠢的例子。出于问题的目的,如果您可以假设它确实需要保护,我将不胜感激。 :)

标签: javascript php ajax authentication


【解决方案1】:

一种解决方案是在会话中生成一个唯一的令牌,并将其放在将包含表单的所有页面中。在您发出的每个 AJAX 请求上发布此令牌。 它被称为 CSRF 保护,跨站请求伪造

您可以添加一个保护层来检查 HTTP 标头中的用户引用。

【讨论】:

  • 你有一个链接可以用来备份吗?这听起来像是一个很好的答案,但需要阅读更多相关信息。
  • 这将是检查来自另一个域的请求的解决方案。但是经过身份验证的有效用户仍然可以轻松破解。
【解决方案2】:

常见情况的答案: - 你无法阻止这种情况,因为 AJAX 只是一个 HTTP 请求。无论您如何保护服务器,都可以发送它。因此,如果重点是——保护免受“邪恶黑客”的侵害——就没有办法做到这一点。正确的方法是检查/验证服务器端的任何内容。

但它只是关于基本检查,你可以阅读

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])=='xmlhttprequest')

-但请注意-这也是一个数据,来自客户端,即它不能被信任(实际上,它只是 HTTP-request 标头,仅此而已)

【讨论】:

  • 感谢您的回答。不过,这是否完全安全,就像您说的 HTTP 请求可以被操纵一样?有没有办法解决这个问题?
  • 就像我说的那样。您可以只进行基本检查 - 但您不能依赖来自客户端的任何数据。您必须对自己说:所有客户端数据都是邪恶的,他们都是邪恶的黑客! - 并按照此行事。
  • 正是我的观点,这个解决方案很好,但不会像对待黑客一样对待所有用户。我可能是一个黑客并操纵 HTTP 请求,那么这个解决方案将一文不值?
  • 所以你应该承认:如果有人想从 AJAX 中获取你的数据(即不是从你的应用程序中)——他会的。没关系,除非您的安全性建立在“AJAX 请求是安全请求”这一事实之上,否则无需担心(因此您应该将 AJAX 请求视为任何其他请求)
  • 是的,这听起来绝对适合这种情况。但是,如果需要更好的安全性怎么办?例如,在游戏结束时通过 AJAX 发送的积分被添加到排行榜的游戏?虽然检查用户名并不重要,但如果是更严重的问题,我想知道如何绕过它。
【解决方案3】:

我认为您可以在用户登录您的应用程序时创建一个 Session 变量,并在您将内容发布到“check.php”文件以检查您的用户是否以前经过身份验证时检查此变量是否具有正确的值

【讨论】:

    【解决方案4】:

    缺少很多信息,但从概念上讲,我不确定您是否担心真正的风险。底线是人们可以使用您的表单来检查电子邮件是否存在,因此他们也可以使用 check.php 是合乎逻辑的。试图阻止这种情况是矫枉过正的。

    【讨论】:

    • 好的,但概念仍然存在,如果这是另一个需要身份验证的文件,那么呢?
    • 通过登录后,您可以通过会话信息或在请求中嵌入信息来验证每个请求。例如,如果您正在编写 API,您可以在每个请求中包含用户名和密码,或者如果您正在显示用户特定信息,您可以查看会话信息。如果身份验证失败,则您拒绝该请求并说登录名/密码不匹配。
    【解决方案5】:

    我有一个想法 - 您可以生成一些独特的令牌,在显示页面之前将其存储在 SESSION 上。每次检查时,您都必须将此令牌添加到请求中。 check.php 必须重新生成令牌并返回新的。

    但是每个请求都可以模拟,它不能保护你免受那些想知道 check.php 结果的人的影响。没有什么可以保护...

    你也可以建立分析ip请求的机制来检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2013-11-13
      • 2018-01-24
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多