最终的清洁/安全function
我有很多来自$_GET
和$_POST
的用户input…现在我总是写mysql_real_escape_string($_GET['var'])
..
我想知道你是否可以做一个函数来保护,逃避和清理$_GET
/ $_POST
数组,所以你不必每次处理用户input等都要处理它。
我正在考虑一个函数,例如cleanMe($input)
,在它里面,它应该执行mysql_real_escape_string
, htmlspecialchars
, strip_tags
, stripslashes
(我认为这将全部使它变得干净和安全),然后返回$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);