我正在为我的同学创建一个测试项目,以展示带有未检查变量的 php 代码是如何危险的。我正在使用已弃用的mysql_*
函数和一个带有 2 个表的简单数据库:
users
data
在用户中,我只有管理员用户。
我创建了一个简单的 html 表单:
<form action="login" method="POST">
username: <input type="text" name="username">
password: <input type="text" name="password">
<input type="submit" value="login">
</form>
login.php 页面只需获取发布数据并构建查询,如下所示:
$uname = strtolower(trim($_POST['username']));
$passw = strtolower(trim($_POST['password']));
$result = mysql_query("
SELECT *
FROM users
WHERE username='".$uname."' and password=MD5('".$passw."')"
);
if(mysql_num_rows($result) != 1){
echo "Non valid";
}else{
echo "Logged in";
}
这是我在用户名字段中的输入:
' or 1=1 -- 
这应该产生一个查询,如:
SELECT * FROM users WHERE username='' or 1=1 -- ' and password=MD5('')
如果我在 SequelPro 或 PhpMyAdmin 上运行此查询,则查询将给我表的第一行,以便它工作。但如果我提交表格,结果是Not valid
.
我还尝试在此输入中使用密码字段:
') or 1=1 -- 
这是生成的查询:
SELECT * FROM users WHERE username='' and password=MD5('') or 1=1 -- ')
但结果是一样的,它适用于 SequelPro 但不适用于表单。
我认为 mysql_query 函数不会识别--
评论。我对吗?
我做错了什么?