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