【问题标题】:Codeigniter form validation securityCodeigniter 表单验证安全性
【发布时间】:2012-11-21 05:18:58
【问题描述】:

我们使用 Codeigniter 创建了一个项目,它非常酷且高效。

CI 有一个很好的表单验证功能,它有助于保护系统,但是我很难找到使用规则的正确方法。

请看下面

假设ID是一个整数字段,这样我就可以设置

$this->form_validation->set_rules("ID","FORM ID","required|trim|integer");

我认为这就足够了,因为如果ID 字段包含integer 以外的内容,表单验证将返回错误。

但是对于普通的FORM字段(文本区域或普通输入类型的文本字段)应该有什么规则,

要求

  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注入............stackoverflow.com/questions/60174/…
  • @Venkat CI 拥有我们需要的一切,但我们需要了解如何使用。
  • 是的,你是对的,但是在你设置了某些规则来防止 sql 注入之后你怎么知道它是否有效......你知道如何进行 sql 注入...... ..如果是这样,请尝试现有规则,如果失败,请尝试使用新功能
  • 我不是安全专家,仅凭我的知识进行检查是不够的,这就是我发布这个问题的原因,你提供的链接对 CI 没有用。

标签: php security codeigniter sql-injection xss


【解决方案1】:

使用 Codeigniters 验证库是加强安全性的第一步。您应该使用它来删除任何无效字符(HTML、潜在的 XSS/SQL 攻击等)。

根据您的要求:

strip_tags - 删除任何 HTML 标签
xss_clean - 删除任何潜在的 xss 攻击字符串

为防止 SQL 注入攻击,您还可以在验证规则中使用 alpha_numeric 之类的内容,通过仅允许使用字母数字字符来防止潜在的危险字符。

防止 SQL 注入的另一种方法是在向数据库传递和检索数据时使用 Codeigniters 活动记录库。如果您按预期使用 Codeigniters 活动记录,它将自动删除可用于 SQL 注入攻击的危险字符。

方法一(去除无效字符)——利用活动记录库的WHERE函数参数

$query = $this->db->where('username', $username);
$query = $this->db->get('users');

方法二(无保护)——直接写where语句

$this->db->where('username = '.$username);
$query = $this->db->get('users');

方法3(无保护)——将整个SQL语句直接写入查询函数中

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

当不使用活动记录库时,codeigniter 提供了转义字符串的功能(使它们可以安全地输入数据库)。

$this->db->e​​scape() 这个函数确定数据类型,以便它 只能转义字符串数据。它还会自动添加单引号 围绕数据,因此您不必:

用法示例:

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

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

【讨论】:

  • 一个小注释 CI 允许参数化查询,我正在使用那个,而且我的几乎所有 where 子句(来自用户)通常都是整数,我认为使用 intval 将保护那里的东西。跨度>
  • $this->db->query('SELECT * FROM users WHERE username = ?', array($username)); 相同的结果和更少的痛苦。
  • 能否请将安全链接发给我,因为我在 google 上找不到它的文档!
【解决方案2】:

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

如果您从表单中获取值,您可以通过在字段名称后添加 TRUE 来清除 XSS 示例:提交表单中名为 first_name 的字段

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2016-09-05
    相关资源
    最近更新 更多