【问题标题】:SQL Injection and CodeigniterSQL 注入和 Codeigniter
【发布时间】:2010-09-26 11:39:12
【问题描述】:

关于 Codeigniter 及其输入处理能力的一些疑问。有些可能有点奇怪,但它们仍然是怀疑。

  1. 如果我在 CodeIgniter 中使用 Active Record 类函数,我的输入是否可以防止 SQL 注入?
  2. 我在某处读到它确实如此,但我不明白它是如何理解的?或者为什么?
  3. xssclean 是否也以任何方式处理 SQL 注入?

【问题讨论】:

标签: codeigniter sql-injection


【解决方案1】:

我的输入是否可以防止 SQL 注入?

不完全是“自动”,但它确实提供了参数化查询。无论是否使用 CodeIgniter,您都应该尽可能使用参数化查询而不是查询字符串黑客攻击。

$bof= "a'b";
$zot= 'a\b';

// Insecure! Don't do this!
//
$this->db->query("SELECT foo FROM bar WHERE bof='$bof' AND zot='$zot'"); 

// Secure but annoying to write
//
$this->db->query("SELECT foo FROM bar WHERE bof='".$this->db->escape($bof)."' AND zot='".$this->db->escape($zot)."'"); 

// This is what you want
//
$this->db->query('SELECT foo FROM bar WHERE bof=? AND zot=?', array($bof, $zot)); 

请注意,这与“输入”无关:当您从字符串进行 SQL 查询时,您必须使用参数化或转义以使其适合,无论它们是否是用户输入.这是一个简单的正确性问题;安全性是这种正确性的副作用。

同样,当您将文本输出为 HTML 时,您需要对其中的 <&" 字符进行 HTML 编码然后。如果您碰巧在没有在 SQL 或 HTML 中转义的情况下使用它们,那么尝试摆弄输入以转义或删除将来可能会遇到麻烦的字符是绝对没有用的。您将通过在 HTML 中进行意外的 SQL 转义(这就是您在编写糟糕的应用程序中看到自乘反斜杠的原因)和在 SQL 中不需要的 HTML 转义来破坏您的输出。如果您从直接用户输入以外的其他地方获取文本(例如,数据库中已经存在的材料),您根本不受保护。

xssclean 是否也以任何方式处理 SQL 注入?

没有。它针对 HTML 注入。但它比一文不值更糟糕。永远不要使用它。

“XSS 过滤”完全是假的(同样是 CodeIgniter 或其他任何人的)。需要通过正确的 HTML 转义输出来防止 XSS,而不是修改输入。如果您的应用程序尚不安全,XSS 过滤将不会充分保护您;充其量它会混淆你现有的缺陷并给你一种虚假的安全感。它还会破坏很多 CI 认为看起来像标签的有效输入。

【讨论】:

  • 有趣!尤其是最后一点。我觉得你的方法真的更好。
  • 想解释一下为什么CI的xssclean一文不值?我真的很好奇!这是我使用 CI 的一半原因。我想知道我是不是在自欺欺人而不安全!
  • 如果您记得对输出到 HTML 页面中的所有字符串进行 HTML 转义,那么无论您是否使用 xss_clean,您都是安全的,它会为您做的只是悄悄地修改你的输入字符串,以可怕的奇怪方式。说真的,看看Input.php 中的function xss_clean 并笑,因为它用% 替换了东西,URL 解码,再次用% 替换东西,破坏了URL 编码的链接,在它们之间用与号混淆了单词,将一些小于号转义为<,并阻止您谈论innerHTML或使用alert这个词......等等......
  • 基本上,它是货物狂热的编程。作者对 HTML 编码和 URL 编码是如何工作的一无所知,所以他们将他们所拥有的所有东西都随意扔掉,希望有什么能坚持下去。如果不是那么难过,那就太好笑了。而且它永远都行不通。即使它本身对字符串有效,也只需要在之后的脚本中进行大量的字符串处理(例如,拆分并与另一个所谓的“安全”字符串连接)以使其再次变得危险。跨度>
  • 看起来他们在那里有这个过滤器,并且每隔一段时间就会有人想出一个绕过它的漏洞,此时他们会抛出更多虚假的垃圾来瞄准那个漏洞,而没有解决真正的问题。阻止 alert 是一种症状,因为它是一个 JS 函数,您通常使用它来证明 XSS 漏洞存在;没有真正的利用该漏洞会真正弹出一个警告框!还有多种方式,他们尝试解析 HTML 以寻找“坏”标签......天哪。
【解决方案2】:

1.如果你做得好,它会发生

2. 您可能已经注意到,所有函数调用都以一种方式,即每个用户数据都在一个变量中传递。因此,您甚至不可能在一个变量中传递 SQL 控制代码和用户数据。简而言之,每个数据都封装在一个变量中。因此,它可以安全地编码而不会破坏您的 SQL 代码。 但是,如果您传递了整个查询,则例外。那么它是不可能的。 如果你这样做了

$db->query("select * from table where password = 'hello ' or '1=1");

没有办法知道什么应该转义,什么不是,但如果你像这样引用它

$db->query("select * from table where password = ?",array('param1'));

用户变量被封装在一个变量中并将被转义。

3. 是的,但它的主要目的不是防止 sql 注入, 我宁愿依靠http://codeigniter.com/user_guide/libraries/input.html

【讨论】:

  • 我认为这里的?参数不应该有单引号。
  • 嗯......真的不能说。我认为这样是正确的。当然,当你有整数时你不需要它,但这并不重要......所以这样写可能更好?
  • 好吧,我还没有专门用 CodeIgniter 尝试过这个,但到目前为止,进行参数化查询的最常见方法是使用裸 ? 作为替换点,并将 '?' 视为一个字符串作为一个实际的问号。无论如何,这似乎是codeigniter.com/user_guide/database/queries.html 给出的语法。
【解决方案3】:

每当您使用用户生成的输入时,然后将其传递给输入库,在那里它会过滤 xss 和 sql 注入。

$this->input->post() 

http://codeigniter.com/user_guide/libraries/input.html

请查看有关安全过滤的更多信息。

在 CI 框架内检查文件

Codeigniter->System-libraries->input.php

您可以在其中找到 CI 用于清理数据的函数的内部文件。

XSS clean 基本上意味着过滤掉不需要的 XHTML/HTML 标签

【讨论】:

  • 根据你自己的链接$this->input->post()对防止SQL注入没有任何作用。
猜你喜欢
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2017-11-11
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多