使用CodeIgniter开发时的安全实践

代码脚本   1137阅读

在开发本程序的过程中,遇到安全类的使用,CodeIgniter的安全类使用起来比较方便,而且考虑的也比较全面。安全问题是不能回避的问题,但往往会被疏忽。在这篇日志中,我打算将平时开发的比较好的实践过程介绍以下。

从数据的角度来考虑安全风险,主要是访客通过网页入口读写数据库,这个过程就会暴露出安全问题,所以在写程序的时候要尽量考虑全面,把风险的缝隙堵住。nn对于数据的处理,第一个方面是要对XSS恶意脚本进行过滤,另一个方面是要对存入数据库的数据进行转义。过滤XSS恶意脚本的目的是防止XSS的攻击,而转义数据是对数据库的一种保护,同时也是避免通过sql语句来进行的的攻击行为。

在对输入数据进行处理的时候,需要坚持某一种原则,表述如下:n在数据存入数据库时只做转义处理,而XSS过滤应该是在数据输出的时候做。目的是为了保持数据的完整性。

第一,在数据存入数据库之前作转义处理,将单引号转换成带斜杠+单引号的形式。

CodeIgniter已经考虑到了这一点,所以在执行插入语句时,只需要用$this->db->escape_str()转义数据

$this->db->insert($this->config->item('comments'),  $this->db->escape_str($param));

第二,页面上需要显示数据的地方,将数据从数据库取出来,经过xss_clean处理。

这行代码可以在控制器中加,也可以在视图文件里加,CodeIgniter比较灵活。

<?=  xss_clean($value['message'])?>

message是用来存评论的内容子段,可以输入任何字符包括<script>,在不进行XSS处理的情况下,页面打开时也会执行访客评论的javascript脚本。当然,经过xss_clean过滤之后就不用担心了。

第三,防止csrf攻击,也就是防止跨站请求伪造。

在CodeIgniter框架里面,可以通过config.php中的配置$config['csrf_protection'] = TRUE;来开启全站的csrf攻击防护。在使用form_open生成表单会自动添加一个隐藏的input域。post提交表单时会传一个动态的token到服务器端。

我的程序里面不是用form_open辅助函数生成表单,另外使用的是ajax提交数据。ajax提交的代码示例:

   datastring = {
        'author_name':author_name,
        'author_email':author_email,
        'author_url':author_url,
        'message':message,
        'up_id':up_id,
        'thread_key':'<?=$article_info['id']?>',
        'created_at':'<?=  time()?>',

        '<?php echo $this->security->get_csrf_token_name(); 
?>' : '<?php echo $this->security->get_csrf_hash(); ?>'
    };
    $.ajax({
      type:"POST",
      url:"<?=$base_url?>index/comment_save",
      data:datastring,
      dataType:"json",
      success:function(sdata){}
      });


上面是评论提交时的脚本,有心的人可以直接提交index/comment_save这个链接,由于CodeIgniter的csrf防护只对post有效,而get则无效,因此,在comment_save的服务端脚本中,还对get或者post作处理。

总结:

以上内容是在使用CodeIgniter开发时对数据安全处理方面的三个实践点,相比没有这层保护,对脏数据的防护要好多了。

喜欢请常来,打赏请随意。