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?