【问题标题】:Escaping quotes - moving from PHP4 to PHP5转义引号 - 从 PHP4 迁移到 PHP5
【发布时间】:2012-02-10 09:56:44
【问题描述】:

我继承了一个需要在我的 PHP5 服务器上运行的 php4 站点,我已经解决了大部分问题,但无法弄清楚作者在这里试图做什么。好吧,准确地说,他试图引用提交的文本,但我不确定这个函数应该如何工作以及我应该如何在 PHP5 中做到这一点?

# Function to safely add slashes when magic quotes is switched off

function safe_slash($string)
{
  if (!get_magic_quotes_gpc())
  {
    $string = addslashes($string);
  }

  return $string;
} 

【问题讨论】:

  • 如果get_magic_quotes_gpc 关闭,代码将向$string 添加斜杠...。相同的代码将在PHP5 中运行...read addSlashes()
  • 表示您对此代码有疑问。 这是什么
  • 对不起,问题是斜杠没有被添加到字符串中,所以如果我有一个像 O'Leary 这样的名字,则 ' 不会被转义并且查询失败。
  • 你为什么说查询?你测试过这个功能本身吗? var_dump(safe_slash("O'Leary")); 怎么说?
  • string(8) "O\'Leary" 有趣 - 我想也许这个位正在工作,但在某个地方它没有被调用,会再看看。

标签: php security php4


【解决方案1】:

默认情况下,PHP4 在 PHP.ini 中有一个名为 magic_quotes_gpc 的选项打开,它会将 addslashes 用于所有 $_POST/$_GET 变量。

该代码仅检查值 magic_quotes_gpc 是否已关闭,如果是,则将 addslashes 传递给传入的 $string。

它应该在 PHP4 和 PHP5 中工作(我相信在 PHP6 中 magic_quotes_gpc 将被删除)。但不建议依赖它,它最初是为了“保护”免受 SQL 注入,但被发现是不够的。

【讨论】:

  • 谢谢 - 现在推荐的方法是什么? mysqli_real_escape_string?
  • 有几个推荐的方法,mysqli_real_escape_string 肯定是对依赖魔术引号的改进。更大的改进是使用准备好的语句和参数化查询(例如使用PDO),因此您不必担心自己转义字符串。
【解决方案2】:
$_POST = self::addSlashesRecursive($_POST);
$_GET = self::addSlashesRecursive($_GET);
$_COOKIE = self::addSlashesRecursive($_COOKIE);

function addSlashesRecursive($s)
{
    if (get_magic_quotes_gpc()) {
        return $s;
    }
    if (is_string($s)) {
        return addslashes($s);
    } else if (is_array($s)) {
        return array_map(array('addSlashesRecursive'), $s);
    }
    return $s;
}

但在我看来,更改代码会更好。在 PHP6 中,magic_quotes 将被完全删除。

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多