防止SQL注入

时间:2012-07-24 00:26:45

标签: php filtering sql-injection

我正在尝试学习php,并希望使用一个函数来保护表单再次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数据:

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

然后我正在尝试特殊字符和表单保存它们!我做错了什么?

4 个答案:

答案 0 :(得分: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都会以正确的方式绑定参数。

答案 1 :(得分: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这样的正则表达式函数。

答案 2 :(得分:0)

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

您可以阅读使用PDO here

答案 3 :(得分:0)

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