为啥 SQL "WHERE" 从表中返回值是小写的? [复制]

Posted

技术标签:

【中文标题】为啥 SQL "WHERE" 从表中返回值是小写的? [复制]【英文标题】:Why is SQL "WHERE" return value from table lowercase? [duplicate]为什么 SQL "WHERE" 从表中返回值是小写的? [复制] 【发布时间】:2021-11-05 23:01:58 【问题描述】:

对不起,如果我的问题令人困惑。

我查询时为什么会这样

SELECT email FROM users WHERE email = 'some-email@email.com' AND password = 'pass134';

我正在使用带有 SQL 的 Node.js 服务器,当我使用时:

app.get('/login', function(req, res) 
  var params = '?' + req.url.split('?').pop(); // "?email=test@test.net&pass=13456"
  const pass = (new URLSearchParams(params).get('pass')); // "13456"
  connection.query(`
  SELECT email FROM users WHERE email = '$email' AND password '$pass';
  `, function(err, result) 
     if (err) throw err;
     if (typeof result[0].email != "undefined") 
       // User logged in successfully
      else 
       // The email/password is incorrect
     
  );
);

我尝试访问 https​://www.example.com/login?email=test@test.com&pass=Pass13456,它会登录。 但是当密码为小写或大写时,它仍然可以登录。 我认为这是 WHERE 查询不够具体。 如何使 SQL 选择值以 WHERE 作为特定值?

(例如,WHERE str = 'only equal to this string, not lowercase or uppercase';

【问题讨论】:

mysql 默认不区分大小写。 你不应该在数据库中存储明文密码。 ***.com/questions/5629111/… @PM77-1 非常感谢。正是我想要的! @Ivar 这只是我的代码示例。显然这是一个安全问题,我从事网络安全工作。 【参考方案1】:

因此,mysql 中的 where 子句不区分大小写。要修复它,您可以从查询中返回密码,将其作为变量保存在节点中,然后进行比较(一种解决方案)

或者您可以使用二进制比较。我仍然需要对此进行测试,但我相信您只需将“BINARY”关键字添加到您的查询中。很喜欢

SELECT email FROM users WHERE email = 'some-email@email.com' AND BINARY password = 'pass134';

我在手机上写这个,所以我不知道这是否是最好的,我仍然需要测试二进制解决方案

【讨论】:

谢谢!我从来不知道 SQL 是不区分大小写的。 SQL 通常区分大小写 - 这是 MySQL 的一个奇怪之处

以上是关于为啥 SQL "WHERE" 从表中返回值是小写的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

sql动态拼接:为啥select count(*) where条件后面<if test="">不起作用?

为啥Entity Framework没有在使用SingleOrDefault时生成的SQL中添加“where”?

Oracle/SQL:为啥查询“SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10” - 返回零行

为啥“WHERE”查询不能在 php 中使用 SQLITE [重复]

相同的SQL语句 为啥在本地可以运行 但是在服务器上运行就报错?

sql where后面不能使用别名吗