gpt4 book ai didi

php - mysqli_real_escape_string() 中默认字符集的安全隐患是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 00:42:36 27 4
gpt4 key购买 nike

在 mysqli_real_escape_string() 的 PHP 文档中,写道

Caution Security: the default character set

The character set must be set either at the server level, or with the API function mysqli_set_charset() for it to affect mysqli_real_escape_string().

来源mysqli_real_escape_string

在关于字符集的进一步链接中,提到

The character set should be understood and defined, as it has an affect on every action, and includes security implications.

来源 Character sets

为什么为了安全需要设置字符集,它包含哪些安全隐患?任何人都可以解释这些线条背后的概念吗?

提前致谢

最佳答案

SQL 查询的解析方式取决于连接字符集。如果您执行此查询:

$value = chr(0xE0) . chr(0x5C);
mysql_query("SELECT '$value'");

然后如果连接字符集是 Latin-1 MySQL 将看到无效的:

SELECT 'à\'

而如果字符集是 Shift-JIS,字节序列 0xE0,0x5C 将被解释为双字节字符:

SELECT '濬'

为安全添加字符串文字转义:

$value = mysql_real_escape_string($value);
mysql_query("SELECT '$value'");

现在,如果您使用 mysql_set_charset 将连接字符集正确设置为 Shift-JIS,MySQL 仍会看到:

SELECT '濬'

但是如果你没有设置连接字符集,MySQL的默认字符集是Shift-JIS而PHP的默认字符集是ASCII,PHP不知道尾随的0x5C字符是双字节序列的一部分,并转义它,认为它正在生成有效输出:

SELECT 'à\\'

当 MySQL 使用 Shift-JIS 读取它时:

SELECT '濬\'

尾随 ' 用反斜杠转义,这使字符串文字保持打开状态。查询中的下一个 ' 字符将结束字符串,留下原始 SQL 内容中的任何内容。如果您可以在那里注入(inject),则查询很容易受到攻击。

此问题仅适用于少数东亚编码,如 Shift-JIS,其中多字节序列可以包含字节,这些字节本身就是有效的 ASCII 字符,如反斜杠。如果不匹配的编码都将低字节始终视为 ASCII(严格的 ASCII 超集,例如 Latin-1 与 UTF-8 之间更常见的不匹配),就不可能出现这种混淆。

幸运的是,默认使用这些编码的服务器并不常见,因此在实践中这是一个很少被利用的问题。但是如果您必须使用mysql_real_escape_string,您应该正确地使用它。 (不过最好通过使用参数化查询来完全避免它。)

关于php - mysqli_real_escape_string() 中默认字符集的安全隐患是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com