【问题标题】:how to make SQL query case sensitive?如何使 SQL 查询区分大小写?
【发布时间】:2017-04-04 02:00:10
【问题描述】:

这是我的 php 代码,我正在尝试创建登录系统,它工作得很好,但可以说如果用户在数据库中有密码 = 'abcd' 并且如果他们输入 'ABCD',他们仍然可以登录,我不想要。我希望我的 SQL 查询区分大小写。

class Login extends Connection {
    private $userName;
    Private $password;

    public function userLogin($userName, $password) {

        $this -> userName = $userName;
        $this -> password = $password;

        $sql = "SELECT * FROM user WHERE user_name = :userName AND user_password = :password";

        $stmt = $this -> conn -> prepare($sql);
        $stmt -> execute(array(
            ':userName' => $this -> userName,
            ':password' => $this -> password
        ));

        if($stmt -> rowCount() == 1) {
            $_SESSION['userName'] = $userName;
            header("location:../index.php");
        }
        else {
            $_SESSION['loginMessage'] = "signin unsucessful";
        }
    }
}

我也尝试过类似的东西

$sql = "SELECT * FROM user WHERE user_name = :userName AND user_password COLLATE SQL_Latin1_General_CP1_CS_AS = :password";

我试过了

$sql = "SELECT * FROM user WHERE user_name = :userName AND BINARY user_password = :password";

但它们都不起作用。

【问题讨论】:

  • 如果您决定切换到使用安全的散列函数(例如password_hash()),您将会遇到问题,您知道吗?我强烈建议您反对您想要做的事情。如果您继续这样做,您的站点/数据库被黑客入侵只是时间问题;毕竟这是您的网站和用户的敏感信息。
  • @Fred 我知道所有这些东西,我以这种方式展示了我的 php 代码,因为我希望我的问题看起来尽可能简单,并且我想专注于我的真正问题,即如何制作 sql查询区分大小写? avobe php 代码只是一个例子。
  • 看看这个问答中有什么帮助stackoverflow.com/q/1694692/1415724

标签: php mysql sql pdo


【解决方案1】:

这是您绝对不想想要解决的问题。以纯文本形式保存密码是非常非常糟糕的主意。该怎么办? Salthash 的密码。

为什么? Never store plain passwords!

怎么样? Hashing and salting in PHP

【讨论】:

  • 按照互联网上随机的人告诉你的去做。 说真的,散列密码超级很重要。更不用说必不可少了
  • @Art 这不是我要找的答案。我的问题是关于如何使 SQL 查询区分大小写,而不是如何进行哈希密码?
  • @NawarajBista 我知道。但是 SO 上没有理智的人会向您解释如何存储纯密码。仅仅因为这是一个重大的安全风险。
  • @NawarajBista 如果是这种情况,那么您应该使用不同的示例来说明为什么需要不区分大小写。虽然我同意这个问题没有得到回答。它解决了需要更改的脚本的一个关键问题。
  • 跟问题无关,应该是评论
【解决方案2】:

同意加盐密码,但这应该适用于 MySQL 中区分大小写的比较。

select case when cast('test' as binary) = cast('TEST' as binary) then 1 else 0 end

【讨论】:

  • 不管这个问题的动机是什么,这应该被接受,因为它实际上解决了人们不比较密码的问题。像我一样。
【解决方案3】:

请不要存储纯密码。

但是,回答您的问题,可能数据库正在使用不区分大小写的排序规则。

您必须在数据库上设置排序规则或设置要在查询中使用的排序规则。

【讨论】:

    【解决方案4】:

    SELECT * FROM user WHERE user_name COLLATE latin1_general_cs = :userName AND user_password COLLATE latin1_general_cs = :password

    【讨论】:

    • 我对其进行了测试,它可以工作,但问题在于使用此查询后,header("location:../index.php");这行代码没有运行。
    • 这听起来像是一个不同的问题。如果我回答了您的问题,请标记我的回答以表明这一点。尝试将“../index.php”更改为“yahoo.com”并让我们知道这是否有效。您还可以尝试在调用 header() 之后添加对 exit() 的调用。
    • 如果 OP 承认它有效,为什么这个答案会被否决?
    猜你喜欢
    • 2011-03-24
    • 2015-07-23
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多