我有一个Javascript脚本,通过POST将Ajax请求发送到以下PHP脚本。从上面传递$ db,但我知道该部分有效。我从这里得到500内部服务器错误。我无法看到服务器日志,因此我无法获得比此更详细的信息。任何人都知道我能做些什么来解决它?
function register($db) {
$user = $_POST['username'];
$pass = $_POST['password'];
$query = "SELECT username FROM users WHERE username='$user'";
$result = mysqli_query($db, $query);
if (mysqli_fetch_array($result)[0] == $user) {
echo "taken";
}
else {
$query = "INSERT INTO users (username, password) VALUES ('$user', '$pass')";
if (mysqli_query($db, $query)) {
echo "success";
}
}
}
答案 0 :(得分:2)
这不仅仅是一个推论,而是一个实际的答案,但它对于评论的格式来说太长了。
为了跟进@ MarcB的评论,您应该将您的代码更改为无法使用SQL注入:
$user = $_POST['username'];
$pass = $_POST['password'];
$link = new mysqli($host, $username, $password, $database);
if(!$link)
{
die("Unable to connect to MySQL");
}
$stmt = $link->prepare("SELECT username FROM users WHERE username=?");
$stmt->bind_param("s", $user);
$stmt->bind_result($testUsername);
$stmt->execute();
$stmt->store_result();
$stmt->fetch();
if($stmt->num_rows > 0)
{
echo "taken";
}
else
{
$stmt = $link->prepare("INSERT INTO users (username, password) VALUES(?, ?)");
$stmt->bind_param("ss", $user, $pass);
$stmt->execute();
echo "success";
}
答案 1 :(得分:1)
我相信你有一个解析错误,这在PHP的更高版本中得到修复。以下代码行无效< = PHP 5.4:
if (mysqli_fetch_array($result)[0] == $user) {
要解决此问题,您需要将该行更改为以下内容:
$row = mysqli_fetch_array($result);
if ($row[0] == $user) {
此外,您的代码也有一个非常严重的SQL注入漏洞。在查询中使用变量之前,需要清理变量。对于整数和浮点数,我建议您执行以下操作:
$myInt = (isset($_POST['myInt']) ? (int)$_POST['myInt'] : null);
$myFloat = (isset($_POST['myFloat']) ? (float)$_POST['myFloat'] : null);
对于字符串,您应该使用mysqli_real_escape_string()
,如下所示:
$myStr = (isset($_POST['myStr']) ? mysqli_real_escape_string($_POST['myStr']) : null);
在您的情况下,您的$user
和$pass
变量需要进行清理,因为字符串在上面。强迫您通过$_POST
接收的数字类型的原因在于它完全否定了某人通过无效值的任何可能性。任何不是0,1,2,3,4等被强制转换为(int)的东西都将变为0。