是mysql_real_escape_string
足够的清洁用户输入在大多数情况下?
::编辑::
我想主要是防止SQL注入的条件,但我最终还是想知道,如果我申请mysql_real_escape_string或者我是否应该采取额外的措施来清理数据之前,我通过它周围的应用和数据库后,我可以信任的用户数据。
我看到清洁的HTML字符是重要的,但我不认为有必要的信任用户输入。
Ť
是mysql_real_escape_string
足够的清洁用户输入在大多数情况下?
::编辑::
我想主要是防止SQL注入的条件,但我最终还是想知道,如果我申请mysql_real_escape_string或者我是否应该采取额外的措施来清理数据之前,我通过它周围的应用和数据库后,我可以信任的用户数据。
我看到清洁的HTML字符是重要的,但我不认为有必要的信任用户输入。
Ť
mysql_real_escape_string
是不是在所有情况下足够的,但它绝对是非常好的朋友。 更好的解决方案是使用预处理语句
//example from http://php.net/manual/en/pdo.prepared-statements.php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
另外,不要忘记HTMLPurifier可以用来丢弃任何无效/可疑人物。
...........
编辑:基于下面的评论,我需要张贴此链接(我以前做过对不起用于制造混乱)
mysql_real_escape_string()对准备语句
引用:
mysql_real_escape_string()易发生同种影响和addslashes问题()。
克里斯·夏夫利特 (安全专家)
在回答你的问题是第mysql_real_escape_string()不适合于所有的用户输入和mysql_real_escape_string()不停止所有的SQL注入。 和addslashes()是另一种流行的功能在PHP中使用,它有同样的问题。
漏洞的代码:
mysql_query("select * from user where id=".mysql_real_escape_string($_GET[id]));
小漏洞:
http://localhost/sql_test.php?id=1 or sleep(500)
补丁是利用各地ID引号:
mysql_query("select * from user where id='".mysql_real_escape_string($_GET[id])."'");
真的是最好的方法是使用其中一些人ahve指出参数化查询。 PDO效果很好,ADODB是PHP的另一种流行的库。
如果你使用mysql_real_escape_string是应仅用于SQL注入,而不是其他。 漏洞是高度依赖于数据如何被使用。 每个人都应该对功能的基础功能应用安全性的措施。 是的,XSS是一种很严重的问题 。 未过滤的HTML是一个严重的错误,一个黑客将使用pw3n你。 请阅读XSS常见问题 。
到数据库中,是的。 你要考虑充分转义输出/编码数据为好。
你也应该考虑验证输入针对你所期望的那样。
你有没有考虑使用预处理语句 ? PHP提供了多种方式与您的数据库进行交互。 其中大部分是比mysql_ *功能更好。
PDO , MDB2和改进MySQL的应该让你开始。
什么情况?
对于SQL查询,这是伟大的。 (预处理语句是更好-我投PDO对于这一点-但功能逃脱就好了。)对于HTML之类的,它不适合工作的工具-尝试一个通用的htmlspecialchars
或像一个更精确的工具HTML过滤 。
为了解决编辑 :您可以添加的唯一其他层是数据valdation,如确认:如果你是把一个整数到数据库中,和你期待一个正整数,你试图将一个返回一个错误给用户负整数。 至于数据的完整性而言, mysql_real_escape_string
是你有逃跑的最好(虽然,再次,准备语句是避免完全逃脱清洁系统)。
mysql_real_escape_string()
是为了防止仅SQL注入攻击是有用的。 它不会帮你防止跨站点脚本攻击。 对于这一点,你应该使用htmlspecialchars()
只输出最初从用户输入收集的数据之前。
有两种方法,一种是使用准备好的语句(如在其他的答案中提到),但会减慢你的应用程序,因为你现在有两个请求发送到数据库,而不是一个。 如果你可以用降低性能住,然后去了; 预处理语句使你的代码更漂亮,更容易对付。
如果您选择使用mysql_real_escape_string,然后确保你逃避一切是不可信的字符串。 安(mysql_real_escape_string)转义字符串是SQL注入安全 。 如果你不逃避所有的字符串,那么你并不安全。 你真的应该结合了输入验证mysql_real_escape_string; 检查一个变量,你希望持有数量确实是一个数字和预期的范围内。 记住,永远不要相信用户。
有不同类型的“清洁”的。
mysql_real_escape_string是足够的数据库中的数据,但仍然会由浏览器在显示时进行评价,如果是HTML。
要删除用户输入HTML,您可以使用用strip_tags 。
我建议你考虑使用PDO ,而不是常规的MySQL的东西,因为它支持预处理语句的开箱,而那些为您处理无效数据的转义。
你可以试试,具体情况如
function clean_input($instr) {
// Note that PHP performs addslashes() on GET/POST data.
// Avoid double escaping by checking the setting before doing this.
if(get_magic_quotes_gpc()) {
$str = stripslashes($instr);
}
return mysql_real_escape_string(strip_tags(trim($instr)));
}
去最好的办法是使用预处理语句
我想我补充一点,PHP 5.2 +具有输入滤波功能,可以在多种方式过滤用户输入。
这里的手工录入 ,以及一个博客帖子 [由马特·布彻]为什么他们是伟大的。