使用mysql_query的参数

时间:2009-11-30 11:57:16

标签: php mysql

在学习的某个地方,我找到了一些有趣的东西......它说的是:

$query = sprintf("SELECT firstname, lastname, address, age FROM friends 
WHERE firstname='%s' AND lastname='%s'",mysql_real_escape_string($firstname),
    mysql_real_escape_string($lastname));

使用像这样的查询代替

$query="select firstname, lastname, address, age FROM friends
WHERE firstname='".$_RETURN['name1']."', lastname='".$_RETURN['name2']."'";

这看起来是否合理..你有没有试过这种编码......以及它如何帮助防止任何恶意攻击..

3 个答案:

答案 0 :(得分:5)

首先,这就是SQL-Injection。它基本上只是通过用户输入改变对数据库的查询的可能性。

让我们看一个例子:

查询:

SELECT temp1 FROM temp WHERE temp2 = 'VAR1';

现在我们将为VAR1指定以下值:'; DROP TABLE *; -- 我们会得到:

SELECT temp1 FROM temp WHERE temp2 = ''; DROP TABLE *; --';

使用mysql_real_escape_string,它看起来像这样:

SELECT temp1 FROM temp WHERE temp2 = '\'; DROP TABLE *; --'

mysql_real_escape_string'保护'在查询中使用的字符串。

但最后,你应该完全停止使用mysql_* 。在防止SQL注入或其他方法对查询进行调整时,它们被弃用并被认为是不安全的。

You should simply stop concatenating queries together like this并开始使用prepared statements,它不仅更易于使用,默认情况下会阻止SQL注入,还可以提高应用程序的速度。

对于PHP,有两个扩展名旨在关闭整个mysql_*已打开:

我再说一遍: 请停止使用mysql_*

答案 1 :(得分:3)

答案 2 :(得分:0)

使用像sprintf这样的格式化功能纯粹是一种品味问题;第一个例子中的一大优点是函数mysql_real_escape_string阻止了所有SQL注入(在其他一个答案中解释);不像PHP中有些不确定的magic_quotes_gpc功能,很多人都依赖它。

magic_quotes_gpc会自动逃避您在客户请求中收到的内容......但它无法检测到所谓的二级注入:

  1. 您从客户端收到恶意查询并将其内容存储在数据库中。 magic_quotes_gpc阻止SQL注入;恶意字符串存储正确。
  2. 稍后,您从数据库中获取此字符串并将其包含在另一个查询中。现在字符串不是来自请求,因此magic_quotes_gpc不会转义字符串。 Voilà,SQL注入;你的数据现在可能已经消失了。
  3. 使用某种方式逃避自己,无论是mysql_real_escape_string还是带有查询构建器(例如Adodb)的数据库抽象层,都绝对优于仅仅希望获得最佳效果。