最终的清洁/安全function

我有很多来自$_GET$_POST的用户input…现在我总是写mysql_real_escape_string($_GET['var']) ..

我想知道你是否可以做一个函数来保护,逃避和清理$_GET / $_POST数组,所以你不必每次处理用户input等都要处理它。

我正在考虑一个函数,例如cleanMe($input) ,在它里面,它应该执行mysql_real_escape_stringhtmlspecialcharsstrip_tagsstripslashes (我认为这将全部使它变得干净和安全),然后返回$input

那么这可能吗? 制作一个适用于所有$_GET$_POST的函数,所以你只能这样做:

 $_GET = cleanMe($_GET); $_POST = cleanMe($_POST); 

所以在你的代码中,当你使用例如$_GET['blabla']或者$_POST['haha'] ,它们是安全的,剥离的等等?

试了一下自己:

 function cleanMe($input) { $input = mysql_real_escape_string($input); $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8'); $input = strip_tags($input); $input = stripslashes($input); return $input; } 

通用卫生function的概念是一个破碎的概念。

一个正确的卫生方法为每个目的。 在一个string上不加区分地运行它们往往会使它失效 – 为一个SQL查询转义一段HTML代码将会破坏它在网页中使用,反之亦然。 使用数据之前,应该立即使用卫生设施:

  • 运行数据库查询之前。 正确的卫生方法取决于你使用的图书馆; 他们列出我如何防止在SQL注入PHP?

  • htmlspecialchars()为安全的HTML输出

  • preg_quote()用于正则expression式

  • escapeshellarg() / escapeshellcmd()用于外部命令

  • 等等

使用“一刀切”的卫生function,就像在一种植物上使用五种高毒性的杀虫剂,根据定义,只能含有一种臭虫 – 只能发现你的植物受到第六种侵染,的杀虫剂工作。

在将数据传递给函数之前,始终使用正确的方法。 除非需要,否则不要混合方法。

简单地通过所有这些函数传递input是毫无意义的。 所有这些function都有不同的含义。 通过调用更多的转义函数,数据不会变得“更清洁”。

如果你想在MySQL中存储用户input,你只需要使用mysql_real_escape_string 。 然后完全逃脱,安全地存储在数据库中。

编辑

还要注意使用其他function时出现的问题。 如果客户端向服务器发送一个用户名,并且用户名包含一个和号( & ),那么在将数据存储到数据库中之前,不要调用htmlentities ,因为数据库中的用户名将包含&

你正在寻找filter_input_array() 。 但是,我build议只使用它来进行商业风格validation/ sanitisation,而不是SQLinput过滤。

为了防止SQL注入,请使用带有mysqli或PDO的参数化查询。

问题是,干净或安全的一个用途,将不会为另一个:清理部分path,部分的MySQL查询,为html输出(如html,或在JavaScript或在input的值),对于XML可能需要不同的东西相矛盾。

但是,一些全球性的事情是可以做到的。 尝试使用filter_input来获取用户的input。 并为您的SQL查询使用预准备语句 。

虽然,而不是一个全function的,你可以创build一些类来pipe理你的input。 类似的东西:

 class inputManager{ static function toHTML($field){ $data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS); return $data; } static function toSQL($field, $dbType = 'mysql'){ $data = filter_input(INPUT_GET, $field); if($dbType == 'mysql'){ return mysql_real_escape_string($data); } } } 

有了这样的事情,如果你在你的代码中看到任何$ _POST,$ GET,$ _REQUEST或$ _COOKIE,你就知道你必须改变它。 如果有一天你必须改变你如何过滤你的input,只要改变你所做的课程。

我可以build议安装“mod_security”,如果你使用apache,并有完全访问服务器?
它确实解决了我的大部分问题。 但是,不要只依靠一两个解决scheme,总是编写安全的代码;)
更新发现这个PHP IDS(http://php-ids.org/);; 看起来不错:)

 <?php function sanitizeString($var) { $var = stripslashes($var); $var = strip_tags($var); $var = htmlentities($var); return $var; } function sanitizeMySQL($connection, $var) { $var = $connection->real_escape_string($var); $var = sanitizeString($var); return $var; } ?> 

我用这个传递数组或获取,发布

 function cleanme(&$array) { if (isset($array)) { foreach ($array as $key => $value) { if (is_array($array[$key])) { secure_array($array[$key]); } else { $array[$key] = strip_tags(mysql_real_escape_string(trim($array[$key]))); } } } } 

用法:

 cleanme($_GET); cleanme($_POST);