我对此php代码有疑问:
<?php
$data = json_decode($_POST['data'], true);
$user = mysqli_real_escape_string($conn, $data['username']);
$password = md5($data['password']);
$query = mysqli_query($conn, 'SELECT * FROM Utenti WHERE username = "$user" AND password = "$password"');
if(mysqli_num_rows($query) > 0){
$status = 'ok';
} else{
$status = 'error';
session_destroy();
}
echo $status;?>
这是请求(使用json编码):
POST /login HTTP/1.1
Host: example
User-Agent: example
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: length
data=%7B%22username%22%3A+%22harry%22%2C+%22password%22%3A+%22potter%22%7D
当我按字面意义这样写查询“ SELECT * FROM Utenti WHERE username =“ harry” AND password =“ potter”时,这将返回“错误” bur,它将返回“ ok”。此外,语句'$ user ==“ harry”和$ password ==“ potter”返回true。可能是字符编码/ json问题吗?
p.s。我知道安全问题(md5,http),这只是一个测试
答案 0 :(得分:1)
如果用单引号将字符串(您的SQL查询)封装起来,则不会扩展变量。您需要为此使用双引号:
$string = 'user="$user"';
// literally the string: user="$user"
$string = "user=\"$user\"";
// literally the string: user="harry"
答案 1 :(得分:1)
PHP中的单引号表示字符串的内容是按字面意义使用的。因此,它将不会插入$user
和$password
变量的值-实际上会检查用户名"$user"
。
您应该将整个查询字符串括在双引号中,然后它应该可以工作。
答案 2 :(得分:0)
当您在用单引号引起来的select语句中使用“ $ user”和“ $ password”时,以这种方式更改select语句,变量将被视为文字。因此,您必须在语句中使用双引号,并在变量中使用单引号
"SELECT * FROM Utenti WHERE username = '$user' AND password = '$password'"