【问题标题】:php form change sha1 password with sed and execphp 表单使用 sed 和 exec 更改 sha1 密码
【发布时间】:2013-08-09 21:31:22
【问题描述】:

我正在制作一个简单的密码重置表单,多亏了这里的大量帮助,我有了一些工作。但是,我想添加一个转折并将重置密码保存在 sha1 中。这是我的代码:

#password file
$password='something';

<?php

// Change password

$rawPassword = (isset($_REQUEST["change_pwd"]));
$salt = "lgv932q2e9dshufkdjgf927gf8hlo082";
$newpass = sha1($salt . $rawPassword);


  $change_pass = exec('sed -i " . escapeshellarg("s/\$password=.*/\$password=\'$newpass\'/g")." include/conf.php');

  echo "$change_pass";

?>

<form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="text" name="change_pwd" maxlength="41">
    <input type="submit" name="Submit" value="Submit" />
</form>

当我提交新密码时,它没有正确更改文件中的 sha1 密码。而是每次将密码值更改为:

$password='356a192b7913b04c54574d18c28d46e6395428ab';

更新:我对密码进行了加盐处理,但仍然得到相同的结果。 (我也想知道除了使用 exec 和 sed 之外,是否有更好的方法来做到这一点?)

【问题讨论】:

  • 你的表单方法不应该是POST吗?
  • 出于好奇,您是否每次都输入相同的密码进行测试?如果您的密码中没有加盐,您每次都将获得相同的输出结果和相同的输入。即使使用相同的输入值,我也会建议您对密码进行加盐以获得不同的输出。
  • 我每次都在测试不同的密码,但文件中的结果总是相同的。我刚刚尝试对密码进行加盐,得到了类似的结果。我会用盐更新我的代码。

标签: php forms passwords exec sha1


【解决方案1】:

好的,所以我仔细研究了一下,发现了几件事供您考虑。

我会做的第一件事可能是使用 POST 作为表单方法,然后在 PHP 中的 $_POST 数组中捕获数据。您的 PHP 标记之外似乎还有一个变量,它将作为原始文本在其所在的上下文中输出到浏览器。

加盐是一件好事,有助于使您的密码更难破解。可选(并且推荐)是生成随机盐并将它们附加到您的密码以增加强度,以及其他好处。请记住,以后在身份验证期间再次对密码进行哈希处理时包含您的盐。

无论是否使用相同的密码,以下代码都应该适用于生成新密码哈希。

<?php

// Change password
if(isset($_POST["change_pwd"])) {
    $rawPassword = $_POST["change_pwd"]; 
    $salt = sha1(microtime()."lgv932q2e9dshufkdjgf927gf8hlo082");
    $newpass = sha1($salt . $rawPassword).$salt;
}

  $change_pass = exec('sed -i ' . escapeshellarg("s/\$password=.*/\$password=\'$newpass\'/g"). ' include/conf.php');
  //Also helpful to note that PHP halts execution until the command in exec() completes

  echo "$newpass";

?>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="text" name="change_pwd" maxlength="41">
    <input type="submit" name="Submit" value="Submit" />
</form>

希望能帮到你!

【讨论】:

  • 感谢您的回复,这让我有很多东西可以咀嚼。我确实尝试了你的代码,它似乎确实在页面本身上生成了一个密码,但是脚本似乎没有改变 include/conf.php 文件。
  • 我对 exec() 命令进行了编辑。命令字符串本身用单引号括起来,但在连接运算符之前使用了双引号。因此,escapeshellarg() 函数的输出没有连接到 sed 命令,而是作为字符串的一部分发送到 sed,可能会导致错误。我希望我能多说一些,我已经很久没有玩过 Linux 了,所以我对你的 sed 命令的语法正确性无话可说。
  • 它就像一个魅力,再次感谢。现在需要花点时间了解你到底做了什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2013-06-17
  • 1970-01-01
  • 2014-06-29
  • 2014-05-25
相关资源
最近更新 更多