2

我想知道在我使用它们之前是否有一个快速简便的函数来清理我的 url 中的 get 变量。(或者 $_POST 想到它......)

我想我可以使用正则表达式来替换不允许的字符,但我很想听听人们用什么来做这种事情?

4

4 回答 4

6

清理输入的概念对我来说从来没有多大意义。它基于某些类型的输入是危险的假设,但实际上不存在危险输入这样的东西;只是错误处理输入的代码。

它的罪魁祸首是,如果您将变量嵌入某种字符串(代码)中,然后由任何类型的解释器评估,您必须确保该变量被正确转义。例如,如果您在 SQL 语句中嵌入了一个字符串,那么您必须引用和转义该字符串中的某些字符。如果您在 URL 中嵌入值,则必须使用urlencode. 如果在 HTML 文档中嵌入字符串,则必须使用htmlspecialchars. 等等等等。

尝试预先“清理”数据是一种注定失败的策略,因为您无法知道 - 在这一点上 - 数据将在哪个上下文中使用。PHP 臭名昭著的magic_quotes反特性就是一个很好的例子被误导的想法。

于 2008-11-10T18:02:19.570 回答
3

我使用 PHP输入过滤器和函数urlencode

于 2008-11-10T17:45:46.403 回答
2

正则表达式可能会有所帮助,而且 PHP 5.2.0 还引入了一个完整的过滤器扩展,专门用于以不同方式过滤输入变量。

很难推荐一个单一的解决方案,因为输入变量的性质是如此……多变。:-)

于 2008-11-10T17:47:55.900 回答
1

我使用下面的方法来清理 MYSQL 数据库使用的输入。总而言之,通过 foreach 遍历 $_POST 或 $_GET 数组,并通过 DBSafe 函数传递每个 $_POST 或 $_GET 以清理它。DBSafe 可以很容易地修改为数据变量的其他用途(例如 HTML 输出等)。

// 迭代 POST 数组,将每个数组传递给 DBSafe 函数以清理数据
foreach ($_POST as $key => $PostVal) {

  // 将 POST 变量转换为常规变量
  $$key=DBSafe($PostVal);

  // 使用上述语句保持 POST 或 GET 数组不变,并使用新的单个变量
  // 或者,使用下面来更新 POST 或 GET 数组变量

  // 更新 POST 变量
  $_POST[$key]=DBSafe($PostVal);
}


函数 DBS​​afe($InputVal) {
// 返回数据库更新的 MySQL 安全值。未加引号的数值;空输入为 NULL;转义的“单引号”字符串值;

  if (is_numeric($InputVal)) {
    返回 $InputVal;
  } 别的 {
    // 根据服务器 PHP 和 MySQL(即 magic_quotes)设置,可能不需要 escape_string。如果需要,请在下面取消注释。
    // $InputVal=mysql_escape_string($InputVal);
    $InputVal=(!$InputVal?'NULL':"'$InputVal'");
    返回 $InputVal;
  }
}
于 2008-11-11T06:11:40.847 回答