使用HTML/Javascript/PHP文本框防止空字节注入的正确方法

使用HTML/Javascript/PHP文本框防止空字节注入的正确方法,javascript,php,html,sql,passwords,Javascript,Php,Html,Sql,Passwords,我目前正在为一个web应用程序创建一个Javascript/HTML/PHP注册表单。我想让它尽可能的安全,并且正在阅读PHP中的空字节注入。我认为为了防止这样的事情发生,我需要不允许使用特殊字符(空字节字符),比如%&、#@?!等等,在用户注册时被选为密码 用户在两个HTML文本框中键入用户名和密码,我让用户名通过用户名文本框的onBlur事件检查我的数据库(使用php脚本),检查用户名是否已在数据库中使用,如果已使用,则禁用“注册”按钮并提醒用户该问题 我想对密码文本框做一些类似的操作。如果

我目前正在为一个web应用程序创建一个Javascript/HTML/PHP注册表单。我想让它尽可能的安全,并且正在阅读PHP中的空字节注入。我认为为了防止这样的事情发生,我需要不允许使用特殊字符(空字节字符),比如%&、#@?!等等,在用户注册时被选为密码

用户在两个HTML文本框中键入用户名和密码,我让用户名通过用户名文本框的onBlur事件检查我的数据库(使用php脚本),检查用户名是否已在数据库中使用,如果已使用,则禁用“注册”按钮并提醒用户该问题

我想对密码文本框做一些类似的操作。如果用户输入带有特殊字符的密码(例如,“mypassword!”),那么我想禁用“注册”按钮,并通知他们密码必须只包含字母和数字

这是防止空字节注入的正确方法吗?或者在PHP文件中通过某种检查允许密码中使用特殊字符是否同样安全?
提前感谢您的帮助

发布为CW,因为这不是答案@艾米丽:要么他们修复了(在PHP7上测试),要么评论是错误的:

php > echo password_hash("123\0456", PASSWORD_BCRYPT);
$2y$10$UQ7o/1ggpeqQYQaAPDQUxeAq0vPFJCenBJEzDFkcFXirrz6HC7N9.
php > var_dump( password_verify("123\0456", '$2y$10$UQ7o/1ggpeqQYQaAPDQUxeAq0vPFJCenBJEzDFkcFXirrz6HC7N9.'));
bool(true)
php > var_dump( password_verify("123", '$2y$10$UQ7o/1ggpeqQYQaAPDQUxeAq0vPFJCenBJEzDFkcFXirrz6HC7N9.'));
bool(false)

在回应Marc B的上述帖子时,你还需要小心吗?看看如果我们使用\000作为空字节信号(PHPV7),这里会发生什么

就个人而言,当使用password_hash()/bcrypt时,我会清理密码,使其包含大写字母和小写字母,所有数字都加上$^&*()[]@-+,最多72个字符。这对于我的应用来说是非常好的,这不是核导弹代码的存储。如果你在互联网上寻求答案,那么你可能不是在储存危及生命的信息,因此上述净化措施可能也会对你起作用,你可以忽略那些末日贩子告诉你,你在冒着生命和肢体的危险到处乱说“你在减少熵!”


我很乐意使用我定义的字符集创建一个8到72个字符长的密码,并为“暴力破解密码”竞赛提供密码\u hash(),安全地说,这需要一些高端硬件和大量时间才能找到冲突。将上述内容与良好的系统安全性结合起来,通过TLS传输所有信息,并防止其他常见问题,如使用准备好的语句进行注入攻击等,您就可以拥有足够的安全性来阻止除最坚决的、由国家赞助的活动外的所有活动。

因此,您希望故意削弱密码,使以后更容易猜测/破解它们?您应该鼓励使用尽可能丑陋和复杂的密码。
这是防止空字节注入的正确方法吗?
否-任何客户端代码都不在您的控制范围内。用户可以通过在浏览器中禁用JS轻松绕过它。您永远不应该只依赖客户端验证—您可以拥有它,但它只会改善用户体验,而不是保护您的服务器。防止密码中注入空字节的最佳且唯一正确的方法是执行基本的最佳实践。。使用
password\u hash()
oh,以及什么[我选择的搜索引擎]
$input=str\u replace(chr(0),“”,$input)嗨@Franzgleichman谢谢你的回复。在将用户名和密码输入数据库之前,我已经在使用password\u hash()(在用户登录时使用password\u verify)。但是我问这个问题的原因是因为在这里的hash-php手册上有一条评论:有一个名为“Lyo-Mi”的用户的评论提到了用空字节字符截断密码的hash函数。如果这是真的,那么我想不出比客户端更能防止空字符的方法了。那个评论不正确吗?您好,很好,我的服务器是7.0.12,这意味着我不需要担心用户使用特殊字符?再次感谢。我想你的考试有错误<代码>\045
不是NUL字节。
php > echo password_hash("123\000456", PASSWORD_BCRYPT);
$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO
php > var_dump( password_verify("123\000456", '$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO'));
bool(true)
php > var_dump( password_verify("123", '$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO'));
bool(true)
php > var_dump( password_verify("123\000NothingMattersPastTheNull!", '$2y$10$GNQS2Wxj.L/5WukaOJEcxeOwgIgzug5BvCVvyVJOAUTkpfW2HiclO'));
bool(true)