代码之家  ›  专栏  ›  技术社区  ›  Paul

MySQL比PostgreSQL(在Perl/DBI下)更能抵抗SQL注入攻击吗?

  •  4
  • Paul  · 技术社区  · 16 年前

    我正在回顾一个基于Linux的PerlWeb应用程序,它包含了一个无所不在的登录处理程序

    my$sth=$db->准备(“从userid=$userid'的密码中选择密码”)或死亡;$sth->执行或死亡;…

    其中$userid是从(不安全、未筛选)Web用户输入初始化的。

    众所周知,DBI文档建议将此代码更改为使用占位符“?”代替“$userid”以保证安全。

    出于安全审查的目的,此代码被隔离在非网络设备上。 像这样的代码在互联网服务器上最终会被破解,因为现在有机器人在扫描这个漏洞。访问控制对于保护任何重要内容也是无效的,因为已知的注入可以删除数据库、插入错误数据或新用户,或者绕过访问控制以允许进入Web应用程序。

    由于应用程序可以配置为使用PostgreSQL或MySQL,并且对比较脆弱性提出了问题,我尝试了两个数据库,并通过一些SQL注入尝试测试了每个配置。

    在PostgreSQL下输入';在这里做坏事;在这里;会按预期崩溃登录CGI并执行坏事。

    出乎意料的是,MySQL抵抗了这次攻击。这让我想知道,对于dbd::mysql或其他任何一个调用,是否有某种类型的设置限制了每个调用只准备一个语句,或者mysql是否以其他方式抵抗。

    据我所知,MySQL一般不支持SQL注入。

    这不仅仅是一个关于消除SQL注入的技术的问题;为此,请参阅 How can I avoid SQL injection attacks? .

    问题是:在perl-dbi下,mysql比postgresql对SQL注入攻击的抵抗力更强吗?为什么会这样?

    4 回复  |  直到 16 年前
        1
  •  8
  •   laurentb    16 年前

    默认情况下,MySQL客户机库似乎只限于每个调用一条语句(我在PHP中遇到过它)。

    但这不应该成为在PostgreSQL上使用MySQL的原因,因为您仍然可以使用子查询进行注入。

        2
  •  11
  •   Bob Jarvis - Слава Україні    16 年前

    防止注入攻击不是数据库的责任,而是开发人员的责任。如果开发人员编写的代码通过连接从用户输入中派生的字符串来创建查询,则结果查询将容易受到注入攻击,并且用于清理等的所有代码都是浪费时间的。如果代码是为使用参数化查询而编写的,并且用户输入被降级为用作参数值,则生成的查询将相当安全,不会受到注入攻击。(我很想知道如何通过参数值进行注入攻击)。

    分享和享受。

        3
  •  3
  •   Evan Carroll    16 年前

    不,事实上,MySQL几乎没有那么安全,在这种情况下,它看起来好像根本没有在服务器上完成准备语句。

    准备好的语句支持(服务器 侧面准备)从3.0002_1开始,服务器 旁白在旁边 默认值(如果您的服务器是>=4.1.3)。 截至3.0009年,它们默认为关闭状态。 再次由于与准备的问题 语句API(所有其他MySQL 连接器按此方式设置,直到C API问题已解决)。这个 使用准备好的报表的要求 仍然保留服务器“>=4.1.3”

    准备使用服务器端 语句,你所需要做的就是设置 变量mysql_server_prepare in 连接:

    $dbh=dbi->连接( “dbi:mysql:database=test;host=localhost;mysql_server_prepare=1”, “”,“,raiseError=>1,自动提交 = & gt;1 };

    • 注意:此参数的分隔符是';'

    使用它有很多好处 服务器端准备语句,主要是 如果要执行许多插入操作 因为这个事实 声明准备接受 多个插入值。

    确保“进行测试”步骤 测试服务器准备是否工作, 你只需要导出env 变量mysql_server_prepare:

    导出mysql_server_prepare=1

    大概,它们是在PostgreSQL的服务器上准备的。

    就安全性而言,你只是做错了:使用 ? 如你所说。否则,你只是在利用Postgres可以准备多个语句:这不是什么负面的东西。我相信MySQL也可以做到这一点,这里唯一的区别是dbd::MySQL声称C API问题排除了服务器端准备的使用,因此它们依赖其他源作为服务器的权威。现在dbd::mysql可能在一个mysql库中使用c函数,这个库比mysql有服务器端准备(我猜是4.1.3之前的版本)。

        4
  •  0
  •   Ioan    16 年前

    如果不是不可能的话,有一个通用的SQL注入消毒剂可能是困难的。

    添加了[正如注释所示,正确使用DBI,在DB客户机库的帮助下,可以在准备SQL语句时最小化注入。但是,必须记住,清理用户输入还涉及独立于所用数据库的应用程序逻辑。例如,使用其他用户的凭据可能会提供有效的 安全的 声明,但有意想不到的后果。不管怎样,这比问的问题要深入得多。]

    删除[您最好自己清理输入,而不是对客户端抵抗这些类型的攻击有任何虚假安全感。不是说你不应该使用它们,只是不要假定它们提供的帮助不只是针对攻击的最小帮助。]