阅读“CodeIgniter中国》文档首页》常规主题》安全”之抄录

一、安全

     1.1 URI 安全

       Codeigniter严格限制URI中允许出现的字符,以此来减少恶意数据传到你的应用程序的可能性。URI中只允许包含一些字符:

       a.字母和数字         b.波浪符:~           c.百分号:%             d.句号:.

       e.冒号::                  f.下划线:_             g.连字号:-              h.空格 

     1.2 Register_globals

         在系统初始化期间,如果发现任何$_GET、$_POST、$_REQUEST和$_COOKIE 数组中的键值变成了全局变量,则删除该变量。

          这个过程和设置register_globals=off效果是一样的。

     1.3 display_errors

       在生产环境下,一般都是通过将display_errors标志设置为0来禁用PHP的错误报告。这可以阻止原生的PHP错误被显示到页面上,错误中可能会包含潜在的敏感信息。

       在CodeIgniter中,可以将index.php文件中的ENVIRONMENT常量设置为'production',这样也可以关闭这些错误信息。

      1.4 magic_quotes_runtime

         在系统初始化期间,magic_quotes_runtime指令会被禁用,这样当你在从数据库中获取数据时就不用再去除反斜线了。

      1.5 最佳实践

         在你的应用程序处理任何数据之前,无论这些数据是来自于提交的表单POST,还是来自COOKIE、URI、XML-RPC,或者甚至是来自于SERVER数组,你都应该使用下面这三步来处理:

          a.验证数据类型是否正确,以及长度、大小等等

          b.过滤不良数据。

          c.在提交到数据库或者显示到浏览器之前对数据进行转义

      CodeIgniter提供了以下的方法和技巧来帮你处理该过程:

        1.6 XSS过滤

           CodeIgniter自带有一个XSS过滤器,这个过滤器可以查找一些XSS的常用技术,例如向你的数据中嵌入恶意的JavaScript脚本,劫持cookie信息或其他一些技术。XSS过滤器在这里 有更详细的描述。

注解:
  XSS过滤只应该在输出数据时使用。对输入的数据进行过滤可能会在无意中对数据造成修改,例如过滤密码中的特殊字符,这样会降低安全性,而不是提高安全性。

         1.7 CSRF保护

           CSRF(Cross-Site Request Forgery,跨站请求伪造)是攻击者骗取受害者在不知情的情况下提交请求的攻击方式。

           CodeIgniter提供了对CSRF的保护,会在每个非GET HTTP请求时自动触发,当然前提是你要使用某种方式来创建表单,这在 安全类 文档中有进一步的解释。

         1.8 密码处理

             在你的应用程序中正确处理密码是非常关键的。

              我们提供了一个清单来帮助你,告诉你什么该做,什么不该做。

              a)绝不要以明文存储密码。

                 永远使用哈希算法来处理密码。

               b)绝不要使用Base64或其他编码方式来存储密码。这和以明文存储密码是一样的,使用哈希,而不要使用编码。编码以及加密,都是双向的过程,而密码是保密的,应该只被它的所有者知道,这个过程必须是单向的。哈希正是用于做这个的,从来没有解哈希这种说法,但是编码就存在解码,加密就存在解密。

               c) 绝不要使用弱哈希或已被破解的哈希算法,像MD5或SHA1.

                   这些算法太老了,而且被证明存在缺陷,它们一开始就并不是为了保存密码而设计的。另外,绝不要自己发明算法。

                   只使用强密码哈希算法,例如BCrypt,在PHP自己的 密码哈希 函数也是使用它。

                d) 绝不要以明文形式显示或发送密码。

                    即使是对密码的所有者也应该这样。如果你需要"忘记密码"的功能,可以随机生成一个新的一次性的(这点很重要)密码,然后把这个密码发送给用户。

                 e)绝不要对用户的密码做一些没必要的限制。

                     如果你使用除BCrypt(它有最多72字符的限制)之外的其他哈希算法,你应该设置一个相对长一点的密码长度(例如1024字符),这样可以缓解DoS攻击。

             1.9 验证输入数据

                  CodeIgniter有一个 表单验证类 用于帮助你验证、过滤以及预处理你的数据。

                  就算这个类不适用于你的使用场景,那么你也应该确保对输入数据进行验证过滤。例如,你希望接受一个数字型的参数,你可以使用is_numeric()或ctype_digit()函数来检查以下。永远将数据限制在你运行的范围内。

                   记住,不仅要验证$_POST和$_GET变量,而且也不要放过cookie、user-agent以及其他所有的不是直接由你的代码生成的数据。

               2.0 插入数据库之前对数据进行转义

                   永远不要不做转义就将数据插入到数据库,更多信息,可以阅读 数据库查询 .

               2.1 隐藏你的文件

                     另一个很好的安全实践是,在你的webroot目录(通常目录名为"htdocs/")下只保留index.php文件和"assets"目录(用于存放js、Css、图片等静态资源)。只需要这些文件能从Web上访问就可以了。

                      允许你的访问者访问其他位置可能潜在的导致他们访问一些敏感数据或者执行脚本等等。

                      如果你不允许这样做,你可以使用.htaccess文件来限制对这些资源的访问。

                      CodeIgniter在每个目录下防止了一个index.html文件,试图隐藏这些敏感数据,但是要记住的是,这对于防止一个真正的攻击者来说并不够。

二、CodeIgniter特性

        支持的主要特性列表:

        a)基于MVC体系

        b)超轻量级

        c)对数种数据库平台的全特性支持

        d)支持查询构造器

        e)表单与数据验证

        f)安全性与XSS过滤

        g)会话管理

        h)发送邮件类,支持附件、HTML或文本邮件、多协议(sendmail、SMTP、Mail)及更多

         i)图像处理库(裁剪、缩放、旋转等),支持GD、ImageMagick和NetPBM

         j)文件上传类

         k)FTP类

         l)本地化

         m)分页

         n)数据加密

         o)基准测试

         p)全页面测试

         q)错误日志

         r)应用程序评测

         s)日历类

         t)User-Agent类

         u)Zip编码类

         v)模板引擎类

         w)Trackback类

         x)XML-RPC类

         y)单元测试类

         z)搜索引擎友好的URL

         aa) 支持钩子和类扩展

         ab) 大量的辅助函数

三、应用程序流程图

       下图说明了整个系统的数据流程:

        

          1.index.php文件作为前端控制器,初始化运行CodeIgniter所需的基本资源;

           2.Router检查HTTP请求,以确定如何处理该请求;

           3.如果存在缓存文件,将直接输出到浏览器,不用走下面正常的系统流程;

           4.在加载应用程序控制器之前,对HTTP请求以及任何用户提交的数据进行安全检查;

           5.控制器加载模型、核心类库、辅助函数以及其他所有处理请求所需的资源;

           6.最后一步,渲染视图并发送至浏览器,如果开启了缓存,视图会被先缓存起来用于后续的请求。

四、模型-视图-控制器

       CodeIgniter的开发基于MVC设计模式。MVC是一种用于将应用程序的逻辑层和表现层分离出来的软件方法。在实践中,由于这种分离所以你的页面中只包含很少的PHP脚本。

        a)模型  代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。

        b)视图  是要展现给用户的信息。一个视图通常就是一个网页,但是在CodeIgniter中,一个视图也可以是一部分页面(例如页头、页尾),它也可以是一个RSS页面,或其他任何类型的页面。

         c)控制器 是模型、视图以及其他任何处理HTTP请求所必须的资源之间的中介,并生成网页。

 五、CodeIgniter URL

         URL 分段

         如果遵循模型-视图-控制器模式,那么URL中的每一段通常表示下面的含义:

example.com/class/function/ID

          1.第一段表示要调用的控制器 类;

          2.第二段表示要调用的类中的函数或方法;

          3.第三段以及后面的段代表传给控制器的参数,如ID或其他任何变量;

 六、网页缓存

       可以针对到每个独立的页面进行缓存,并且你可以设置每个页面缓存的更新时间。当页面第一次加载时,缓存将被写入到application/cache目录下的文件中去。之后请求这个页面时,缓存将被写入到application/cache目录下的文件中去。之后请求这个页面时,就可以直接从缓存文件中读取内容并输出到用户的浏览器。如果缓存过期,会在输出之前被删除并重新刷新。

     

            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值