2012-07-24 152 views
3

我想学习php,并希望使用函数来保护窗体再次SQL注入! 但不知何故,形成记录我的数据库包含任何特殊字符,如“每一个数据“=)/()/ */防止SQL注入

我的过滤功能:

function filter($data) { 
    $data = trim(htmlentities(strip_tags($data))); 

    if (get_magic_quotes_gpc()) 
     $data = stripslashes($data); 

    $data = mysql_real_escape_string($data); 

    return $data; 
} 

注册页面以获取POST DATAS:

foreach($_POST as $key => $value) { 
    $data[$key] = filter($value); 
} 

然后我试图特殊字符和形式拯救他们!我一个做错了吗?

+3

有这些特殊字符可以。 'mysql_real_escape_string'(有点)保护你免受SQL注入。这些字符本身并没有害处。它们不是导致SQL注入的原因,它主要是滥用单引号''',这会将你暴露给漏洞。另外,当你插入数据时,我不会调用'htmlentities'。只有在你去显示它时调用它。 – drew010 2012-07-24 00:31:34

回答

4

如果你想防止SQL注入,最好的方法是使用PDO并准备查询,所有用户提供的数据通过execute()传递,就像这样:

$stmt = $pdo->prepare("INSERT INTO foo (a_column, b_column) VALUES (:a, :b)"); 
$stmt->execute(array(':a' => $a, ':b' => $b)); 

您不必对$a$b执行任何操作;无论您使用的是哪个数据库,PDO都会以正确的方式绑定参数。

+0

我会补充说['mysqli'](http://www.php.net/manual/en/book.mysqli.php)提供了类似的功能。 – 2012-07-24 00:31:54

+0

也许,但是mysqli将你与MySQL联系起来,在PDO中(假设你写了可移植的SQL),你可以通过改变连接字符串来切换到不同的数据库引擎。 – cdhowie 2012-07-24 00:32:38

+0

你知道,我更愿意使用'mysql'并且知道风险。如果/当'mysql_ *'从PHP中删除时,我将重新定义完全相同的使用'mysqli_ *'的函数。为我节省了不得不重写我曾经写过的每一段代码的麻烦。 – 2012-07-24 00:33:04

0

停止使用mysql_ *函数,因为它们已被弃用。改为使用PHP database objects (PDO),因为PDO允许使用参数绑定来保护您免受sql注入。

您可以使用PDO here

2

呃读了......防止SQL注入点是继续允许用户键入任何他们喜欢的,没有它把服务器或其他用户处于危险之中。 htmlspecialchars是一个很好的开始,因为它看起来像HTML标签,并呈现给他们接受。您使用的stripslashes是好的,但最新版本的PHP删除了魔术引号。 mysql_real_escape_string允许您以合理的安全性以字符串的形式在数据库中插入任何内容。

所以,你的过滤功能应该是这样:

function filter($data) { 
    if(get_magic_quotes_gpc()) $data = stripslashes($data); 
    return trim(mysql_real_escape_string(htmlspecialchars($data)); 
} 

现在,如果你真的想要一个过滤,在一个只允许某些字符,使用正则表达式的功能,如preg_match

+0

谢谢!我用正则表达式函数,它解决了!我错误的是我认为过滤功能已经清除它们! – 2012-07-24 00:46:41

0

如果不使用框架,也可以考虑检查是否使用正则表达式。 示例:http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks

+0

除非添加更多细节,否则这更适合作为评论。 – 2012-07-24 00:56:45

+0

我也很高兴,但我不知道如何转换。 – sanusart 2012-07-24 01:11:56

+0

您可以添加评论,方法是复制并粘贴该评论并将其添加为问题的评论。然后点击删除链接删除您的帖子。 – 2012-07-24 01:13:05