终极清洁/安全功能

2022-08-30 09:34:16

我有很多用户输入和...目前我总是写..$_GET$_POSTmysql_real_escape_string($_GET['var'])

我想知道您是否可以立即创建一个保护,转义和清理/数组的函数,这样您就不必在每次使用用户输入等时都处理它。$_GET$_POST

我正在考虑一个函数,例如,在它内部,它应该做,,,(我认为这一切都是为了使它干净和安全),然后返回.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;
}

答案 1

通用卫生功能的想法是一个破碎的概念。

每种用途都有种正确的卫生方法。在字符串上不加选择地运行它们通常会破坏它 - 为SQL查询转义一段HTML代码将破坏它在网页中使用,反之亦然。在使用数据之前,应立即使用卫生设施:

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

  • htmlspecialchars()用于安全的 HTML 输出

  • preg_quote()用于正则表达式

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

  • 等等等等。

使用“一刀切”的卫生功能就像在一种植物上使用五种剧毒杀虫剂,根据定义只能含有一种虫子 - 只是发现你的植物被第六种杀虫剂侵扰,而杀虫剂都不起作用。

始终使用一个正确的方法,最好是在将数据传递给函数之前直接使用。除非需要,否则切勿混合使用方法。


答案 2

简单地通过所有这些函数传递输入是没有意义的。所有这些函数都有不同的含义。数据不会通过调用更多的转义函数而变得“干净”。

如果要在MySQL中存储用户输入,则只需使用.然后完全转义它以安全地存储在数据库中。mysql_real_escape_string

编辑

另请注意使用其他函数时出现的问题。例如,如果客户端向服务器发送用户名,并且用户名包含 & 符号 (),则您不希望在将其存储在数据库中之前进行调用,因为这样数据库中的用户名将包含 。&htmlentities&


推荐