1

我阅读了很多关于常见 sql 注入的内容,因此对如何修复它们很感兴趣。在我只是习惯于 addslashes()(糟糕地)认为它会适合之前。然后我发现它mysql(i)_real_escape_string()addslashes(). 从那时起我就开始使用mysqli_real_escape_string(),但最近我遇到了一些我还没有真正理解的东西。我在将数据发送到 mysql 和字符集时遇到了一些问题。所以,我再一次搜索,许多用户说SET NAMES UTF8这是让一切顺利的方法。但是后来我读到使用该查询mysqli_real_escape_string()无法正常工作。

所以毕竟我有点困惑。

转义sql语句的正确方法是什么?

有哪些可能的漏洞利用SET NAMES UTF8

mysqli_set_charset()使连接以指定字符集进行通信的正确方法是什么?

使用mysqli_sey_charset()过程中mysql的内部变量是否发生了变化?

谢谢

4

4 回答 4

2

您可以使用mysqli 准备好的语句来避免 SQL 注入 - 无需担心字符集编码。

链接中的一个示例:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
    $stmt->close();
}

/* close connection */
$mysqli->close();
?>
于 2012-08-08T11:42:38.607 回答
0

由于向后兼容性问题,仅支持传递手动构造的查询。现代应用程序永远不应该这样做,而是使用准备好的语句。

话虽如此,如果您对使用手动构造的查询一无所知,那么逃避它们的正确方法是使用 mysql_real_escape_string(),并将编码设置为 UTF-8。

您可以在 OWASP 网站上找到更多详细信息:https ://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

于 2013-03-08T22:11:27.157 回答
0

只要你明确设置连接对象的字符集,你应该没问题:

mysql_set_charset('utf8', $db); // for mysql
$db->set_charset('utf8'); // for mysqli

字符集的相同问题适用于 PDO 准备语句,因此 PDO 是推荐的方式,但在这种情况下它并不能使您安全。

mysqli_real_escape_string()使用已定义的字符集没有问题。注意你对连接对象和 HTML 页面使用 UTF-8,这样可以避免很多问题。

我找到的关于这个主题的最佳解释是由 PHP 作者 ircmacell 编写的,一次用于mysql_real_escape_string(),一次用于PDO

于 2013-03-08T23:35:31.267 回答
0

只是为了纠正问题和答案中的许多错误信息。

  1. 不是“语句”,而是字符串文字。转义“SQL 语句”是一种直接的注入方式。只有字符串必须转义,而其他查询部分需要不同且完全不同的格式,转义对他们没有丝毫好处。
  2. 所有这些转义/编码混乱只与一些边缘编码有关,如 GBK。使用 UTF-8,您甚至可以使用 addlashes()
  3. 由于 5.3 PDO 可以设置客户端编码,只要在 DSN 中设置。

转义sql语句的正确方法是什么?

在 PHP 中向数据库提交字符串时,我应该使用 htmlspecialchars() 处理非法字符还是使用正则表达式?

使用 SET NAMES UTF8 的可能漏洞是什么?

没有任何

mysqli_set_charset() 是使连接以指定字符集进行通信的正确方法吗?

当然。
它必须使用 HTML 页面上使用的实际字符集。

于 2013-03-09T05:37:48.160 回答