0

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

我知道这mysql_real_escape_string()是用来消除威胁的,但我想提供一种机制,它接受 $_POST 并对其进行处理,使其对数据库使用安全。

实现这一目标的理想而优雅的方式是什么?简单地浏览后数组是否足以使数组安全?

4

3 回答 3

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();
?>

请注意,卡路里是一个整数,颜色是一个字符串。这是处理事情的更好方法。

这结合起来filter_var可以确保事情是安全的。

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

于 2012-10-23T18:46:43.710 回答
2

使用 mysqli_real_escape_string 和 array_map

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

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

$_GET = array_map('mysqli_real_escape_string', $_GET);
于 2012-10-23T18:39:36.187 回答
-1

我使用这两个功能:

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”不是递归的,你可以让它变得更好。:)

于 2012-10-23T18:41:51.863 回答