以下命令不管密码如何都允许成功登录:
SELECT * FROM users WHERE username = 'eve'-- and password = 'asdasdasd';
因为它会忽略“-”之后的所有内容
但是以下命令没有:
SELECT * FROM users WHERE username = 'eve'--' and password = 'asdasdasd';
由于多余的撇号,由于某些原因,使用以下SQL命令生成的sql注入时:
"SELECT * FROM users WHERE username = '" + username + "' and password = '" + password + "';"
并使用以下输入:
用户名:eve'-
密码:asdasdasd
为什么要关心注释运算符后面是否有单个撇号???
正确的输入是什么,它将忽略其余的输入?
谢谢
答案 0 :(得分:0)
至少在MySQL中,--
字符后必须有一个空格。
https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-comments.html说:
标准SQL使用“-”作为开始注释序列。 MySQL服务器使用
#
作为开始注释字符。 MySQL Server还支持--
注释样式的变体。也就是说,--
开始注释序列必须 后面跟一个空格(或控制字符,例如换行符)。 需要该空间以防止自动生成问题 使用以下结构的SQL查询,其中 自动插入付款金额:UPDATE account SET credit=credit-payment
考虑发生了什么 如果付款为负值,例如-1:
UPDATE account SET credit=credit--1
credit--1
是中的有效表达式 SQL,但是--
被解释为注释的开始,是注释的一部分 表达式被丢弃。结果是一个具有 完全不同于预期的含义:UPDATE account SET credit=credit
该语句在 价值。这说明允许注释以
--
可能会造成严重后果。