Codeigniter表单验证安全性

3
我们使用Codeigniter创建了一个项目,它非常酷且高效。
CI有一个良好的表单验证功能,帮助保护系统安全,但我正在苦苦寻找正确使用规则的方法。
请看下面的例子:
假设ID是一个整数字段,那么我可以设置:
$this->form_validation->set_rules("ID","FORM ID","required|trim|integer");

我认为这已经足够了,因为表单验证会在ID字段包含非整数时返回错误。

但是对于普通的表单字段(文本区域或常规输入类型文本字段),应该遵守什么规则呢?

要求

  1. 不允许使用HTML(或需要删除这些标记)
  2. XSS清除
  3. SQL注入预防

目前我正在进行以下操作:

$this->form_validation->set_rules("FIELD_NAME","FIELD_NAME","required|trim|xss_clean|strip_tags");

这个系统是否足够安全?

浏览一下这个链接,我认为你可以使用原生函数如PDO、mysql_escape-string来防止SQL注入……https://dev59.com/oHVD5IYBdhLWcg3wL4cA - Venkata Krishna
@Venkat CI 我们拥有一切所需,但我们需要理解如何使用。 - Red
是的,你说得对。但是,当你加入某些规则来防止 SQL 注入时,你如何知道它是否有效呢?你知道如何进行 SQL 注入吗?如果知道,请尝试使用现有规则,如果失败了,则尝试使用新的函数。 - Venkata Krishna
我并不是安全方面的专家,仅凭我的知识进行检查是不够的,这就是为什么我发布了这个问题。你提供的链接对CI来说没有用处。 - Red
2个回答

6
使用Codeigniter的验证库是加强安全性的第一步。你应该使用它来移除任何无效字符(HTML、潜在的XSS/SQL攻击等)。
根据您的要求: strip_tags - 移除任何HTML标签
xss_clean - 移除任何潜在的XSS攻击字符串
为了防止SQL注入攻击,您还可以在验证规则中使用像alpha_numeric这样的东西,以通过仅允许字母数字字符来保护免受潜在危险字符的影响。
另一种防止SQL注入的方法是在将数据传递到数据库和从数据库检索数据时使用Codeigniters活动记录库。如果按预期使用Codeigniters活动记录,则它将自动剥离可能用于SQL注入攻击的危险字符。 方法1(删除无效字符)-利用活动记录库WHERE函数参数的优势
$query = $this->db->where('username', $username);
$query = $this->db->get('users');

方法二(无保护)- 直接编写where语句
$this->db->where('username = '.$username);
$query = $this->db->get('users');

第三种方法(无保护)- 直接将整个SQL语句写入查询函数
$this->db->query('SELECT * FROM users WHERE username = '.$username);

当不使用Active Record库时,CodeIgniter提供了转义字符串的函数(使它们可以安全地输入到数据库中)。

$this->db->escape()此函数确定数据类型,以便仅转义字符串数据。它还自动在数据周围添加单引号,因此您不必这样做:

示例用法:

$this->db->query('SELECT * FROM users WHERE username = '.$this->db->escape($username));

参考文献:http://codeigniter.com/user_guide/database/queries.html

该链接为CodeIgniter框架的官方数据库查询文档。

一个小提示:CI允许参数化查询,我正在使用它,而且几乎所有我的where子句(来自用户)通常都是整数,我认为使用intval会保护一些东西。 - Red
$this->db->query('SELECT * FROM users WHERE username = ?', array($username)); 相同的结果,更少的痛苦。 - Robin Castlin
请问您能否发送给我安全链接,因为我在谷歌上找不到它的文档! - Duc Babe

1

还有一个很酷的CI安全功能

如果您从表单中获取值,可以在字段名称后添加TRUE进行XSS清理 例如:从提交的表单中获取名为first_name的字段

$firstname = $this->input->post( 'first_name', TRUE );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接