php中的SQL注入保护机制

时间:2012-10-23 18:38:02

标签: php sql-injection

通常,您会从表单中收集数据并将其插入数据库。

我知道mysql_real_escape_string()用于消除威胁,但我想提供一种机制,它需要$ _POST并对其进行处理,以确保数据库的使用安全。

实现这一目标的理想和优雅方式是什么?简单地翻过post数组足以使数组安全吗?

3 个答案:

答案 0 :(得分:3)

有时你知道某些东西必须是一个字符串,有时你知道它必须是一个整数。有时您知道它必须是一个电子邮件地址,有时您知道它必须是一个4个字符长的字符串。

mysql扩展当然已被弃用,已经有一段时间了。 PHP文档说:

  

建议不要使用此扩展名来编写新代码。代替,   要么使用mysqli,要么使用PDO_MySQL扩展名。另见   MySQL API概述在选择MySQL API时提供进一步的帮助。

PDO是在PHP中使用MYSQL的“正确”方式。如果由于某种原因那不好,请使用mysqli。但是,只需使用PDO。

来自文档:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>

请注意,卡路里是一个int,而color是一个字符串。这是处理事情的更好方法。

这与filter_var一起可以确保事情安全。

http://www.php.net/manual/en/filter.filters.sanitize.phphttp://www.php.net/manual/en/filter.filters.validate.php描述了可用的不同过滤器。

答案 1 :(得分:2)

使用mysqli_real_escape_string和array_map

$_POST = array_map('mysqli_real_escape_string', $_POST);

如果你想对所有的查询字符串变量做同样的事情:

$_GET = array_map('mysqli_real_escape_string', $_GET);

答案 2 :(得分:-1)

我使用这2个功能:

function getMySQLString($string) {
    global $link;

    /* Si esta activaldo el magic quotes, saco los caracteres de escape */
    if (get_magic_quotes_gpc()) {
        $string = stripslashes($string);
    }

    /* Armo el string. */
    return mysqli_real_escape_string($link, $string);
}


function toSecureArray($array) {
    $result = Array();

    /* Recorro todas las llaves del campo */
    $keys = array_keys($array);
    foreach ($keys as $key_id => $value) {
        if (!is_array($array[$value]))
            $result[$value] = getMySQLString($array[$value]);
    }

    return $result;
}

“toSecureArray”不是递归的,你可以做得更好。 :)