如何安全地插入代码到MySQL数据库中

5
我正在构建一个网站,用户可以存储代码片段,使用PHP和MySQL数据库。但我无法确定如何安全地将用户输入的代码插入到我的数据库中。我不能使用我通常使用的“安全”函数(例如trimstripslashes等)来转换输入,因为整个重点是您可以在输入时查看代码。我已经尝试了my_real_escape_string(),但我发现它不会转义%_,这些符号可用作MySQL通配符。这是否构成威胁,或者我只能使用my_real_escape_string?提前感谢您的帮助。

addcslashes通常与普通转义或参数绑定一起使用,用于掩盖LIKE表达式的占位符。 - mario
可能会回答你的问题的之前的 StackOverFlow 问题链接:https://dev59.com/oHVD5IYBdhLWcg3wL4cA http://stackoverflow.com/questions/4461759/parameterized-queries - John Woo
trim/stripslashes不是安全函数。在SQL中,额外的空格从来不是问题,除非你担心在固定长度的文本/字符串字段中丢失数据。stripslashes是PHP早期留下的愚蠢、脑残的垃圾代码,当时magic_quotes是主流。 - Marc B
5个回答

6
通配符只在使用某些函数时对 SELECT 查询起作用。因此,在插入代码时,使用 mysql_real_escape_string() 是可以的,因为它们没有任何影响。
为了更好地实现这一点,我建议您使用PHP PDO,以便您可以使用参数绑定。以下示例来自PHP手册
<?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();
?>

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. White已经说过的,如果你刚开始学习,考虑使用PDO库。它比旧的MySQL函数更新,并提供参数化查询,如果正确使用,可以防止SQL注入。


1

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

它会自动处理这些事情。


2
不是我点的踩,但这可能并不是对楼主问题的真正回答。而且你没有解释要使用哪个库。 - Pekka

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

-1
这是对我有效的方法,[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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接