使用CodeIgniter防止MS SQL注入

时间:2017-06-09 11:26:17

标签: php codeigniter security sql-injection

我想找到一种在CodeIgniter框架中开发的Web应用程序中缓解SQL注入的最佳方法(Web应用程序使用带有ODBC连接的MS SQL后端数据库)。

我们假设我有一个像这样的简单易受攻击的代码:

$this->db->query("SELECT * FROM users WHERE Login = '".$_GET['name']."'");

此查询显然容易受到HTTP GET参数“name”的SQL注入攻击。

我已经阅读了CodeIgniter文档以及我在网上找到的所有内容,以了解如何在CodeIgniter中缓解这种简单的SQL注入,并尝试了以下所有选项:

选项1:

$this->db->query("SELECT * FROM users WHERE Login = ".$this->db->escape($_GET['name']));

选项2:

$this->db->select("*")->from("users")->where('Login', $_GET['name'])->get();

选项3:

$query = "SELECT * FROM users WHERE Login = '?'"; 
$this->db->query($query, array($_GET['name']));

选项4:

$query = "SELECT * FROM users WHERE Login = ?"; 
$this->db->query($query, array($_GET['name']));

我很震惊地发现上述所有四个选项都与初始查询一样容易受到SQL注入攻击。我想知道从安全角度来看CodeIgniter的设计是否如此糟糕,或者我是否缺少一些重要的配置。

在这种情况下,是否有任何概念性的方法可以防止CodeIgniter中的SQL注入?

2 个答案:

答案 0 :(得分:2)

好好经过几个小时的斗争,我自己找到了答案。

3.1.1版之前的CodeIgniter ODBC驱动程序中存在SQL注入漏洞。因此,即使编码样式(查询绑定)从安全角度来看是正确的(如选项4中所示),应用程序仍然容易受到用户提供的输入的SQL注入攻击。

我通过安装CodeIgniter 3.0.6和3.1.0并行运行相同的查询来验证。 CodeIgniter 3.0.6中的代码仍然容易受到SQL注入攻击,而CodeIgniter 3.1.0中运行的代码则不然。

CodeIgniter更改日志https://www.codeigniter.com/userguide3/changelog.html

为未来吸取了教训。永远记住也要检查框架版本。

答案 1 :(得分:1)

  • check every single user input for datatype and where applicabile with regular expressions (never trust user input)
  • use prepared statements

it's a lot of work especially if your application is in bad shape but it's the best way to have a decent security level

the other way (which i'm advising against) could be virtual patching using mod_security or a WAF to filter out injection attempts but first and foremost: try to write robust applications (virtual patching might seem to be a lazy way to fix things but takes actually a lot of work and testing too and should really only be used on top of an already strong application code)