我正在构建一个网站,用户可以使用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>
- 1. 如何插入在MySQL数据库中的PHP代码片段
- 2. 安全地将日期直接插入MySQL数据库?
- 3. 如何安全地在C中创建一个MySQL数据库#
- 4. 使用Java.Thread将数据插入MySQL数据库是否安全?
- 5. 用撇号安全地插入SQLite数据库的数据
- 6. FILTER_VALIDATE_EMAIL是否可以安全地插入数据库中?
- 7. 如何保持mySQL数据库安全?
- 8. 如何将敏感数据安全地存储在MySQL数据库中?
- 9. 简单的MySQL代码没有插入数据到数据库?
- 10. 使MySQL数据库插入查询安全(串)
- 11. 在MySQL数据库黑客安全地制作个人数据?
- 12. 如何将编辑器中的html代码插入到MySQL数据库中?
- 13. 为什么我的代码不会在mysql中将数据插入数据库?
- 14. 如何在C#中使用mysql数据库插入数据
- 15. 如何安全地插入SQL?
- 16. 如何让我的变量对数据库插入安全?
- 17. 我怎么可以插入PHP代码到我的数据库(安全)
- 18. 如何将PHP代码插入数据库表中?
- 19. 如何线程安全地读取和写入数据库?
- 20. 代码不会插入到数据库
- 21. 代码插入到数据库两次
- 22. 在数据库中插入嵌入代码?
- 23. 插入MySQL数据库的PHP PDO代码失败
- 24. 如何在MySQL表中插入数据?
- 25. 在mysql数据库中搜索代码
- 26. 从SQL注入安全参数插入数据库?
- 27. 插入到mysql数据库
- 28. 插入到MySQL数据库
- 29. 插入MySQL数据库
- 30. 是否安全?用户将数据插入数据库..?
['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
先前的StackOverFlow问题可以回答你的问题:http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php http://stackoverflow.com/questions/4461759/parameterized - 查询 – 2012-01-06 14:10:49