当我在验证表单中使用以下代码时,即使两个密码相同,密码匹配也不匹配两个密码。
$this->form_validation->set_rules('password','Password','required|md5|trim|xss_clean|matches[rpassword]');
$this->form_validation->set_rules('rpassword','Repeat Password','required|md5|trim|xss_clean');
但是当我删除 md5 功能时,密码匹配工作正常。
有人能理解为什么会这样吗?
当你做匹配[rpassword]时,它会在md5之后查看密码的当前值,但在md5之前查看rpassword。
将其切换到此状态,以便在转换为 md5 之前执行匹配验证:
$this->form_validation->set_rules('password','Password','required|matches[rpassword]|md5|trim|xss_clean');
$this->form_validation->set_rules('rpassword','Repeat Password','required|md5|trim|xss_clean');
此外,如果这是一个安全性真正重要的应用程序 - 请知道md5很容易破解,如果有人能够进入您的数据库,他们将能够破解所有这些密码。所以基本上使用 md5 几乎等同于一开始就不加密。
对于密码存储,请使用CRYPT_BLOWFISH或 PHP 5.5 的password_hash()
函数。对于 PHP <5.5,请使用 password_hash() compatibility pack
。
发生这种情况是因为该操作在找到变量"rpassword"之前比较了"matches[rpassword]",请参见下文:
您的代码:
$this->form_validation->set_rules('password','Password','required|md5|trim|xss_clean|matches[rpassword]');
$this->form_validation->set_rules('rpassword','Repeat Password','required|md5|trim|xss_clean');
更新并工作:
$this->form_validation->set_rules('password','Password','required|md5|trim|xss_clean');
$this->form_validation->set_rules('rpassword','Repeat Password','required|md5|trim|xss_clean|matches[password]');