【问题标题】:preg_match to sanitize input for the best securitypreg_match 清理输入以获得最佳安全性
【发布时间】:2021-07-31 16:28:13
【问题描述】:

我正在开发一个 wordpress 网站(我是网络开发的新手)。我安装了一个主题,现在我正在寻找改进它并使其适合我的需求。关于注册表单,主题检查密码中无效字符的代码是这样的:

else if(preg_match("/^([a-zA-Z0-9@#-_$%^&+=!?]{1,20})$/", $data['user_password'])==0) {
                SendtoUSER::$messages[]=__('Forbidden characters detected', 'mytheme');

用户名是这个

if(preg_match('/[@\s]/', $username)) {
            $valid=false;
        }

我做了一些研究,我理解"/^([a-zA-Z0-9@#-_$%^&+=!?]{1,20})$/" 的大部分表达 - 我不明白为什么;仍然可以使用(我观察到从工作中删除#-_prevents ;,所以#-_ 是一个反转?)我的问题是@#-_$%^&+=!? 在表达式中的含义是什么?这段代码是否足够好,有哪些好的做法可以实现 preg_match 以实现最大安全性?提前感谢您的回复。

【问题讨论】:

  • “有哪些好的做法可以实现 preg_match 以获得最大安全性?”不。限制密码中的字符会降低安全性。
  • 好的,很高兴知道。另外,我害怕格式错误的字符串:)
  • 我同意@ceejayoz 的观点,即您永远不应该费心限制用户在密码中使用字符集,而是对密码长度施加最小的下限。所以不要使用少于 8 个字符的密码是一个好习惯。但是,使用不超过 20 个字符的密码是不好的。此外,机密安全的关键是可预测性,因此大多数网站都提供某种形式的基数指示器,以保持用户对其密码安全性的看法。以password meter 为例。
  • @VreauCutitul 恶意密码字符串应该无关紧要,因为它们永远不会显示,并且它们存储为哈希(使用 password_hash 函数),而不是原始密码。

标签: php wordpress security


【解决方案1】:

我想在 WordPress 中,sanitize_text_field 将是最好的解决方案。您可以验证它:

if ( sanitize_text_field( $data['user_password'] ) !== $data['user_password']  ) {
    $valid=false;
}

另外,我检查了它在个人资料页面上的工作方式,它看起来像在核心中,它验证为:

$pass1 = trim( $_POST['pass1'] );
//...
// Check for "\" in password.
if ( false !== strpos( wp_unslash( $pass1 ), '\\' ) ) {
    $errors->add( 'pass', __( '<strong>Error</strong>: Passwords may not contain the character "\\".' ), array( 'form-field' => 'pass1' ) );
}

可能最好的解决方案也是复制 WordPress 解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2013-05-07
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多