php - 使用 CodeIgniter 防止 MS SQL 注入(inject)

标签 php codeigniter security sql-injection

我想找到一种最佳方法来减轻在 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/

相关文章:

php - php 中 <p> 的新行

php - 如何从 ubuntu 中删除未使用的 php 版本?

php - Laravel 重新播种表格

php - Codeigniter flashdata - 我是否正确使用它?

java - PHP 文件中的 HTML 验证

php - codeigniter 4 在 include、include_once、require、require_once 之后返回 1

php - Codeigniter事件记录和表别名

security - SHA1可以解密吗

c# - WCF/wsHttpBinding/消息安全 - BadTokenRequest

ASP.net WebRequest 内部 SSL 协议(protocol)?