12

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

mysql_real_escape_string($str);

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

stripslashes()

了。

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

我的所有 6 个网络服务器都有相同的问题。

任何帮助,将不胜感激。

谢谢。

编辑:

魔术行情未开启。请不要建议关闭它。这不是问题。

4

9 回答 9

16

您移动的主机可能已magic_quotes_runtime打开。您可以使用 将其关闭set_magic_quotes_runtime(0)

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

于 2008-10-06T05:00:22.650 回答
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 输出,而不仅仅是更改配置(这可能不起作用)。

于 2009-12-19T10:40:22.703 回答
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()不会把它们塞满。

于 2008-10-06T06:50:39.933 回答
2

斜线保留在数据库中。

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

有2个可能的原因:

  1. 尽管您有感觉,但魔术报价仍在播放。仔细检查一下

  2. 您的应用程序中有一些代码,它们只是模仿魔术引号行为,转义所有输入。
    这是一个非常常见的误解,即拥有一个通用的转义功能来“保护”所有传入的数据。虽然它根本没有好处,但它也对这种情况负责。
    如此 - 只需找到该功能并将其清除即可。

于 2013-01-11T09:12:16.060 回答
0

您可能必须打开魔术引号。弄清楚如何关闭它在 PHP 中可能是一件非常头疼的事情。虽然您可以使用 关闭魔术引号set_magic_quotes_runtime(0),但这还不够——魔术引号此时已经更改了输入数据,因此您必须撤消更改。试试这个片段:http ://talks.php.net/show/php-best-practices/26

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

于 2008-10-06T19:56:11.017 回答
0

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

htmlentities($inserted_value)

这将使所有插入的引号不转义但无害。

于 2012-09-12T17:26:15.457 回答
0

mysql_real_escape_string()您在同一个 var 上多次使用的问题(与我们有关)可能是什么问题。当您多次使用它时,它会添加斜杠。

于 2013-01-11T09:28:55.907 回答
-1

Function below will correctly remove slashes before inserting into the database. I know you said magic quotes isn't on but something is adding slashes so try the following page and see the output. It'll help figure out where. Call with page.php?var=something-with'data_that;will`be|escaped

You will most likely see number three outputting more slashes than needed.

*Change the db details too.

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

?>

于 2009-05-01T19:27:53.113 回答
-4

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

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

于 2008-10-06T04:57:32.140 回答