mysql_real_escape_string()在MySQL中留下斜杠

时间:2008-10-06 04:33:30

标签: php mysql mysql-real-escape-string

我刚搬到新的托管公司,现在每当使用以下字符串进行转义时

mysql_real_escape_string($str);

斜杠保留在数据库中。这是我第一次看到这种情况发生,因此我的脚本都没有使用

stripslashes()

了。

这是在一个运行php 5.2.6的CentOS 4.5 64bit上作为lighttpd 1.4服务器上的fastcgi。我确保所有magic_quotes选项都关闭,mysql客户端api是5.0.51a。

我在所有6个网络服务器上都遇到了同样的问题。

任何帮助都将不胜感激。

感谢。

编辑:

Magic Quotes未开启。请不要建议将其关闭。这不是问题。

9 个答案:

答案 0 :(得分:16)

您移动的主持人可能已启用magic_quotes_runtime。您可以使用set_magic_quotes_runtime(0)将其关闭。

请关闭magic_quotes_runtime,然后更改代码以使用绑定变量,而不是使用字符串转义。

答案 1 :(得分:4)

我可以想到许多可能导致这种情况的事情。但这取决于您如何调用SQL查询。如果你移动使用像PDO这样的参数化查询,则不需要转义,这意味着对mysql_real_escape_string的调用正在添加额外的斜杠。

如果你正在使用mysql_query等,那么必须有一些像addslashes这样的代码。这可能是在数据进入数据库之前,也可能是在数据之后。

另外你说你已经禁用了魔法引号......如果你还没有,只需在代码中用这样的东西进行一次硬盘检查:

echo htmlentities($_GET['value']); // or $_POST, whichever is appropriate

确保该值中没有斜杠,然后检查:

echo "Magic quotes is " . (get_magic_quotes_gpc() ? "ON" : "OFF");

我知道你已多次说它不是魔术引号,但对于我们这些人来说,我们需要确保你已经检查了实际的PHP输出,而不仅仅是更改了配置(这可能没有用)

答案 2 :(得分:2)

听起来好像你打开了魔法引号。关闭它并不太难:只需在名为.htaccess的根目录中创建一个文件并将其放入其中:

php_flag magic_quotes off

如果由于某种原因无法实现,或者您想更改应用程序以便能够处理魔术引号,请使用此技术:

不是直接访问请求变量,而是使用函数。然后,该函数可以检查魔术引号是打开还是关闭,并相应地去掉斜杠。简单地在一切上运行stripslashes()是行不通的,因为你将摆脱你真正想要的斜线。

function getVar($key) {
    if (get_magic_quotes_gpc()) {
        return stripslashes($_POST[$key]);
    } else {
        return $_POST[$key];
    }
}

$x = getVar('x');

现在您已经准备好了,所有传入的变量都可以再次转义,mysql_real_escape_string()不会填满它们。

答案 3 :(得分:2)

  

斜杠保留在数据库中。

这意味着您的数据会被双重转义。

有两个可能的原因:

    尽管你有这种感觉,
  1. 魔术引语仍然。仔细检查

  2. 您的应用程序中有一些代码,只是模仿魔术引号行为,逃避所有输入。
    这是一种非常常见的误解,它具有一般的转义函数来“保护”所有传入的数据。虽然它没有任何好处,但它也对这样的案件负责。
    这样 - 只需找到该功能并将其擦除即可。

答案 4 :(得分:0)

你必须打开魔法引号。弄清楚如何关闭它可能是PHP中的一个令人头痛的问题。虽然您可以使用set_magic_quotes_runtime(0)关闭魔术引号,但这还不够 - 此时魔术引号已经改变了输入数据,因此您必须撤消更改。尝试使用此代码段:http://talks.php.net/show/php-best-practices/26

或者更好 - 禁用php.ini中的魔术引号,以及可以设置的任何.htaccess文件。

答案 5 :(得分:0)

我不确定我是否正确理解了这个问题,但我遇到了同样的问题。无论我做了什么,当字符串被逃脱时,斜线就在那里。因为我需要插入的值与我输入的格式完全相同

htmlentities($inserted_value)

这会使所有插入的引号都没有转义但无害。

答案 6 :(得分:0)

在同一个var上多次使用mysql_real_escape_string()会出现什么问题(与我们同在)。多次使用时,会添加斜杠。

答案 7 :(得分:-1)

下面的函数将在插入数据库之前正确删除斜杠。我知道你说魔术引号没有打开,但有些东西正在添加斜线,所以请尝试以下页面并查看输出。它将有助于弄清楚在哪里。使用page.php调用?var = something-with'data_that; will`be | escape

您很可能会看到第三个输出比所需更多的斜杠。

*也可以更改数据库详细信息。

<?php

$db = mysql_connect('host', 'user', 'pass');

$var = $_REQUEST['var'];
echo "1: $var :1<br />";
echo "2: ".stripslashes($var)." :2<br />";
echo "3: ".mysql_real_escape_string($var)." :3<br />";
echo "4: ".quote_smart($var)." :4<br />";


function quote_smart($value)
{
    // Stripslashes is gpc on
    if (get_magic_quotes_gpc())
    {
        $value = stripslashes($value);
    }
    // Quote if not a number or a numeric string
    if ( !is_numeric($value) )
    {
        $value = mysql_real_escape_string($value);
    }
    return $value;
}

&GT;

答案 8 :(得分:-4)

mysql_real_escape_string($str);应该这样做。它旨在向特殊字符添加反斜杠,尤其是当您要将查询传递给mysql时。请注意,它还考虑了mysql的字符集。

对于更安全的编码实践,最好编辑代码并使用stripslashes()读取数据并删除斜杠。