最终的清洁/安全功能

Kar*_*rem 57 php security xss sql-injection

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

我想知道你是否可以创建一个能够立即保护,转义和清理$_GET/ $_POST数组的函数,因此每次使用用户输入时都不必处理它.

我在想一个功能,例如cleanMe($input),和它里面,它应该做的mysql_real_escape_string,htmlspecialchars,strip_tags,stripslashes(我想这是所有做它的清洁与安全),然后返回$input.

这可能吗?使得对所有工作的功能$_GET$_POST,所以你会做只有这个:

$_GET  = cleanMe($_GET);
$_POST = cleanMe($_POST);
Run Code Online (Sandbox Code Playgroud)

那么在以后的代码中,当您使用eg $_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;
}
Run Code Online (Sandbox Code Playgroud)

Pek*_*ica 126

通用卫生功能的概念是一个破碎的概念.

一个适用于各种用途的权利卫生法.在字符串上不加选择地运行它们通常会破坏它 - 为SQL查询转义一段HTML代码会破坏它以便在网页中使用,反之亦然.使用数据之前应该应用卫生设施:

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

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

  • preg_quote() 用于正则表达式

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

  • 等等

使用"一刀切"的卫生功能就像在植物上使用五种高毒性杀虫剂,根据定义,它只含有一种虫子 - 只是发现你的植物被第六种侵染,没有杀虫剂的作用.

在将数据传递给函数之前,始终使用一种正确的方法,理想情况下是直接的.除非您需要,否则不要混用方法.

  • 我们通过magic_quotes进行了"自动化卫生".再也不. (51认同)
  • @Toby如果你觉得适合拒绝有效(并且顺便说一下,接受)的答案,因为你不喜欢它的选择,那么这当然是你的特权.但我个人认为这是愚蠢的. (12认同)
  • "不要越过溪流" (6认同)
  • 我想补充一点,考虑使用预准备语句(PDO或mysqli)代替数据库查询是非常值得的. (4认同)
  • @Mchl +1这可能是PHP解决方案中不安全因素的首要原因*.它基本上鼓励程序员无知:) (3认同)
  • +1你头上的钉子,漏洞完全取决于数据的使用方式. (2认同)

Tom*_*mas 7

简单地通过所有这些函数传递输入是没有意义的.所有这些功能都有不同的含义.通过调用更多的escape函数,数据不会变得"干净".

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

编辑

另请注意使用其他功能时出现的问题.如果客户端向服务器发送了一个用户名,并且用户名包含一个&符号(&),那么htmlentities在将其存储到数据库中之前,您不想调用,因为数据库中的用户名将包含&.


Ala*_*rce 6

你在找filter_input_array().但是,我建议仅将其用于业务样式验证/清理而不是SQL输入过滤.

为了防止SQL注入,请使用带有mysqliPDO的参数化查询.