3

我正在尝试学习 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

4 回答 4

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 都会以正确的方式绑定参数。

于 2012-07-24T00:29:40.223 回答
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.

于 2012-07-24T00:31:49.187 回答
0

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

您可以在此处阅读有关使用 PDO的信息

于 2012-07-24T00:31:26.127 回答
0

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

于 2012-07-24T00:34:02.140 回答