【问题标题】:Sanitize a PHP password string清理 PHP 密码字符串
【发布时间】:2009-06-12 12:49:04
【问题描述】:

我有一个 PHP 页面,允许人们运行 htpasswd 来更新他们的密码。清理他们的输入的最佳方法是什么。我不想过多地限制输入,因为我想允许使用安全密码。这就是我所拥有的。如何改进?

$newPasswd = preg_replace('/[^a-z0-9~!()_+=[]{}<>.\\\/?:@#$%^&*]/is', '', $inputPasswd);
$cmdline = $htpasswd . " " . $passwd_file . " " . escapeshellarg($username) . " " .escapeshellarg($newpasswd);
exec( $cmdline, $output, $return_var );

【问题讨论】:

    标签: php security validation


    【解决方案1】:

    ecscapeshellarg 函数是 PHP 内置的,在不同的系统中基于 shell 对文本进行清理,因此不会将“不安全”字符传递给 exec。

    http://us2.php.net/manual/en/function.escapeshellarg.php

    【讨论】:

    • 你是说如果我使用escapeshellarg,我不需要费心删除坏字符?
    • Escapeshellarg 将删除任何可以被 shell 解释的东西。 (或更改它,例如'=> \')我对 htpasswd 不是很熟悉,但这可以防止任何 shell 注入攻击。
    【解决方案2】:

    我不会在“危险字符”上使用带有空字符串的 preg_replace,因为这会使用户相信他将密码更改为其他内容,但您执行其他内容。所以用户会将密码设置为与他不同的内容放入...最好给用户反馈,告诉他某些字符(最好捕获并显示有问题的字符)没有通过验证。

    除此之外,我认为它看起来还不错。我认为它为用户提供了广泛的可能字符,他不需要更多的字符来创建安全密码。告诉用户密码中允许使用哪些字符也很有用,这样他就不必猜测了。

    【讨论】:

    • 这实际上是插件的一部分,我与用户交互的能力有限。真实用户输入错误字符的可能性很低,我愿意处理支持电话。
    • 虽然,我可能会导致密码更改更早失败......我会调查一下
    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2011-06-22
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多