如何安全地在mySQL数据库中插入代码
我正在构建一个网站,用户可以使用PHP和mySQL数据库存储代码片段。但我无法弄清楚如何安全地将用户输入的代码插入到我的数据库中。我无法通过我通常使用的“安全”功能(trim
,stripslashes
等)来转换输入,因为整个观点是您可以查看数据库中输入的代码。我看过my_real_escape_string()
,但我看到它不能逃过%
和_
,它们可以用作MySQL通配符。这是否构成威胁,或者我可以使用my_real_escape_string
?提前Thanx。如何安全地在mySQL数据库中插入代码
通配符仅在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();
?>
使用参数化插入语句。实际上,即使对于您的选择和更新也使用参数化。
它会自动为您处理这些事情。
为什么投票? – 2012-01-06 14:11:33
不是我的失望,但它可以说是不是真正的OP的问题的答案。另外你不解释使用哪个库 – 2012-01-06 14:12:35
使用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));
使用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()
是没用的数值!
但是,正如@丹尼尔·A·怀特所说,如果你刚刚开始,请考虑使用PDO library来代替。它比旧的mySQL函数更新,并提供参数化查询,如果使用得当,将使SQL注入变得不可能。
这是为我工作的,[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>
['addcslashes'](http://php.net/addcslashes)除了普通转义或参数绑定外,通常用于屏蔽'LIKE'表达式的占位符。 – mario 2012-01-06 14:09:54
trim/stripslashes不是安全功能。除非您担心在固定长度的文本/字符串字段中丢失数据,否则额外的空间在sql中从不担心。 stripslashes是PHP早些时候magic_quotes是国王之王时剩余的垃圾废物。 – 2012-01-06 14:37:09
先前的*问题可以回答你的问题:http://*.com/questions/60174/best-way-to-stop-sql-injection-in-php http://*.com/questions/4461759/parameterized - 查询 – 2012-01-06 14:10:49