我想知道在我使用它们之前是否有一个快速简便的函数来清理我的 url 中的 get 变量。(或者 $_POST 想到它......)
我想我可以使用正则表达式来替换不允许的字符,但我很想听听人们用什么来做这种事情?
我想知道在我使用它们之前是否有一个快速简便的函数来清理我的 url 中的 get 变量。(或者 $_POST 想到它......)
我想我可以使用正则表达式来替换不允许的字符,但我很想听听人们用什么来做这种事情?
清理输入的概念对我来说从来没有多大意义。它基于某些类型的输入是危险的假设,但实际上不存在危险输入这样的东西;只是错误处理输入的代码。
它的罪魁祸首是,如果您将变量嵌入某种字符串(代码)中,然后由任何类型的解释器评估,您必须确保该变量被正确转义。例如,如果您在 SQL 语句中嵌入了一个字符串,那么您必须引用和转义该字符串中的某些字符。如果您在 URL 中嵌入值,则必须使用urlencode
. 如果在 HTML 文档中嵌入字符串,则必须使用htmlspecialchars
. 等等等等。
尝试预先“清理”数据是一种注定失败的策略,因为您无法知道 - 在这一点上 - 数据将在哪个上下文中使用。PHP 臭名昭著的magic_quotes反特性就是一个很好的例子被误导的想法。
正则表达式可能会有所帮助,而且 PHP 5.2.0 还引入了一个完整的过滤器扩展,专门用于以不同方式过滤输入变量。
很难推荐一个单一的解决方案,因为输入变量的性质是如此……多变。:-)
我使用下面的方法来清理 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); } 函数 DBSafe($InputVal) { // 返回数据库更新的 MySQL 安全值。未加引号的数值;空输入为 NULL;转义的“单引号”字符串值; if (is_numeric($InputVal)) { 返回 $InputVal; } 别的 { // 根据服务器 PHP 和 MySQL(即 magic_quotes)设置,可能不需要 escape_string。如果需要,请在下面取消注释。 // $InputVal=mysql_escape_string($InputVal); $InputVal=(!$InputVal?'NULL':"'$InputVal'"); 返回 $InputVal; } }