我想找到一种最佳方法来减轻在 CodeIgniter 框架中开发的 Web 应用程序中的 SQL 注入(inject)(Web 应用程序使用带有 ODBC 连接的 MS SQL 后端数据库)。
假设我有一个简单的易受攻击的代码,如下所示:
$this->db->query("SELECT * FROM users WHERE Login = '".$_GET['name']."'");
此查询显然容易受到通过 HTTP GET 参数“name”进行 SQL 注入(inject)的攻击。</p>
我已阅读 CodeIgniter 文档以及我在网上可以找到的所有内容,以了解如何减轻 CodeIgniter 中的这种简单 SQL 注入(inject),并且我已尝试了以下所有选项:
选项 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 注入(inject)的攻击。我想知道从安全角度来看,CodeIgniter 的设计是否如此糟糕,或者我是否缺少一些重要的配置。
在这种情况下,有什么概念方法可以防止 CodeIgniter 中的 SQL 注入(inject)吗?
最佳答案
好吧,经过几个小时的努力,我自己找到了答案。
CodeIgniter ODBC 驱动程序在 3.1.0 版本之前存在 SQL 注入(inject)漏洞。因此,即使从安全角度来看编码风格(查询绑定(bind))是正确的(如选项 4 中所示),应用程序仍然容易通过用户提供的输入受到 SQL 注入(inject)的攻击。
我通过并排安装 CodeIgniter 3.0.6 和 3.1.0 并运行相同的查询来验证这一点。 CodeIgniter 3.0.6 中的代码仍然容易受到 SQL 注入(inject)的攻击,而 CodeIgniter 3.1.0 中运行的代码则不会。
CodeIgniter 更改日志 https://www.codeigniter.com/userguide3/changelog.html
所以为 future 吸取了教训。始终记得检查框架版本。
关于php - 使用 CodeIgniter 防止 MS SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44456613/