【问题标题】:Checking for empty password fields without posting unencrypted passwords检查空密码字段而不发布未加密的密码
【发布时间】:2012-10-29 01:21:23
【问题描述】:

假设我有一个简单的表格:

<form action="register.php" method="post">
<label>Password:</label>
<?php if (isset($errors[1])) echo $errors[1]; ?> <- Displays error message if there is one
<input type="password" name="user_pass" />
<label>Confirm Password:</label>
<input type="password" name="user_pass_confirm" />

<input type="submit" />
</form>

$user_pass = $security->encrypt($_POST['user_pass']);
$user_pass_confirm = $security->encrypt($_POST['user_pass_confirm']);

$registration->form($user_pass, $user_pass_confirm);

还有一个班级:

if (empty($user_pass)) {
$errors[1] = 'Passwords  required';
} else if ($user_pass != $user_pass_confirm) {
$errors[1] = 'Passwords don't match';
}

//if error array empty, create member

我要做的是验证密码以使其成为必需,确保它们匹配,我还将添加一个 preg_match 正则表达式以确保它至少有 8 个字符长或其他。

我的问题是,我在提交之前已经加密了密码(我认为不应该发布未加密的密码,如果我错了,请纠正我)。

然后当我的班级获得编码字符串时,我无法做任何事情来验证它。我可以通过将字段与什么都没有的加密/加盐版本进行比较来检查是否为空,但我确定这不是这样做的方法。

谁能指出验证密码的标准程序或您对解决方案的任何建议。

非常感谢

【问题讨论】:

  • 如何使用 PHP 加密尚未发送到服务器的纯密码?
  • 你会发布密码,然后检查它们是否匹配并使用 strlen() 来查看它是否> 8个字符,毕竟这些,你会加密它们。
  • 抱歉,我知道我错过了一些东西,页面会自行发布并检查错误。如果发现错误,它将在每个输入旁边显示错误消息并带有错误。这个过程会加密密码并去除任何令人讨厌的东西。我发帖的原因是我认为发送未加密的密码不是一件好事。我一定是弄错了。这就是早上半点对你的影响;)

标签: php encryption passwords


【解决方案1】:

PHP 不能在客户端执行。由于 PHP 是一种服务器端语言,因此您无法使用 PHP 加密纯密码而不将其发送到服务器。必须先将密码发送到服务器,然后才能访问它。您可以通过 https 使用 SSL/TLS 等机制,但这不会影响您的 PHP 代码。

这意味着:您不能在提交表单之前使用 PHP 加密密码。这可以通过 JavaScript 等客户端编程语言来完成。您可以实现一个 JavaScript 函数来检查密码是否正常(不是空且足够长/足够安全),然后让 JavaScript 对其进行加密,然后将其发送到服务器,以便将加密的密码传输到服务器。

<form action="register.php" method="post">
...
</form>
<?php
//$user_pass = $security->encrypt($_POST['user_pass']);
//$user_pass_confirm = $security->encrypt($_POST['user_pass_confirm']);
//$registration->form($user_pass, $user_pass_confirm);
//YOUR PASSWORD HAS NOT BEEN SENT TO YOUR SERVER YET. YOU CANNOT ACCESS IT USING PHP.
//YOU WOULD NORMALLY DO SOMETHING LIKE THIS (IN REGISTER.PHP)
if(isset($_POST["name_of_your_submit_field"])) //WHICH MEANS THAT YOUR FORM HAS BEEN SUBMITTED NOW
{
    //This checks whether the POST-variable of your submit field is set.
    //If it is, you know that the client has submitted the form and sent the form data to your server.
    //Only here you can access the form data.
    $user_pass=$_POST['user_pass'];
    if(strlen($user_pass) > 8)
    {
        $user_pass = $security->encrypt($user_pass);
        $user_pass_confirm = $security->encrypt($_POST['user_pass_confirm']);
        $registration->form($user_pass, $user_pass_confirm);
    }
}
?>

【讨论】:

  • 但是如果关闭了通过 JavaScript 验证将无济于事。然后用户可以注册并可以根据需要使用字母“a”作为密码。
  • 是的,他们可以,但只有大约 1-2% 的用户禁用了 JavaScript:stackoverflow.com/questions/9478737/… 但我认为首先是用户的问题,如果他使用弱密码,不是这样很多你的。您还可以添加noscript-tag 来警告这些用户。另一种可能性是直接发送密码。目前我不知道有任何安全加密算法允许您在加密过程后暗示密码长度。
  • 好的,谢谢你的回答,我先验证一下再加密。
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2010-10-23
  • 2023-02-03
  • 2011-03-02
  • 1970-01-01
  • 2015-05-10
相关资源
最近更新 更多