PHP一直在逃避我的表单的输入(在我的'后面添加\)

时间:2010-05-23 12:53:26

标签: php escaping magic-quotes

所以基本上当我输入撇号的东西时,比如约翰的自行车,它会回应约翰的自行车。以下代码:

<?php
$searchname = $_POST["name"] ;
echo "$searchname";

我的表单使用POST方法。有没有办法阻止这个?

另外,为了使输入大小写不敏感,我将如何处理此段?

$searchsport = $_POST['sport'];
$sportarray = array(
"Football" => "Fb01",
"Cricket" => "ck32",
"Tennis" => "Tn43",
);
if(isset($sportarray[$searchsport])){
header("Location: ".$sportarray[$searchsport].".html");
die;
}
    //what code is needed to make the if statement work? I've looked up some weird ways such as using array_change_key_case (which I clearly don't understand).

5 个答案:

答案 0 :(得分:5)

这很可能是因为您已启用 magic quotes ,请尝试以下操作:

if (get_magic_quotes_gpc())
{
  $searchname = stripslashes($_POST["name"]);
  echo "$searchname";
}
else
{
  $searchname = $_POST["name"];
  echo "$searchname";
}

事实上,您可以创建一个函数,而不是自动为您执行此操作:

function fixIt($str)
{
    if (is_array($str))
    {
        foreach ($str as &$value)
        {
            $value = fixIt($value);
        }

        return $str;
    }
    else
    {
        return stripslashes($str);
    }    
}

然后你可以做到:

$searchname = fixIt($_POST["name"]);
echo $searchname;

注意:您还可以禁用php.ini中的丑陋魔术引号,因为它们存在问题并且已正确弃用,并且不在PHP的未来版本中。

答案 1 :(得分:4)

有几种方法。

  1. 关闭php.ini中的magic_quotes_gpc

    magic_quotes_gpc = 0
    
  2. 在请求的开头,运行stripslashes

    if (get_magic_quotes_gpc() && !function_exists('FixMagicQuotesGpc')) {
        function FixMagicQuotesGpc($data) {
            if (is_array($data)) {
                foreach ($data as &$value) {
                    $value = FixMagicQuotesGpc($value);
                }
                return $data;
            } else {
                return stripslashes($data);
            }
        }
        $_GET = FixMagicQuotesGpc($_GET);
        $_POST = FixMagicQuotesGpc($_POST);
        $_REQUEST = FixMagicQuotesGpc($_REQUEST);
    }
    
  3. 编辑:添加了!function_exists部分。这样,你不必担心如果你之前运行它,它只是跳过它,如果它已经运行(由另一个文件等)

答案 2 :(得分:2)

这由magic_quotes_gpc配置变量控制。这真的很烦人(并且已弃用!)。

您应该在php.ini中将其关闭,或者询问您的网络托管服务商是否可以采取相关措施。

如果他们不能,您可以使用addslashesstripslashes手动转义/取消转义。但要注意 - 您应该使用比addslashes更安全的东西来提交数据库。 mysql_real_escape_string是更好的选择,或者是特定于您的数据库的函数:

答案 3 :(得分:0)

我在配置文件中包含以下脚本,以便在必要时修复魔术引号。这样我就不必担心主机的魔术引号设置了。

<?php

set_magic_quotes_runtime(0);

function _remove_magic_quotes(&$input) {
    if(is_array($input)) {
        foreach(array_keys($input) as $key) _remove_magic_quotes($input[$key]);
    }
    else $input = stripslashes($input);
}
if(get_magic_quotes_gpc()) {
    _remove_magic_quotes($_REQUEST);
    _remove_magic_quotes($_GET);
    _remove_magic_quotes($_POST);
    _remove_magic_quotes($_COOKIE);
}

return true;

?>

答案 4 :(得分:0)

Magic Quotes ...当PHP 6终于到来并删除这个不兼容的怪物时,我会非常高兴。

最好的解决方案是通过设置

在php.ini中关闭它
magic_quotes_gpc = Off

如果您无法访问php.ini但使用的是Apache,您也可以在.htaccess文件中禁用它:

php_flag magic_quotes_gpc Off

最后一个方案是在你的应用程序中禁用它。 PHP手册的Disabling Magic Quotes页面建议使用:

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>