PHP/MYSQL:消除用户输入 - 这是一个坏主意吗?

Gre*_*reg 2 php mysql sanitization

我有一个"go"脚本来获取所请求的任何其他脚本,这是我写的用于清理用户输入的内容:

foreach ($_REQUEST as $key => $value){
    if (get_magic_quotes_gpc()) 
    $_REQUEST[$key] = mysql_real_escape_string(stripslashes($value));  
    else
    $_REQUEST[$key] = mysql_real_escape_string($value); 
}
Run Code Online (Sandbox Code Playgroud)

我还没有看到其他人使用这种方法.有什么理由不去吗?

编辑 - 修改为适用于数组:

function mysql_escape($thing) {
  if (is_array($thing)) {
    $escaped = array();
    foreach ($thing as $key => $value) {
      $escaped[$key] = mysql_escape($value);
    }          
    return $escaped;
  }
  // else
  if (get_magic_quotes_gpc()) $thing = stripslashes($thing);
  return mysql_real_escape_string($thing);
}

foreach ($_REQUEST as $key => $value){
    $_REQUEST[$key] = mysql_escape($value); 
}
Run Code Online (Sandbox Code Playgroud)

gah*_*ooa 9

我发现在使用数据时逃避数据要好得多,而不是在进行中.您可能希望在JSON,XML,Shell,MySQL,Curl或HTML中使用这些数据,并且每个数据都有自己的方式.逃避数据.


让我们快速回顾一下为什么在不同的环境中需要逃避:

如果您使用引号分隔的字符串,则需要能够转义引号.如果您使用的是xml,则需要将"内容"与"标记"分开如果您使用的是SQL,则需要将"命令"与"数据"分开如果您在命令行中,则需要将"命令"分开来自"数据"

这一般是计算的一个基本方面.因为分隔数据的语法可以在数据中出现,所以需要有一种方法来区分DATA和SYNTAX,从而逃避.

在Web编程中,常见的转义情况是:1.将文本输出到HTML 2.将数据输出到HTML属性3.将HTML输出到HTML 4.将数据插入到Javascript中5.将数据插入到SQL中6.将数据插入到shell命令中

如果处理不当,每个都有不同的安全隐患.这真的很重要!让我们在PHP的上下文中回顾一下:

  1. 文本转换为HTML:htmlspecialchars(...)

  2. 数据转换为HTML属性htmlspecialchars(...,ENT_QUOTES)

  3. HTML转换为HTML使用HTMLPurifier等库来确保只存在有效标记.

  4. 数据到Javascript我更喜欢json_encode.如果要将其放在属性中,则仍需要使用#2,例如

  5. 将数据插入SQL每个驱动程序都有某种类型的escape()函数.这是最好的.如果您使用普通的latin1字符集运行,则addslashes(...)是合适的.不要忘记引号AROUND the addslashes()调用:

    "INSERT INTO table1 SET field1 ='".addslashes($ data)."'"

  6. 命令行中的数据escapeshellarg()和escapeshellcmd() - 阅读手册

- 牢记这些,您将消除95%*的常见网络安全风险!(*一个猜测)