2012-01-10 85 views
0

可以使用由于表单提交或任何其他请求而清理传入输入的函数吗?这是节省时间,但有效性和效率的问题仍然困扰着我。例如,建议有一个在php中结合了两个或更多内置消毒功能的santizing功能?

function clearSpecialChars($str) 
    { 
    $str=htmlentities($str); 
    $str=strip_tags($str); 
    $str=mysql_real_escape_string($str); 

    return $str; 
    } 

,这样,当我得到一个表单提交我做的:

$username=clearSpecialChars($_REQUEST['username']); 

    $email=clearSpecialChars($_REQUEST['email']); 

从根本上说,我不希望从用户的任何HTML输入。

+0

没有放之四海而皆准的。所有这只是一个懒惰的尝试 – Cheekysoft 2012-01-10 09:35:16

+0

我不明白你的意思是,上述方法比一步一步地使用它们更容易? – jmishra 2012-01-10 09:36:50

+0

一方面试图解决SQL注入的漏洞,另一方面尝试接近跨站脚本的脆弱性(虽然每个脚本都不能成功地完成任务,如果不是非常小心地使用它们,并且通常与其他工具结合使用),它们应该永远不会按顺序使用,因为它们与彼此没有任何关系。 – Cheekysoft 2012-01-10 09:42:10

回答

2

每个函数都有其自己的用途,您不应该使用任何不适用于其预期用途的函数。

  1. 您应该在使用mysql查询中的参数之前使用mysql_real_escape_string。
  2. 在输出到页面之前,您应该使用htmlspecialchars。

就是这样。

+0

请*不要*使用'mysql_real_escape_string()',除非它真的是你最后的选择 - 它太容易误用它,最终容易受到SQL注射,或将其用于易受攻击的配置。请尝试使用参数化查询,而不是像'mysqli'或'PDO'库。 – Cheekysoft 2012-01-10 09:38:55

+0

你是什么意思“太容易误用”? – Orentet 2012-01-10 09:40:18

+0

'$ sql =“select * from users where id =”+ mysql_real_escape_string($ _POST ['userid']);'一个非常常见的例子; SQL注入在那里。 – Cheekysoft 2012-01-10 09:43:58

0

是的,您可以创建一个简单的函数,在使用它之前清理值。我用一个函数那样:

function sanitize($value) 
{ 
    return htmlentities(addslashes($value)); 
} 

哪些逃离“与”和所有适用的字符转换成HTML实体矿与其他选项更复杂,但你可以从它开始

+0

fyi:这不会对单引号进行htmlencode编码,所以当注入上下文位于HTML标签内部时,容易受到XSS的影响,但不在双引号属性值内。还存在其他弱点,例如多字节攻击(因为不考虑字符集)和一些特定于浏览器的语法漏洞。 – Cheekysoft 2012-01-10 11:07:03

+0

是的,所以我说我使用更复杂的功能。 我以为他想知道如何以简单的方式使用一些不同的功能,因此很难在单个答案中谈论安全问题;) – 2012-01-10 11:15:40

+0

当然是。我认为读者从这个角度解决的主要问题是任何方法论都只能用于特定的地方。在考虑注入漏洞时,考虑**注入字符串的输出的语法/结构中的哪里**,同样重要,因为要考虑**如何执行输出编码 - 巨型提示:输出编码与位置有关。(并考虑应该避免注入的地方) – Cheekysoft 2012-01-10 13:48:50