php-最终的清理/安全功能
我从$_GET和$_GET['blabla']有很多用户输入...目前,我总是写$_POST['haha']。
我想知道您是否可以创建一个功能来立即保护,转义和清理$_GET['blabla']/$_POST['haha']数组,因此您不必每次使用用户输入时都进行处理。
我正在考虑一个函数,例如$_GET['blabla'],并且在它内部应该执行$_POST['haha']、htmlspecialchars、strip_tags、stripslashes(我想这是为了使其干净和安全),然后返回$input。
那有可能吗? 制作一个适用于所有$_GET['blabla']和$_POST['haha']的函数,因此您只需要这样做:
$_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;
}
7个解决方案
126 votes
通用卫生功能的概念是一个破损的概念。
每种目的都有一种正确的卫生方法。 在字符串上不加选择地运行它们通常会破坏它-为SQL查询转义一段HTML代码会破坏它在网页中的使用,反之亦然。 在使用数据之前,应立即进行卫生处理:
在运行数据库查询之前。 正确的卫生方法取决于您所使用的图书馆。 我如何防止PHP中的SQL注入中列出了它们?
escapeshellarg()用于安全的HTML输出
escapeshellarg()用于正则表达式
escapeshellarg()/escapeshellcmd()用于外部命令
等等等
使用“一刀切”的卫生功能就像在植物上使用五种剧毒杀虫剂一样,根据定义,这些杀虫剂只能含有一种虫子-只是发现您的植物受到了第六种虫子的侵扰,而第六种却没有 的杀虫剂起作用。
始终使用一种正确的方法,最好是直接使用,然后再将数据传递给函数。 除非需要,否则不要混合使用方法。
Pekka 웃 answered 2019-11-03T20:44:32Z
7 votes
仅通过所有这些功能传递输入是没有意义的。 所有这些功能具有不同的含义。 通过调用更多的转义函数,数据不会变得“干净”。
如果要在MySQL中存储用户输入,则只需要使用&016。然后将其完全转义以安全地存储在数据库中。
编辑
还请注意使用其他功能时出现的问题。 例如,如果客户端向服务器发送用户名,并且该用户名包含“&”号(&),则您不希望在将其存储在数据库中之前调用&017,因为这样数据库中的用户名将包含&。
Tomas answered 2019-11-03T20:45:13Z
6 votes
您正在寻找filter_input_array()。但是,我建议仅将其用于业务样式的验证/清除,而不是SQL输入过滤。
为了防止SQL注入,请对mysqli或PDO使用参数化查询。
Alan Pearce answered 2019-11-03T20:45:46Z
3 votes
问题是,某种用途的清洁或安全性不会用于另一种用途:清洁路径的一部分,mysql查询的一部分,html输出(例如html,javascript或输入值)中的内容, 对于xml可能需要不同的东西,这是矛盾的。
但是,可以做一些全局性的事情。尝试使用filter_input获取用户的输入。 并对SQL查询使用准备好的语句。
尽管您可以创建一些类来管理输入,而不是执行全部操作。 像这样:
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,就知道必须进行更改。 而且,如果有一天您必须更改对输入内容的过滤方式,只需更改您制作的课程即可。
Arkh answered 2019-11-03T20:46:32Z
1 votes
如果您使用的是apache并具有对服务器的完全访问权限,我可以建议安装“ mod_security”吗?
它确实解决了我的大多数问题。 但是,不要只依靠一种或两种解决方案,总要编写安全的代码;)
更新找到了这个PHP IDS([http://php-ids.org/);]看起来不错:)
Filipe YaBa Polido answered 2019-11-03T20:47:10Z
0 votes
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;
}
?>
vuchkov answered 2019-11-03T20:47:30Z
-1 votes
我用那个传递数组或get,post
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);
user889030 answered 2019-11-03T20:47:57Z