mysqli_real_escape_string安全吗?一点也不

2022-08-30 23:13:44

我是PHP的新手,我意识到我的数据库连接,使用php表单(带有用户和传递文本输入)是完全不安全的:

这是有效的,但不安全:

<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$_POST['usuario'].'" 
        AND pass="'.$_POST['usuario'].'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

所以,我读了关于mysqli_real_escape_string,并决定尝试一下:

<?php    
$link=mysqli_connect('localhost','xx','xx','xx');
$usuario=mysqli_real_escape_string($link, $_POST["usuario"]);
$clave=mysqli_real_escape_string($link, $_POST["clave"]);
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$usuario.'" 
        AND pass="'.$clave.'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

这是正确的吗?这是如何使用mysqli_real_escape_string的一个很好的例子吗?


答案 1

这是正确的吗?

是的。这个孤立的精心挑选的例子是安全的。但是,这并不意味着mysqli_real_escape_string应该被视为一个旨在防止SQL注入的函数。因为在此示例中,它只是偶然保护您。

这是如何使用mysqli_real_escape_string的一个很好的例子吗?

一点也不

应放弃此函数,转而在查询中使用参数。此函数将使除字符串文本以外的任何查询部分失败。甚至可能被忽视。

必须改用占位符(也称为参数)来表示查询中的数据:

$sql='SELECT * FROM usuarios WHERE username=?';
$stmt= $conn->prepare($sql);
$stmt->bind_param("s", $_POST['usuario']);
$stmt->execute();
$rs = $stmt->get_result();

请参阅我文章中有关正确使用 mysqli 的其他示例

如果曾经使用过,这个函数必须封装到另一个函数中,该函数可以执行转义和添加引号,就像这样做一样。只有这样,它才是安全的。PDO::quote()


答案 2

mysqli()函数的使用应该只保留给框架开发人员和其他意识到它可能带来的所有安全问题的人。对于其他所有人来说,都有PDO。它和mysqli()一样易于使用,而且更安全。


推荐