我有$ _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"
答案 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']);
它应该剥夺它们的确定性