【问题标题】:How to construct regex for password in SQL?如何在 SQL 中为密码构造正则表达式?
【发布时间】:2019-08-13 13:11:27
【问题描述】:

我正在为我的 Web 应用程序上的用户注册创建一个新的存储过程。我需要验证用户密码的格式为:

  • 必须至少包含一个数字或字母
  • 必须至少包含一个特殊字符 我需要设法使用正则表达式来编写它。

这是针对我在 SQL Server 2017 中创建的新数据库。我的数据库可以正常工作,我的电子邮件验证也可以正常工作。

IF (@password NOT LIKE '%[a-zA-Z0-9]%' OR @password NOT LIKE '%~!@#$%^&*()_+-={}[]:"|\;,./<>?''%' OR LEN(@password) < 8)
        BEGIN
                SET @message = 'Invalid credentials'
                RETURN;
        END
                ELSE
                SET @message = 'Success'
                RETURN;
                END

这是我到目前为止的代码,老实说,我尝试了很多组合,但仍然没有。

我希望像 !Password123 这样的密码的输出是 Success 但我仍然得到“Invalid credentials”和像 Password123 这样的密码!我仍然收到“Invalid credentials

【问题讨论】:

  • SQL Server 不支持正则表达式。它有一些 REGEX LIKE 功能。这可以在很长的时间内在数据库中完成,但最好在应用程序端完成。
  • 如果您尝试在 RDBMS 中验证密码,则将其作为纯文本传递给 RDBMS;从而造成巨大的安全风险。在密码获取数据库附近的任何地方之前,它应该已经被加盐和散列。将纯文本密码传递给 RDBMS 将允许任何可以执行跟踪或使用扩展事件来拦截这些值的人。即使是sysadmin 也不应该能够找出用户的密码。
  • 实际上,如果您编写 CLR proc,您可以在 SQL Server 中使用 REGEX。但我同意 Larnu 的观点,即数据库不是检查业务逻辑的地方。

标签: sql sql-server regex passwords


【解决方案1】:

虽然访问完整的正则表达式引擎是理想的选择,它可以让您编写更强大的密码检查,但您实际上可以使用 SQL Server 增强的LIKE 运算符来处理您的要求。我在当前代码中看到的问题是,您没有转义第二个 LIKE 表达式中的方括号,该表达式检查是否存在特殊字符。您可以告诉 SQL Server 您打算如何使用ESCAPE 转义方括号,如下所示:

DECLARE @password VARCHAR(500);
SET @password = '!Password123';

SELECT 1
WHERE
    @password NOT LIKE '%[a-zA-Z0-9]%' OR
    @password NOT LIKE '%[~!@#$%^&*()_+-={}\[\]:"|\;,./<>?'']%' ESCAPE '\' OR
    LEN(@password) < 8;

上面的查询什么都不返回,说明!Password123是一个有效的密码。

【讨论】:

  • 非常感谢这就是问题所在。我没有逃避方括号,这就是它不起作用的原因。非常感谢,现在一切都很好。
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2012-07-25
相关资源
最近更新 更多