我想找到一种在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注入?
答案 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)
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)