【问题标题】:Security risks of AJAX from validation?来自验证的 AJAX 的安全风险?
【发布时间】:2011-05-19 01:14:00
【问题描述】:

我想验证表单而无需重新加载整个页面。我目前正在使用 JavaScript,但是这是非常不安全的。为了解决这个问题,我想使用 AJAX 和 PHP 脚本来验证表单。有谁知道这可能有任何安全风险?

我还假设 AJAX 方法比普通 JS 安全得多,但我可能错了吗?

【问题讨论】:

  • 据我所知,AJAX 正在使用 XMLHttpRequest,它本身就是一个 javascript 对象,所以如果将 AJAX 和 javascript 分开,这听起来很奇怪。但无论如何,AJAX 就像没有刷新的 POST / GET,所以只要你正确地在服务器端进行验证,你应该没问题。不,如果你不安全地编码,没有什么是安全的。
  • 谢谢 :-) 这也是我使用 PHP/AJAX 的原因——它(合理地)是实时的,但具有 PHP 的相对安全性。

标签: php html ajax validation


【解决方案1】:

这里要记住的主要一点是,当使用 AJAX 时,您实际上是在为您的数据库提供一个接口。例如,如果您正在检查重复的用户名(您不能在 javascript 中执行此操作)或重复的电子邮件,以便提供诸如“此用户名已在使用中......请尝试另一个”之类的消息,您正在提供一个界面让潜在的黑客立即检查哪些用户名和/或电子邮件可用。安全注意事项与 javascript 不同。 我在这个主题上给你的建议是(1)使用参数化查询来访问数据库,正如有人已经建议的那样。 (2) 在 ajax .php 页面上实现延迟 - 长度取决于场景 - 我大约持续 1 秒 (3) 在模糊或失去焦点时执行 ajax,而不是在每次按键时,(4) 实现检查在确保请求来自预期页面的 ajax 处理程序中(即:不是黑客编写的一些随机脚本)。 (5) 仅在表单元素的其他一些基本验证发生时才进行 AJAX 调用[即:基本的 javascript 验证]

我希望这会有所帮助。使用 ajax 进行表单验证与 javascript 验证完全不同。它是您数据库的一个接口,您需要小心使用它。

想象一下您将如何入侵您自己的网站会有所帮助 - 了解哪些电子邮件地址已在您的网站上注册是一个很好的起点。因此,我可以编写一个脚本来使用常用词和/或名称生成随机电子邮件地址,并锤击您的 ajax 处理程序以获取您网站的注册电子邮件地址列表。如果您不遵循我上面提到的建议 (1)-(5),我可以很快做到这一点。 一旦我收到电子邮件,我就用谷歌搜索它们……很有可能这给了我一个名字。我可以从那里猜出用户名。所以现在我有了用户名和电子邮件。密码会花很长时间来解释,但如果我能轻松获得用户名或电子邮件......它会将您标记为目标,您将获得更多您真正想要的关注。

我目前正在开发一个注册验证系统 - 如果您愿意,我很乐意与您分享。可能我错过了一些重要的东西!

和平相处。

【讨论】:

    【解决方案2】:

    AJAX 所做的只是将部分进程卸载到服务器,从客户端“隐藏”(在某种意义上,您的数据/变量的功能处理是隐藏的)。也就是说,您应该警惕发送到服务器的信息,这些信息可能会被捕获或更糟的是被欺骗。与纯 JS 的不同之处在于,您的函数式处理是有目共睹的,并且可能被利用。

    除非您正在验证数据库内容(即用户名的唯一性等),否则不需要在服务器端进行验证。如果您只是验证某事是否是电子邮件,您可以在 JS 中执行此操作,例如使用 RegEx。

    如果您正在验证数据库数据,请确保所有源自已发送 (POST/GET) 变量的数据库查询变量都使用mysql_real_escape_string 进行转义,以防止 SQL 注入

    【讨论】:

    • 还有 MySQL 以外的数据库,使用参数化查询通常会产生更优雅的代码,更难意外错过转义。
    • 绝对真实-非常有效+1
    【解决方案3】:

    它们与使用纯客户端 JavaScript 进行验证的风险完全相同。唯一的区别是您在该过程中要求服务器提供一些数据。

    无论验证结果如何,用户都可以重写 JavaScript 来提交表单。

    在检查提交数据时使用 JavaScript 的唯一原因是节省用户时间。如果作为其中的一部分,您想做一些事情,例如在用户填写表单的其余部分时询问服务器是否使用了用户名,那么很好——这是对 Ajax 的一个很好的使用。否则,使用 Ajax 是毫无价值的。

    如果您想进行客户端检查,请将您可以为它执行的所有逻辑放在客户端上,并避免发出 HTTP 请求。如果您有只能在服务器端检查的内容(因为它们是基于数据的,例如已使用用户名的示例),那么请考虑使用 Ajax。客户端检查是方便检查。 始终对服务器端和最终提交的数据进行安全检查。

    请注意,验证实际使用 Ajax 提交的数据是另一回事 - 因为那是最终提交的数据。它将 Ajax 验证作为最终提交的前奏,不会对数据添加任何信任。

    【讨论】:

    • 谢谢。我想说它比客户端 JS 稍微安全一些——恶意用户不能像在他们的机器上修改 JS 代码那样容易地修改 PHP 代码,而且只要我在我的 PHP 脚本中使用体面的安全措施,他们就不应该能够用错误的 POST 数据打破它。
    • 用户无需修改PHP代码。他们只需要修改处理响应的 JavaScript。 PHP 说“这是不可接受的数据!”,用户让 JavaScript 说“那又怎样?!”。就此而言,用户可以一开始就跳过请求的发送。
    • 他们甚至不需要修改javascript代码;他们可以完全禁用javascript,并且绕过了所有的客户端检查。所以不,正如 OP 所说,它与纯客户端 JS 完全相同。
    【解决方案4】:

    您可以在 AJAX 中验证数据,也可以在纯 JavaScript 中进行验证,但是您必须在脚本接收到数据后重新验证它。 通过向表单目标发送 POST 请求,可以避免每种客户端验证方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 2011-12-16
      相关资源
      最近更新 更多