魔术行情关闭,仍然大幅下滑

时间:2011-07-28 22:48:00

标签: php magic-quotes-gpc

我有$ _POST变量从带引号斜杠的标签传入。我知道魔术引号已关闭,并使用if(get_magic_quotes_gpc())语句来阻止它们。但是,斜杠仍在增加。那是为什么?

表格

<form method="POST" action="">
<input type="text" name="spe_set" />
<input type="submit" value="Submit" />
</form>

PHP

print_r($_POST['spe_set']); // if I wrote "Test's", this prints as "Test\'s"

所以,我做了,

if ( get_magic_quotes_gpc() )
    $tempvar = stripslashes($_POST['spe_set']);
else
    $tempvar = $_POST['spe_set'];

print_r($tempvar); // Still says "Test\'s"

3 个答案:

答案 0 :(得分:7)

我找不到任何在线参考get_magic_quotes_gpc()在网上任何地方返回错误结果,所以我会给你一个清单,试图缩小问题范围(这应该是评论,但它是方式太长了):

我要做的第一件事是尝试编辑php.ini文件以确保magic_quotes_gpc确实设置为关闭。尝试此操作的最佳位置是在与出现问题的脚本相同的目录中创建/编辑php.ini文件,因为这是在获取脚本之前可以覆盖INI设置的最后位置(并且global_quotes_gpc可以'被覆盖的时间低于脚本运行时已经完成的损坏。

php.ini文件中,添加以下行:

magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off

只有第一个会影响POST变量(“gpc”代表“Get,发布和Cookie”),但最好将它们全部设置好,因为它们都很糟糕。

设置这些行后,您可以确定魔法引号确实已关闭。如果这样可以解决问题,那么您需要在目录结构中向上查找它首先打开的位置。这可能位于更高目录的php.ini文件,.htaccess文件,甚至是您的http.conf文件中。如果你不确定你在这里做什么,你可能想让你的主人参与其中。

如果问题仍然存在,那么您应该检查脚本中对addslashes()函数的任何调用。如果您使用Linux,这很容易,因为您可以从项目的根目录运行命令grep -ir "addslashes" *。如果您在Windows上运行,则应该查看Cygwin,unxutils或其他unix层。我绝对喜欢 unxutils,这是我在Windows设置或新工作中安装的第一件事。

虽然我不明白为什么任何框架会内置这样的东西,但我想有些白痴可能会尝试它。出于这个原因,您可能应该确保grep超过您的框架文件。请务必检查框架提供的任何php.ini文件,尽管这应该包含在我上面已经描述的内容中。

最后,您应确保将error_reporting设置为E_ALL | E_STRICT。这可以从php.ini文件或使用error_reporting()函数完成。确保在任何其他PHP运行之前设置它。您应该始终使用最高的错误报告设置进行开发,这样您就可以在用户面前看到每个错误,无论它有多小。为确保您能够看到这些错误,请确保同时启用display errors

虽然您粘贴到问题中的代码示例是有效的,但我提到了error_reporting,以防万一它不是代码中的直接复制/粘贴,或者是否有其他代码导致错误。通过设置错误报告,您可以看到任何可能阻碍get_magic_quotes_gpc()stripslashes()正常运行的错误。如果您可以修复这些错误,则其余代码将按预期工作。

祝你好运。

答案 1 :(得分:2)

有时你会像旧的xtcommerce一样使用愚蠢的旧系统。 有一个文件/admin/includes/functions/compatibility.php,其功能可以自我完成“魔术”:

if (!get_magic_quotes_gpc()) {
    do_magic_quotes_gpc($_GET);
    do_magic_quotes_gpc($_POST);
    do_magic_quotes_gpc($_COOKIE);
}

..你应该通过编辑条件或删除它来阻止它。

答案 2 :(得分:1)

试试这段代码

$tempvar = str_replace('\\', '', $_POST['spe_set']);

它应该剥夺它们的确定性