7

我有 $_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"
4

3 回答 3

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、Post和 Cookies”),但最好将它们全部设置好,因为它们都很糟糕。

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

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

虽然我不明白为什么任何框架都会内置这样的东西,但我想有些白痴可能会尝试它。出于这个原因,您可能应该确保您grep的框架文件也是如此。一定要检查php.ini框架提供的任何文件,尽管这应该在我上面已经描述的内容中涵盖。

最后,您应该确保设置error_reportingE_ALL | E_STRICT. 这可以通过php.ini文件或使用error_reporting()函数来完成。确保在任何其他 PHP 运行之前设置它。您应该始终使用最高的错误报告设置进行开发,这样您就可以在每个错误出现在用户面前之前看到它,无论它多么小。为确保您可以看到这些错误,还要确保也启用了显示错误。

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

祝你好运。

于 2011-07-29T01:28:52.577 回答
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);
}

..您应该通过编辑条件或将其删除来停止此操作。

于 2013-04-04T15:00:51.613 回答
1

试试这个代码

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

它应该绝对剥离它们

于 2011-07-28T23:06:34.403 回答