【问题标题】:"slash before every quote" problem [duplicate]“每个报价前的斜线”问题[重复]
【发布时间】:2011-03-01 16:31:24
【问题描述】:

我有一个包含表单的 php 页面。

有时此页面会提交给自身(例如上传图片时)。

我不希望用户一次又一次地填写每个字段,因此我将其用作表单内文本输入的值:

value="<?php echo htmlentities(@$_POST['annonsera_headline'],ENT_COMPAT,'UTF-8');?>">

这可行,除了它在每个双引号之前添加一个“\”符号...

例如在页面提交给自身后写 19" 轮子:

  19\" wheels

如果我什至不使用 htmlentities,那么引号之后的所有内容都会消失。

这里有什么问题?

更新:

好的,所以问题是 magic_quotes...这是在我的服务器上启用的...

我应该禁用它吗?我有 root 访问权限,它是我的服务器 :)

禁用它有什么害处?

【问题讨论】:

  • get_magic_quotes_gpc() 的输出是什么?
  • 禁用它的危害:如果您正确编程,则没有。保留它的危害:如果您出于某种原因禁用它或将脚本复制到没有它的机器上,您往往会依赖它被激活并打开可怕的安全漏洞。正确意味着:每个输出都通过 htmlentities 运行,每个数据库输入都使用参数(最好)或正确转义(可以接受,但有时您可能会忘记它)。

标签: php mysql html security


【解决方案1】:

这实际上是 PHP trying to be security conscious 的一个函数,幸运的是有一个简单的修复方法,看起来像这样:

if (get_magic_quotes_gpc()) {$var = stripslashes($var);}

启用它并没有什么大问题,这取决于个人喜好。如果您的代码将大量移动服务器并且您无法通过 php.ini 文件禁用它,那么最好使用上述内容。

如果您可以访问您的 php.ini 文件并且想要更改它,因为您不想每次都验证它,您可以将以下行添加到 php.ini

magic_quotes_gpc = Off

或将以下内容添加到您的 .htaccess 中:

php_flag magic_quotes_gpc Off

希望这有助于解决问题。

【讨论】:

    【解决方案2】:

    您似乎开启了magic quotes。使用 stripslashes 与您要处理的任何文本一起使用以下条件:

    if(get_magic_quotes_gpc())
    {
       $your_text = stripslashes($your_text);
    }
    

    现在你可以正常处理$your_text变量了。

    更新:

    魔术引号是 exaplained here。对于编写良好的代码,禁用它通常没有害处。

    【讨论】:

      【解决方案3】:

      是的,如果可以的话,您应该禁用魔术引号。该功能已弃用,将来可能会完全消失。 如果您依赖魔术引号来转义数据(例如将其插入数据库时​​),如果您禁用它,您可能会面临 sql 注入漏洞。您应该检查所有查询并确保您使用的是mysql_real_escape_string()

      我包含以下文件以撤消部署到不受我控制的服务器的应用程序中的魔术引号。

      <?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】:

        您可能打开了magic quotes。你也需要stripslashes()它。

        最好的方法是将其包装在一个函数中:

        function get_string($array, $index, $default = null) {
            if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
                return get_magic_quotes_gpc() ? stripslashes($value) : $value;
            } else {
                return $default;
            }
        }
        

        你可以用作什么

        $annonsera_headline = get_string($_POST, 'annonsera_headline');
        

        顺便说一句:

        如果我什至不使用 htmlentities,那么引号之后的所有内容都会消失。

        它实际上仍然存在于 HTML 源代码中,只是您看不到它。做一个查看源代码 ;)


        更新根据您的更新:magic quotes 用于防止 SQL injection attacks 出现在初学者代码中。您经常在第 3 方主持人中看到这一点。如果你真的知道你在代码中做什么,那么你可以安全地关闭它。但是如果你想让你的代码可分发,那么在收集请求参数时你真的会考虑到这一点。为此,上面的函数示例非常适合(您只需要自己编写类似的get_boolean()get_number()get_array() 函数)。

        【讨论】:

          【解决方案5】:
          1. 在向输入字段值写入内容时,不应使用 htmlentities()。
          2. 您的服务器上是否启用了magic_quotes?在输出之前尝试使用 stripslashes。

          【讨论】:

          • 那我应该用什么来代替 htmlentities?
          • 如果内容可能来自用户输入($_POST['annonsera_headline'] 显然是这样做的),您应该始终使用 htmlentities,即使它是通过数据库传递的。如果你不这样做,那么你就会得到一个跨站点脚本 (XSS) 漏洞,因为人们可能会找到一种将 javascript 或他们自己的 HTML 注入页面的方法,甚至可能重定向表单输入(这对登录尤其有害)。
          • @oezi htmlentities() 有什么问题?
          • 它是输入字段的值。如果你在这种情况下使用 htmlentities,你会看到类似 &或 ä在那里,这不是应该的! XSS 不可能来自输入值。非常感谢您毫无意义的投票...
          • @Camran 用于我使用的文本字段数据function dequote($instr) { return str_replace("'", '&amp;#39;', str_replace('"', '&amp;#34;', $instr)); }
          【解决方案6】:

          您的服务器似乎设置为使用Magic Quotes

          您可以通过stripslashes 或更好的turning off Magic Quotes 剥离它们来修复它。

          【讨论】:

          • 根据我的第二句话-关闭魔术行情!他们是邪恶的。
          • 没那么邪恶。只是乱扔你的数据
          猜你喜欢
          • 2023-04-05
          • 1970-01-01
          • 2013-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-02
          相关资源
          最近更新 更多