PHP:是mysql
在大多数情况下, mysql_real_escape_string
是否足以清除用户输入?
::编辑::
我主要想的是防止SQL注入,但我最终想知道在应用mysql_real_escape_string之后是否可以信任用户数据,或者在应用程序和数据库传递之前,我应该采取额外措施来清理数据。
我看到清除HTML字符的位置很重要,但我不认为需要信任用户输入。
Ť
mysql_real_escape_string
在所有情况下都不够用,但它绝对是非常好的朋友。 更好的解决方案是使用Prepared Statements
//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()与Prepared Statements
引用:
mysql_real_escape_string()倾向于影响addslashes()的相同类型的问题。
Chris Shiflett (安全专家)
您的问题的答案是否。mysql_real_escape_string()不适合所有用户输入,并且mysql_real_escape_string()不会停止所有sql注入。 addslashes()是另一个在php中使用的常用函数,它也有同样的问题。
弱点代码:
mysql_query("select * from user where id=".mysql_real_escape_string($_GET[id]));
poc漏洞利用:
http://localhost/sql_test.php?id=1 or sleep(500)
补丁是在id周围使用引号:
mysql_query("select * from user where id='".mysql_real_escape_string($_GET[id])."'");
最好的方法是使用许多人指出的参数化查询。 Pdo运行良好,adodb是另一个流行的php库。
如果你使用mysql_real_escape_string,应该只能用于sql注入,而没有别的。 漏洞高度依赖于数据的使用方式。 人们应该在功能的基础上应用安全措施。 是的,XSS是一个非常严重的问题 。 不过滤HTML是严重的错误,黑客将使用它来使用你。 请阅读xss faq。
对数据库来说,是的。 您将需要考虑充分转义/编码输出数据。
您还应该考虑根据您期望的内容验证输入。
你有没有考虑过使用准备好的语句 PHP提供了多种与数据库交互的方式。 其中大部分都比mysql_ *函数更好。
PDO,MDB2和MySQL改进应该让你开始。
链接地址: http://www.djcxy.com/p/93683.html上一篇: PHP: Is mysql
下一篇: How do I specify unique constraint for multiple columns in MySQL?