-2

下面的代码在防止 MySQL 数据库上的 SQL 注入方面是否更好mysqli_real_escape_string

$str = "SELECT * FROM customers WHERE username = '; DELETE FROM customers WHERE 1 or username = '";
$str2 = "";

for($i = 0; $i < strlen($str); $i++)
{
    if (strpos ("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!0123456789", $str[$i], 0) !== FALSE)
    {
        $str2 = $str2 . $str[$i];
    }
}

echo "$str2";
4

3 回答 3

9

在尝试避免 SQL 注入时,绝对没有理由使用白名单/黑名单。mysqli_使用没有准备好的语句的函数时,您需要做的就是使用mysqli_real_escape_string().

但是,您最好学习准备好的语句。他们比逃跑更干净、更安全。

使用准备好的语句执行示例查询的代码如下所示:

$stmt = $conn->prepare('SELECT * FROM customers WHERE username = ?');
$stmt->bind_param('s', $username);
$result = $stmt->execute();

由于您不了解示例,这里有一个详细的解释:

  • 第 1 行准备语句。?每当您想使用外部数据时,您都可以使用。
  • 第 2 行为第一个占位符绑定了一个字符串 ( s) 参数。所以$username应该包含(不受信任的)值
  • 第 3 行使用先前绑定的参数执行语句。SQL 和数据是分开传输的,所以没有 SQL 注入风险。
于 2013-01-20T14:02:02.207 回答
2

下面的代码在防止 mysql 注入方面是否比 mysqli_real_escape_string 更好,还是没关系?

两者都不。情况更糟,你不应该这样做!而不是转义(!)数据(!!),您正在破坏您的整个查询。

简而言之,它将

  1. 使有效查询不起作用
  2. 不阻止恶意查询

即使您仅将您的方法应用于数据,而不是整个查询,它也会

  1. 弄乱你的数据
  2. 不阻止各种SQL注入
于 2013-01-20T14:12:59.997 回答
1

阅读这篇文章。在用户评论的底部,您会发现许多有用的 SQL 注入预防技巧和提示。但是,第一步是在将 GET/POST 数据插入查询之前验证和清理您的 GET/POST 数据。

于 2013-01-20T14:06:42.557 回答