如何在mySQL数据库中安全地插入代码

时间:2012-01-06 14:06:04

标签: php mysql

我正在建立一个网站,用户可以使用PHP和mySQL数据库存储代码片段。但我无法弄清楚如何安全地将用户输入的代码插入我的数据库。我无法使用我通常使用的“安全”函数(trimstripslashes等)来转换输入,因为重点是您可以查看数据库中输入的代码。我看过my_real_escape_string()但我发现它没有逃脱%_,它们可以用作MySQL通配符。这会构成威胁,还是只能使用my_real_escape_string?提前完成。

5 个答案:

答案 0 :(得分:6)

通配符仅在SELECT查询中使用时生效,并且仅在使用某些功能时生效。因此,为了插入代码,可以使用mysql_real_escape_string(),因为它们没有效果。

为了做得更好,我建议您使用PHPs PDO,以便可以使用参数绑定。以下示例来自the PHP manual

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>

答案 1 :(得分:4)

使用mysql_real_escape_string()可为字符串值提供全面保护。数据中可能包含%_这一事实并不重要,它们不会构成安全威胁。

对于int值,您需要验证它们实际上是否为数字,或者将它们包装成引号:

$intValue = mysql_real_escape_string($_POST["intValue"]);
$query = mysql_query("INSERT INTO table SET intValue ='$intValue'"); 
                                                        // note the quotes

如果没有引号,mysql_real_escape_string()对数值无用!

然而,正如@Daniel A.怀特已经说过,如果你刚刚开始,请考虑改用PDO library。它比旧的mySQL函数更新,并提供参数化查询,如果使用得当,则无法进行SQL注入。

答案 2 :(得分:1)

使用参数化插入语句。实际上,即使您的选择和更新也使用参数化。

它将自动为您处理这些事情。

答案 3 :(得分:1)

使用PDO:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('INSERT INTO fruit(name, colour, calories) VALUES(?, ?);');
$sth->execute(Array($calories, $colour));

答案 4 :(得分:0)

这对我有用,[adscript]是一个代码段。

<textarea rows="6" cols="80"><input name="adscript" type="text/javascript" class="text-input textarea" id="adscript"  value="<?php echo htmlentities($row['adscript']);?>" size="80" height="40" maxlength="1000"></textarea>