【发布时间】:2017-11-11 09:38:54
【问题描述】:
我想找到一种最佳方法来减轻在 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 有什么问题?
-
我已经对应用程序进行了渗透测试,其中包含我帖子中提到的易受攻击的代码行。现在,我想提出解决方案如何解决它。我测试了帖子中的所有四个选项,它们都对我有用——但这实际上并不重要。如果我使用应该是安全的选项 4 并提交以下 HTTP GET 参数 ?name=nonexistent' OR 1=1 则应用程序会引发以下错误:[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotes在字符串 '' 之后标记。 SELECT * FROM auth_user WHERE Login = '不存在' OR 1=1'
-
你确定,第四个选项不安全吗?第三个选项实际上不应该工作。你应该写
?而不是'?'。这样做的原因是整数值不需要转义,但字符串值会被 CodeIgniter 自动转义,然后用引号括起来。此外,这个问题可能与stackoverflow.com/questions/5857386/… 重复 -
我打开了这个问题,因为stackoverflow.com/questions/5857386/… 中的任何内容都不适合我。我用选项 4 替换了原始易受攻击的代码,并且我能够执行与以前完全相同的 sql 注入。也许它与后端 MS SQL 和 ODBC 有关。不太确定...
标签: php codeigniter security sql-injection