【问题标题】:Use of parameters for mysql_querymysql_query 参数的使用
【发布时间】:2009-11-30 11:57:16
【问题描述】:

在学习的时候我发现了一些有趣的东西。它说如下:

$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']."'";

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

【问题讨论】:

  • 我尝试在查询中使用 mysql_real_escape_ 字符串来保护数据,但是垃圾邮件也来了..你能告诉我该怎么做..或者可能的原因错误..

标签: php mysql


【解决方案1】:

首先,这被称为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
【解决方案2】:

据我所知,mysql_real_escape_string is one of the better ways to prevent SQL injection 没有使用带有 mysqliPDO 的准备好的语句。

【讨论】:

  • Prepared statements 在我看来是最好的方式,因为它们不会混合数据和 SQL。
【解决方案3】:

使用像sprintf 这样的格式化函数纯粹是个人喜好问题;第一个示例的最大优势是函数mysql_real_escape_string 可以防止所有SQL 注入(在其他答案之一中进行了解释);不像 PHP 中有些不确定的 magic_quotes_gpc 功能,很多人都依赖它。

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

  1. 您从客户端获得恶意查询并将其内容存储在数据库中。 magic_quotes_gpc 防止 SQL 注入;恶意字符串被正确存储。
  2. 稍后,您从数据库中获取此字符串并将其包含在另一个查询中。现在字符串不是来自请求,所以magic_quotes_gpc 不会转义字符串。瞧,SQL 注入;您的数据现在可能已经消失了。

使用某种方式来逃避自己,无论是mysql_real_escape_string 还是带有查询构建器(例如 Adodb)的数据库抽象层,绝对比只希望最好的方式更好。

【讨论】:

  • 所以你的意思是我可以使用两个'mysql_real_escape_string'或'magic_quotes_gpc'中的任何一个......它们都将帮助我避免注入????
  • 永远不要使用魔术引号。默认情况下,依赖魔术引号的代码会被破坏。
猜你喜欢
  • 1970-01-01
  • 2012-11-30
  • 2021-09-26
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多