我想验证表单而无需重新加载整个页面。我目前正在使用JavaScript,但这是非常不安全的。为了解决这个问题,我想使用AJAX和PHP脚本来验证表单。有没有人知道这可能带来的任何安全风险?
我还假设AJAX方法比vanilla JS更安全,但我可能错了?
答案 0 :(得分:5)
它们与使用纯客户端JavaScript验证的风险完全相同。唯一的区别是您要求服务器提供一些数据作为流程的一部分。
无论验证结果如何,用户都可以覆盖JavaScript以提交表单。
在检查提交数据时,完全使用JavaScript的唯一原因是节省用户时间。如果作为其中的一部分你想要做一些事情,比如询问服务器是否在用户填写表单的其余部分时使用了用户名,那么很棒 - 这是一个非常好用的Ajax。否则,使用Ajax是毫无价值的。
如果要进行客户端检查,请将所有可用的逻辑放在客户端上,避免发出HTTP请求。如果你有的东西只能在服务器端检查(因为它们是基于数据的,比如已经采用了用户名的例子),那么考虑使用Ajax。客户端检查是便利性检查。 始终执行安全检查服务器端和最终提交的数据。
请注意,验证使用Ajax实际提交的数据是另一回事 - 因为这是最终提交的数据。它正在进行Ajax验证,作为最终提交的前提,不会对数据增加任何信任。
答案 1 :(得分:2)
所有AJAX都将流程的一部分卸载到服务器,从客户端“隐藏”(从某种意义上说,隐藏了数据/变量的功能处理)。也就是说,您应该警惕发送到服务器的信息,这些信息可以被捕获或更糟,被欺骗。与纯JS的区别在于,您的功能处理是供所有人查看和潜在利用的。
除非您验证数据库内容(即用户名的唯一性等),否则验证不需要在服务器端完成。如果您只是验证某些内容是否是电子邮件,则可以在JS中执行此操作,例如使用RegEx。
如果要验证数据库数据,请确保使用mysql_real_escape_string
转义源自发送(POST / GET)变量的所有数据库查询变量,以防止SQL注入
答案 2 :(得分:1)
您可以在AJAX中验证数据,也可以在纯JavaScript中进行验证,但是必须在收到数据后在脚本中重新验证它。 通过向表单目标发送POST请求,可以避免每个客户端验证方法。
答案 3 :(得分:0)
这里要记住的主要事情是,在使用AJAX时,您实际上是在为数据库提供接口。例如,如果您要检查重复的用户名(您不能在javascript中执行)或重复的电子邮件,以便提供诸如&#34之类的消息;此用户名已在使用中...请尝试另一个",您正在为潜在的黑客提供一个界面,以便立即检查哪些用户名和/或电子邮件可用。安全注意事项与javascript不同。 我对此主题的建议是(1)使用参数化查询来访问数据库,如某人已经建议的那样。 (2)在ajax .php页面上实现延迟 - 长度取决于场景 - 我持续约1秒钟(3)在模糊时执行ajax,或在失去焦点时执行ajax,而不是在每个按键上执行,(4)执行检查在你的ajax处理程序中,确保请求来自预期的页面(即:不是黑客写的一些随机脚本)。 (5)只有在表单元素的其他基本验证发生时才进行AJAX调用[即:基本的javascript验证]
我希望这会有所帮助。使用ajax进行表单验证绝对不像是远程类似于javascript验证。它是数据库的一个接口,你需要小心它。
有助于想象您将如何入侵自己的网站 - 了解在您的网站上注册了哪些电子邮件地址是一个很好的起点。因此,我可以编写一个脚本,使用常用的单词和/或名称生成随机电子邮件地址,并锤击您的ajax处理程序,以获取您网站的注册电子邮件地址列表。如果你没有遵循建议(1) - (5)我上面说过,我可以迅速做到这一点。 一旦我收到电子邮件,我只是谷歌他们...有机会给我一个名字。我可以从那里猜出用户名。所以现在我有用户名和电子邮件。密码需要很长时间才能解释,但是如果我能够轻松获得用户名或电子邮件......它会将您标记为目标,您将获得更多您真正想要的关注。
我正在制作注册验证系统 - 如果您愿意,我很乐意与您分享。可能我错过了一些重要的东西!
和平了。