我想有一个功能行为作为mysql_real_escape_string而不连接到数据库,因为有时我需要做干测试没有数据库连接。mysql_escape_string已被弃用,因此是不可取的。我的一些发现:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
发布于 2009-07-22 00:44:11
根据mysql_real_escape_string函数参考页面:"mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它转义以下字符:\x00、\n、\r、\、‘、“和\x1a。”
考虑到这一点,在你发布的第二个链接中给出的函数应该完全符合你的需要:
function mres($value)
{
$search = array("\\", "\x00", "\n", "\r", "'", '"', "\x1a");
$replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");
return str_replace($search, $replace, $value);
}
发布于 2009-07-22 04:38:33
与我的另一个答案相反,下面的函数可能是安全的,即使使用多字节字符也是如此。
// replace any non-ascii character with its hex code.
function escape($value) {
$return = '';
for($i = 0; $i < strlen($value); ++$i) {
$char = $value[$i];
$ord = ord($char);
if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
$return .= $char;
else
$return .= '\\x' . dechex($ord);
}
return $return;
}
我希望比我更有见识的人能告诉我为什么上面的代码不能工作……
发布于 2009-07-25 07:48:35
通过进一步的研究,我发现:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
安全修复:
在多字节编码处理中发现了一个SQL注入安全漏洞。错误存在于服务器中,无法正确解析使用mysql_real_escape_string() C函数转义的字符串。
此漏洞由Josh Berkus和Tom Lane发现并报告,作为OSDB联盟项目间安全协作的一部分。有关SQL注入的更多信息,请参阅以下文本。
讨论。在多字节编码处理中发现了一个SQL注入安全漏洞。SQL注入安全漏洞可能包括这样一种情况:当用户提供要插入到数据库中的数据时,用户可能将SQL语句注入到服务器将执行的数据中。对于此漏洞,当使用字符集未知转义(例如,PHP中的addslashes() )时,可以绕过某些多字节字符集中的转义(例如,SJIS、BIG5和GBK)。因此,addslashes()之类的函数无法防止SQL注入攻击。在服务器端修复这个问题是不可能的。对于应用程序来说,最好的解决方案是使用mysql_real_escape_string()这样的函数提供的字符集感知转义。
但是,在MySQL服务器解析mysql_real_escape_string()输出的方式中检测到了一个错误。因此,即使使用了字符集感知函数mysql_real_escape_string(),SQL注入也是可能的。此错误已修复。
解决方法。如果您无法将MySQL升级到包含mysql_real_escape_string()解析中的错误修复的版本,但运行MySQL 5.0.1或更高版本,则可以使用NO_BACKSLASH_ESCAPES SQL模式作为变通方法。(此模式是在MySQL 5.0.1中引入的。)NO_BACKSLASH_ESCAPES启用了标准兼容模式,其中反斜杠不被视为特殊字符。结果将是查询将失败。
要为当前连接设置此模式,请输入以下SQL语句:
SET sql_mode='NO_BACKSLASH_ESCAPES';
您还可以为所有客户端全局设置模式:
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
当服务器启动时,也可以通过使用命令行选项-- SQL - mode =NO_BACKSLASH_ESCAPES或在服务器选项文件(例如,my.cnf或my.ini,取决于您的系统)中设置sql-mode=NO_BACKSLASH_ESCAPES来自动启用此sql模式。(Bug#8378,CVE-2006-2753)
另请参见Bug#8303。
https://stackoverflow.com/questions/1162491
复制相似问题