Php mysql\u real\u escape\u string()在mysql中留下斜杠

Php mysql\u real\u escape\u string()在mysql中留下斜杠,php,mysql,mysql-real-escape-string,Php,Mysql,Mysql Real Escape String,我刚搬到一家新的托管公司,现在每当字符串被转义时,使用: mysql_real_escape_string($str); 斜杠保留在数据库中。这是我第一次看到这种情况发生,所以我的脚本都没有使用 stripslashes() 再也没有了 这是在lighttpd 1.4服务器上运行PHP5.2.6作为fastcgi的CentOS 4.5 64位上实现的。我已经确保所有magic_quotes选项都已关闭,mysql客户端api为5.0.51a 我的6个Web服务器上都有相同的问题 任何帮助都将

我刚搬到一家新的托管公司,现在每当字符串被转义时,使用:

mysql_real_escape_string($str);
斜杠保留在数据库中。这是我第一次看到这种情况发生,所以我的脚本都没有使用

stripslashes()
再也没有了

这是在lighttpd 1.4服务器上运行PHP5.2.6作为fastcgi的CentOS 4.5 64位上实现的。我已经确保所有magic_quotes选项都已关闭,mysql客户端api为5.0.51a

我的6个Web服务器上都有相同的问题

任何帮助都将不胜感激

谢谢

编辑:
魔术师的名言没有打开。请不要建议关闭它。这不是问题。
mysql\u real\u escape\u string($str)
应该正是这样做的。这意味着在特殊字符中添加反斜杠,特别是当您希望将查询传递给mysql时。注意,它还考虑了mysql的字符集


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

您移动的主机可能已启用
magic\u quotes\u runtime
。您可以使用
set\u magic\u quotes\u runtime(0)
将其关闭


请关闭
magic\u quotes\u runtime
,然后将代码更改为使用绑定变量,而不是使用字符串转义。

听起来好像打开了magic quotes。关闭它并不难:只需在根目录中创建一个名为
.htaccess
的文件,并将这一行放入其中:

php_flag magic_quotes off
如果出于任何原因无法实现,或者您希望更改应用程序以处理魔术引号,请使用以下技术:

不要直接访问请求变量,而是使用函数。然后,该函数可以检查magic quotes是否打开或关闭,并相应地去掉斜杠。简单地对所有内容运行stripslashes()是行不通的,因为您将摆脱实际需要的斜杠

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

$x = getVar('x');

现在您已经知道了,所有传入的变量都准备好再次转义,并且
mysql\u real\u escape\u string()
不会将它们塞满。

您可能已经打开了神奇的引号。在PHP中,准确地知道如何关闭它可能是一个相当头疼的问题。虽然可以使用
set\u magic\u quotes\u runtime(0)
关闭magic quotes,但这还不够——magic quotes此时已经更改了输入数据,因此必须撤消更改。请尝试使用以下代码段:


或者更好的方法是禁用
php.ini
中的魔法引号,以及它可能设置在的任何.htaccess文件。

下面的函数将在插入数据库之前正确删除斜杠。我知道你说过magic quotes没有打开,但是有东西添加了斜杠,所以请尝试下一页并查看输出。这将有助于找出在哪里。调用page.php?var=something-with'data\u that;会逃走吗

您很可能会看到数字3输出的斜杠比需要的多

*也更改数据库详细信息

<?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;
}

我能想到许多可能导致这种情况的因素。但这取决于调用SQL查询的方式。如果您转而使用参数化查询(如PDO),则不需要转义,这意味着调用
mysql\u real\u escape\u string
会添加额外的斜杠

如果您使用的是
mysql\u query
等,那么肯定有一些代码像
addslashes
这样做。这可能是在数据进入数据库之前,也可能是之后

你还说你已经禁用了魔法引号。。。如果您还没有,只需使用以下内容在代码中进行硬检查:

echo htmlentities($_GET['value']); // or $_POST, whichever is appropriate
确保该值中没有斜杠,然后还要检查以下内容:

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

我知道你多次说过这不是神奇的引用,但对于我们这些试图帮助的人来说,我们需要确保你检查了实际的PHP输出,而不是仅仅更改配置(这可能不起作用)。

我不确定我是否正确理解这个问题,但我也遇到了同样的问题。不管我做了什么,当绳子逃脱时,伤口都在那里。因为我需要插入的值与输入的格式完全相同,所以我使用了

htmlentities($inserted_value)
这将使所有插入的引号保持不变,但无害

斜杠保留在数据库中

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

有两个可能的原因:

  • 不管你的感觉如何,神奇的格言都会出现。再检查一遍

  • 您的应用程序中有一些代码,它们只是模仿魔术引号行为,转义所有输入。
    使用通用转义函数“保护”所有传入数据是一种常见的误解。虽然它没有任何好处,但它也对这种情况负责。
    当然,只需找到该函数并将其删除即可


  • 您在同一个变量上多次使用
    mysql\u real\u escape\u string()
    可能会有什么问题(这是我们的问题)。当您多次使用它时,它会添加斜杠。

    在非转义字符串上运行stripslashes()不会也删除好的斜杠吗?斜杠只用于转义正在插入的字符串,它们不应该在数据库中结束。您不必对从数据库中提取的数据运行stripslashes()。当使用mysql\u real\u escape\u string($str)时,slashes也将从\转义到\\;如果在同一文本中使用stripslashes(),则它将删除任何额外的斜杠,最终得到1个斜杠。如果您回显SQL语句,它们是否具有正确的斜杠?是。MySQL在插入时会在字符串中留下斜杠,就像我调用addslashes()一样。使用PDO,所有的转义和注入问题都会消失。Eric,你有没有找到解决方案?我也只是换了主机,发现了同样的问题。当然,Have varified magic_quotes处于禁用状态。请注意,您可能无法始终在.htaccess文件中禁用magic_quotes。如果