PHP当字符串是mysqli_real_escape_string的两倍时会发生什么

时间:2010-01-14 15:50:02

标签: php mysql escaping

我正在使用mysqli。

当我回复mysqli_real_escape_string($db,mysqli_real_escape_string($db,'"'));

其中一个将是输出: 1. \" 2. \\\"

有没有一种安全的方法来检查字符串是否已经被转义?

不幸的是,我目前无法测试,因为我无法在24小时内访问MySQL。

6 个答案:

答案 0 :(得分:7)

输出为\\\"(您的第二个示例)。

我认为您无法可靠地说出某个字符串是否已被转义,您应该以一种只能拨打mysqli_real_escape_string()一次的方式整理代码。

答案 1 :(得分:3)

您无法判断字符串是否已被转义,因为已转义的字符串也可能已输入用户(因此未转义)。

答案 2 :(得分:2)

结果字符串为\\\"(转义两个字符中的每一个)。

如果“安全”你的意思是“万无一失”,那么没有。即使您检查相关字符是否已转义,您也无法知道假设是否为\",并且字符串不提供任何可设置为标记的隐藏标志它已被逃脱。

但是,您不应该手动调用mysqli_real_escape_string两次。只在你需要的时候才这样做。

“双重逃避”的主要来源是当你通过逃避做正确的事情时,但是如果它们打开,它们都不会关闭魔法引号或删除它们。

*嗯,尽可能接近不使用参数化查询。

答案 3 :(得分:1)

第二个将被退回。 "将首先转换为\"(转义为"),然后转换为\\\"(转义\")。

一般来说,你必须自己做。虽然有“功能”Magic Quotes确实会在字符'"\和输入数据中的NULL字符中添加反斜杠,但魔术引号太可怕了发明并将在PHP 6中删除。此外,它们可以在一台服务器上启用,在另一台服务器上禁用。所以它甚至不可靠。

但更重要的是,它们不适合MySQL,因为你不仅需要处理这些元字符,还需要处理其他字符(有关更多信息,请参阅string syntax in MySQL)。

答案 4 :(得分:1)

多次调用mysqli_real_escape_string()不会降低查询的安全性。但它会破坏您的数据。柯南奥布莱恩就是一个很好的例子。

如果您执行以下操作:

$name=mysqli_real_escape_string($db,mysqli_real_escape_string($db,"Conan O'Brien"));
//At this point $name is Conan O\\\'Brien
mysql_query("insert into table (name)values('$name')")
//In the database the name will be stored as: Conan O\'Brien  Which is corrupt.   

要处理此损坏,您可以执行以下操作:

funciton strip_all($var){
    $len=strlen($var);
    $ret=stripslashes($var);
    while($len!=strlen($ret)){
        $len=strlen($ret);
        $ret=stripslashes($ret);
    }
    return ret;
}
//$name is unkown somthing like: Conan O\\\\\\\'Brien
$name=strip_all($name);
//$name is: Conan O'Brien
$name=mysqli_real_escape_string($db,$name);
//$name is: Conan O\'Brien,  which is properly escaped.
mysql_query("insert into table (name)values('$name')")
//In the database the value is Conan O'Brien,  mysql will eat the back slash. 

最好的方法是跟踪逃跑的来源。在这种情况下,我们考虑是否禁用或启用magic_quotes,然后我们使用mysqli_real_escape_string(),它提供更好的安全性,因为它可以逃避更多的字符。

if(get_magic_quotes_gpc())
{
   $name=stripslashes($_GET[name]);
}
$name=mysqli_real_escape_string($db,$_GET[name]);
//At this point $name is Conan O\'Brien
mysql_query("insert into table (name)values('$name')")

答案 5 :(得分:0)

添加一些额外信息。

转义是一种在不引入额外符号的情况下向符号序列添加额外信息的方法。为此,至少有一个符号可用作“转义”符号。这意味着原始角色丢失,需要使用转义序列添加。

示例:

我们有一个包含3个符号的语言:a,b和c。其中符号具有以下功能:

Language 1
a has the function A
b has the function B
c has the function C

我们现在需要介绍函数D和E,但我们无法添加额外的符号。

所以我们可以使用转义符号来执行此操作:

Language 2
a, is now the escape symbol.
aa has the function A
ab had the function D
ac has the function E
b  has the function B
c  has the function C

序列aabcabac,如果使用语言1解释,则读取AABCABAC。但使用语言2解释读取ABCDE。

问题在于,大多数情况下,您无法确定符号中使用的语言。需要在处理数据之前提供此元信息。

botom系列是你没有安全的方法来确定字符串是否足够转义。