Php 清理URL变量的整洁方法?

Php 清理URL变量的整洁方法?,php,security,sanitization,Php,Security,Sanitization,我想知道,在我使用url变量之前,是否有一个简单快捷的函数来清理它们(或者$\u POST来考虑一下…) 我想我可以用正则表达式来替换不允许的字符,但我很想听听人们用什么来做这类事情?我使用PHP和函数。正则表达式可能会有所帮助,而且PHP5.2.0还引入了一个完整的扩展,专门用于以不同的方式过滤输入变量 很难推荐单一的解决方案,因为输入变量的性质是如此。。。变量::-) 清洁输入的概念对我来说没有多大意义。它基于某些输入是危险的假设,但实际上不存在危险输入;只是错误地处理输入的代码 罪魁祸首是

我想知道,在我使用url变量之前,是否有一个简单快捷的函数来清理它们(或者$\u POST来考虑一下…)


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

我使用PHP和函数。

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


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

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

罪魁祸首是,如果将变量嵌入某种字符串(代码)中,然后由任何类型的解释器对其进行计算,必须确保该变量正确转义。例如,如果在SQL语句中嵌入字符串,则必须引用并转义该字符串中的某些字符。如果在URL中嵌入值,则必须使用转义。如果在HTML文档中嵌入字符串,则必须使用转义。等等等等


试图提前“清理”数据是一种注定要失败的策略,因为此时您无法知道数据将在哪个上下文中使用。PHP臭名昭著的反功能就是这种错误想法的一个主要例子。

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

//迭代POST数组,将每个数组传递给DBSafe函数以清理数据 foreach($\发布为$key=>$PostVal){ //将POST变量转换为常规变量 $$key=DBSafe($PostVal); //使用上面的语句可以保持POST或完整地获取数组,并使用新的单个变量 //或者,使用下面的命令更新POST或获取数组变量 //更新后变量 $_POST[$key]=DBSafe($PostVal); } 函数DBSafe($InputVal){ //返回数据库更新的MySQL安全值。无引号的数值;空输入为NULL;转义的“单引号”字符串值; 如果(是数值($InputVal)){ 返回$InputVal; }否则{ //根据服务器PHP和MySQL(即magic_引号)设置,可能不需要escape_字符串。如果需要,请取消下面的注释。 //$InputVal=mysql\u escape\u字符串($InputVal); $InputVal=(!$InputVal'NULL':“$InputVal'”); 返回$InputVal; } }
我一直在使用htmlentities而不是htmlspecialchars;它进行完整的实体转换。从安全性的角度来看,这没关系——htmlspecialchars是htmlspecialchars的超集。但是,如果使用UTF-8作为编码,则不需要它。 // 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; } }