【问题标题】:PHP Escaping query string variablesPHP转义查询字符串变量
【发布时间】:2011-04-07 05:17:01
【问题描述】:

我在我的 web 应用程序中创建了一个表单,它只有一个文本字段,并且该字段使用 GET 发布到 PHP 页面,但我观察到奇怪的行为。即当我在本地服务器上测试它时,接收到的文本是在文本字段中写入的,但是当我将它上传到我的在线服务器时,接收到的字符串会自动转义,这意味着所有单引号和双引号都被转义了。例如如果我写It's not true...,那么在php方面我会得到

$comment = $_REQUEST["comm"];
print $comment;
//will print It\'s not true... on my online server
//will print It's not true... on my local server

我还是无法理解为什么会这样?是否有任何用于自动转义查询字符串变量的 PHP 设置?

【问题讨论】:

    标签: php escaping request query-string


    【解决方案1】:

    您已启用“魔术引号”。它们是一个可怕的错误功能,幸运的是在下一版本的 PHP 中被删除。 PHP 手册有一个guide 来禁用它们。

    总之,你需要在你的php.ini文件中将以下配置项设置为Off

    • magic_quotes_gpc
    • magic_quotes_runtime
    • magic_quotes_sybase

    具体来说,您的问题似乎与magic_quotes_gpc 有关——“gpc”部分是“GET、POST 和 COOKIE”的缩写——但最好将它们全部禁用。

    【讨论】:

      【解决方案2】:

      代码会告诉你所有你需要的东西..

      function mysql_prep($value) {
      $magic_quotes_active = get_magic_quotes_gpc();
      $new_enough_php = function_exists("mysql_real_escape_string"); // i.e. PHP >= v4.3.0
      if ($new_enough_php) { // PHP v4.3.0 or higher
          // undo any magic quote effects so mysql_real_escape_string can do the work
          if ($magic_quotes_active) {
              $value = stripslashes($value);
          }
          $value = mysql_real_escape_string($value);
      } else { // before PHP v4.3.0
          // if magic quotes aren't already on then add slashes manually
          if (!$magic_quotes_active) {
              $value = addslashes($value);
          }
          // if magic quotes are active, then the slashes already exist
      }
      return $value;
      }
      

      创建上述函数并将值传递给该函数

      然后调用类似的值

      $yourVar = mysql_prep($_POST['yourControlName']);
      

      我希望你可以通过 cmets 得到解释...

      【讨论】:

        【解决方案3】:

        我认为它是 php.ini 文件中的一个设置。你可以调用一个 PHP 函数来禁用它,但是到那时已经太晚了。

        【讨论】:

        • 其实你只能禁用ini_set()中的magic_quotes_runtimemagic_quotes_sybase,我猜你说的就是这个功能。 magic_quotes_gpc 的模式为 PHP_INI_PERDIR,这意味着它只能从 .htaccess 或“更高”修改。这很可能是因为一旦调用了该函数,gpc 超全局变量就已经设置好了并且损坏已经完成。
        • 我不需要使用ini_set()我可以访问php.ini
        • @Ummar 我知道你不需要使用ini_set()。我只是向克雷格解释说,你不能总是像他说的那样调用 PHP 函数来禁用它,仅此而已。只是增加了一点清晰度。
        猜你喜欢
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 2017-04-13
        • 1970-01-01
        • 2015-10-06
        • 2016-03-06
        • 2011-06-09
        相关资源
        最近更新 更多