清理URL变量的一种整洁方法?

时间:2008-11-10 17:30:14

标签: php security sanitization

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

我想我可以使用正则表达式来替换不允许使用的字符,但是我很想听听人们使用这类字符的内容吗?

4 个答案:

答案 0 :(得分:6)

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

它的罪魁祸首是,如果你在一些字符串(代码)中嵌入一个变量,然后由任何类型的解释器进行评估,你必须确保该变量被正确转义。例如,如果在SQL语句中嵌入字符串,则必须引用并转义此字符串中的某些字符。如果您在网址中嵌入了值,则必须使用urlencode对其进行转义。如果在HTML文档中嵌入字符串,则必须使用htmlspecialchars进行转义。依此类推。

预先尝试“清理”数据是一种注定要失败的策略,因为你无法知道 - 在那一点上 - 数据将被用于哪个上下文。臭名昭着的magic_quotes PHP的反特性,是这种被误导的主意的一个典型例子。

答案 1 :(得分:3)

我使用PHP input filters和函数urlencode

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

// Iterate POST array, pass each to DBSafe function to clean up data
foreach ($_POST as $key => $PostVal) {

  // Convert POST Vars into regular vars
  $$key=DBSafe($PostVal);

  // Use above statement to leave POST or GET array intact, and use new individual vars
  // OR, use below to update POST or GET array vars

  // Update POST  vars
  $_POST[$key]=DBSafe($PostVal);
}


function DBSafe($InputVal) {
// Returns MySQL safe values for DB update. unquoted numeric values; NULL for empty input; escaped, 'single-quoted' string-values; 

  if (is_numeric($InputVal)) {
    return $InputVal;
  } else {
    // escape_string may not be necessary depending on server PHP and MySQL (i.e. magic_quotes) setup.  Uncomment below if needed.
    // $InputVal=mysql_escape_string($InputVal);
    $InputVal=(!$InputVal?'NULL':"'$InputVal'");
    return $InputVal;
  }
}
相关问题