首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无需连接到数据库即可替代mysql_real_escape_string

无需连接到数据库即可替代mysql_real_escape_string
EN

Stack Overflow用户
提问于 2009-07-22 00:38:49
回答 3查看 125.8K关注 0票数 95

我想有一个功能行为作为mysql_real_escape_string而不连接到数据库,因为有时我需要做干测试没有数据库连接。mysql_escape_string已被弃用,因此是不可取的。我的一些发现:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

EN

回答 3

Stack Overflow用户

发布于 2009-07-22 00:44:11

根据mysql_real_escape_string函数参考页面:"mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它转义以下字符:\x00、\n、\r、\、‘、“和\x1a。”

考虑到这一点,在你发布的第二个链接中给出的函数应该完全符合你的需要:

代码语言:javascript
复制
function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}
票数 69
EN

Stack Overflow用户

发布于 2009-07-22 04:38:33

与我的另一个答案相反,下面的函数可能是安全的,即使使用多字节字符也是如此。

代码语言:javascript
复制
// 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;
}

我希望比我更有见识的人能告诉我为什么上面的代码不能工作……

票数 29
EN

Stack Overflow用户

发布于 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语句:

代码语言:javascript
复制
SET sql_mode='NO_BACKSLASH_ESCAPES';

您还可以为所有客户端全局设置模式:

代码语言:javascript
复制
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。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1162491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档