PHP5.4Magic\u quotes\u gpc替代方案?

PHP5.4Magic\u quotes\u gpc替代方案?,php,Php,我之前使用的是PHP5.2。现在我想升级PHP5.4。Magic引号现在被删除。我想让我的应用程序正常工作。我应该使用哪个函数来转义数据mysql\u real\u escape\u string()或addslashes() 上面的哪个函数将给出与magic\u quotes\u gpc设置相同的结果???出于安全原因,最好使用建议的准备语句。Mysql\u real\u escape\u字符串可能不足以防止sql注入,例如,尽管有escape函数(),但多字节字符集可能被滥用 用PHP编写的

我之前使用的是
PHP5.2
。现在我想升级
PHP5.4。
Magic引号现在被删除。我想让我的应用程序正常工作。我应该使用哪个函数来转义数据
mysql\u real\u escape\u string()
addslashes()


上面的哪个函数将给出与
magic\u quotes\u gpc
设置相同的结果???

出于安全原因,最好使用建议的准备语句。Mysql\u real\u escape\u字符串可能不足以防止sql注入,例如,尽管有escape函数(),但多字节字符集可能被滥用

用PHP编写的语句可以这样使用:

  $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
  $stmt->bindParam(1, $name);
  $stmt->bindParam(2, $value);
。总之,如果你有可能把你的申请改成准备好的陈述,那将是最好的处理方式

更新(完全不推荐)

如果确实要保持状态,请对每个$GET和$POST变量使用addslashes()。它手动执行的操作与打开magic_quotes对所有$GET和$POST变量执行的操作相同。但我真的认为,将mysqli与mysqli\u real\u escape\u string或更好的、准备好的语句一起使用所需的工作更少:)


最好迁移到PDO,并按照上面@alex所述准备语句

如果不可行,请使用
mysql\u real\u escape\u string()
绝对转义传入字符串数据,并验证整数数据,例如使用
filter\u input()
,如中所示


addslashes()
不是mySQL查询的合适转义方法。

因为我不能在我的应用程序中引入db层,并且我想要一个快速的解决方案,所以我使用了addslashes()函数,因为addslashes()转义单引号(')、双引号(“)、反斜杠()和NUL(空字节)正是魔术引号转义的

代码:

addslashes()
给出了与引用的
magic\u quotes\u gpc
设置相同的结果

启用此选项后,所有“(单引号)、“(双引号)、\(反斜杠)和空字符将自动用反斜杠转义。这与我们所做的是一样的


在上面的PHP5.4上使用magic_quotes_gpc 如果您仍然希望在PHP 5.4或更高版本上为遗留代码运行
magic\u quotes\u gpc
,您可以使用:


我们需要在请求、发布、获取和cookie中添加斜杠。您可以在下面的代码中实现它。在您的通用文件中包含以下代码

$la_magicQuotes = array('_REQUEST','_POST', '_GET','_COOKIE');
  foreach($la_magicQuotes as $la_superGlobal )
  { 
    if($$la_superGlobal && is_array($$la_superGlobal))    
      array_walk($$la_superGlobal, 'pr_addslashed_array');
  }


function pr_addslashed_array(&$la_val,$lc_key) 
{  
  if (is_array($la_val))
    array_walk($la_val,'pr_addslashed_array');
  else
    $la_val = pr_addslashed($la_val);   
}

function pr_addslashed($lc_string)
{
  return $lc_string = addslashes($lc_string);   
}

这取决于应用程序使用的数据库层。每个数据库库都有一个合适的转义函数。您的应用程序是否依赖于
magic\u quotes\u gpc
?这是个非常糟糕的主意。是的。它是。这是一个非常旧的应用程序,我必须让它工作。@Pekka,我没有使用任何数据库层,因为这是一个非常旧的应用程序,我使用的是mysql函数。@TanuGupta:所以你的数据库层是旧的应用程序层。我在这个应用程序中没有使用PDO。在升级到某个数据库层之前,我必须让它工作。你可以使用mysqli吗?它将charset问题牢记在心。谢谢alex。无法修改此级别的代码,因为它是一个大型应用程序。只需要一个快速的解决方案,它可以给我相同的输出,就像magic_quotes_gpc设置提供的一样。我只需要一个函数,它可以给我相同的结果,当magic_quotes_gpc设置打开时。我不能修改我的数据库层。我只是想要一个快速的解决方案,这只是服务的目的,并帮助我使我的应用程序正常工作。我认为addslashes()解决了这个问题,因为它可以像magic quotes一样转义单引号(')、双引号(“)、反斜杠()和NUL(空字节)。
addslashes()
不足以保护传入数据;它不是100%完美的保护。
mysql\u real\u escape\u string()
就是这样。这只是一个不同的函数选择,不是吗?事实上,我只需要一个更接近magic\u quotes\u gpc.mysql\u real\u escape\u string()escape\x00、\n、\r、\、“、”和\x1a的替代方法。如果我使用mysql\u real\u escape\u string()并且它是一个大型应用程序,我需要对我的应用程序进行彻底的测试,我希望减少测试工作量。建议???@Tanu这些字符仅在查询期间转义;斜杠不会出现在最终数据中。我不认为这需要进行广泛的测试。正如我所说的,这是一个非常古老的应用程序,我有一些脚本,可以从数据库中获取数据,并使用一些自定义/预定义函数删除转义字符。这将使您的应用程序在某些情况下易受攻击:True。在我升级到PDO之前,这对我来说是一个快速修复不仅添加斜杠,还将值分配给全局变量,而不是$\u GET、$\u POST等。。。就像10年前的“全球注册”一样。使用
${$\u SG}[$\u SGK]=smartQuotes($\u SGV)改为更改gpc全局变量。。。不要忘记$\u请求(如果您要在适当位置更改值)
$la_magicQuotes = array('_REQUEST','_POST', '_GET','_COOKIE');
  foreach($la_magicQuotes as $la_superGlobal )
  { 
    if($$la_superGlobal && is_array($$la_superGlobal))    
      array_walk($$la_superGlobal, 'pr_addslashed_array');
  }


function pr_addslashed_array(&$la_val,$lc_key) 
{  
  if (is_array($la_val))
    array_walk($la_val,'pr_addslashed_array');
  else
    $la_val = pr_addslashed($la_val);   
}

function pr_addslashed($lc_string)
{
  return $lc_string = addslashes($lc_string);   
}