三不朽

七牛云存储PHP生成管理凭证以及查看文件(state)

Publish: January 8, 2016 Category: WEB No Comments

管理凭证(Access Token)是七牛云存储用于验证管理请求合法性的机制。官方建议仅在业务服务器端使用这一类凭证,避免意外授权导致滥用。

官方文档

  • 凭证算法
  1. 生成待签名的原始字符串:

抽取请求URL中<path><path>?<query>的部分与请求内容部分(即HTTP Body),用“n”连接起来。
如无请求内容,该部分必须为空字符串。
注意:当Content-Typeapplication/x-www-form-urlencoded时,签名内容必须包括请求内容(即HTTP Body)。

signingStr = "<path>?<query>\n"
或
signingStr = "<path>?<query>\n<body>"
  1. 使用SecertKey对上一步生成的原始字符串计算HMAC-SHA1签名:

    sign = hmac_sha1(signingStr, "<SecretKey>")

  2. 对签名进行[URL安全的Base64编码]:
encodedSign = urlsafe_base64_encode(sign)
  1. 最后,将AccessKey和encodedSign用:连接起来:
accessToken = "<AccessKey>:<encodedSign>"


阅读剩余部分...

CodeIgniter3 多次扩展核心类

Publish: December 15, 2015 Category: WEB No Comments

大多数应用中Codeigniter(以下简称ci)具有多种类型的页。前端公共页面,后端管理面板,也可能是需要某种特殊权限的页面, 对于这些类型的页面都各自不同的控制器,ci虽然提供了对核心类进行扩展的方法,缺省情况下是在applicationcore文件夹中添加添加MY_前缀的控制器类即可,但是这样页仅仅是做了一次扩展.我们想要的是 Public_Controller Admin_Controller这种形式.

这里有三种解决方案.

阅读剩余部分...

Codeigniter3中使用phpass

Publish: November 19, 2015 Category: WEB No Comments

phpass是一个公认的安全的密码加密方式,该开源密码库,已经对密码进行了加盐操作,无需重复操作。
在一般的php应用开发中我们这样调用:

<?php
// Include phpass 库
require_once('phpass-03/PasswordHash.php')
// 初始化散列器为不可移植(这样更安全)
$hasher=newPasswordHash(8,false);
// 计算密码的哈希值。$hashedPassword 是一个长度为 60 个字符的字符串.
$hashedPassword=$hasher->HashPassword('my super cool password');
// 你现在可以安全地将 $hashedPassword 保存到数据库中!
// 通过比较用户输入内容(产生的哈希值)和我们之前计算出的哈希值,来判断用户是否输入了正确的密码
$hasher->CheckPassword('the wrong password',$hashedPassword);
// false$hasher->CheckPassword('my super cool password',$hashedPassword);
// true
?>

阅读剩余部分...

CodeIgniter 上传文件总结

Publish: July 11, 2015 Category: WEB No Comments

CI对文件上传做了简单的封装,基本可以满足文件上传的需求,对多文件的上传可以采用迭代超全局变量$_FILES来实现。
CodeIgniter 的文件上传类允许文件被上传。可以设置指定上传某类型的文件及指定大小的文件。

本文包括的基本内容:

  1. 上传特殊类型文件校验问题,.icon .ico等类型文件
  2. 多个文件上传到相同目录,多个文件上传到不同目录
  3. 使用CI文件上传类注意事项

基本的一个处理过程:

  • 创建一个上传文件用的表单,允许用户选择一个文件并上传它。
  • 当这个表单被提交,该文件被上传到指定的目录。同时,该文件将被验证是否符合您设定的要求。
  • 一旦文件上传成功,还要返回一个上传成功的确认窗口。

阅读剩余部分...

Nginx服务器下CodeIgniter多应用开发&部署

Publish: July 8, 2015 Category: 运维 No Comments

基于CI的WEB项目开发过程中经常会遇到角色问题,通常情况下我们会基于权限控制实现访问控制,但有时候对一些上一定规模的项目简单的一个应用(applicaton)采用这种方式显得不够明晰。通常会采用在一个框架内部署多个应用,也就是我们在CI的官方文档中提到的一个CodeIgniter中运行多个应用。

多应用开发:

在一个 CodeIgniter 下运行多个应用程序,如果你希望在一个 CodeIgniter 下管理多个不同的应用程序,只需简单的 将 application 目录下的所有文件放置到每个应用程序独立的子目录下即可。
例如,你要创建两个应用程序:"foo" 和 "bar",你可以像下面这样组织你的目录结构:

applications/foo/
applications/foo/config/
applications/foo/controllers/
applications/foo/libraries/
applications/foo/models/
applications/foo/views/
applications/bar/
applications/bar/config/
applications/bar/controllers/
applications/bar/libraries/
applications/bar/models/
applications/bar/views/`

要选择使用某个应用程序时,你需要打开 index.php 文件然后设置 $application_folder 变量。例如,选择使用 "foo" 这个应用,你可以这样:
$application_folder = 'applications/foo'
简单来说:多个应用就用多个入口文件(index.php),比如说你有两个应用,一个admin,一个home,默认访问home的话,你就在index.php里面设置
$application_folder = 'application/home'
然后想访问admin应用的话,可以在index.php同级目录下复制index.php到admin.php,修改
$application_folder = 'application/admin'
然后修改admin文件夹里面的config/config.php里面
$config['index_page'] = 'admin.php'
就可以实现多应用共存了。访问主页就是http://domain/,访问admin的时候就是http://domain/admin.php

部署

Apache下部署跟单应用部署不存在问题,但是在在nginx可能会存在问题。
单应用下的配置通常如下(该配置基于LNMP来做,成产环境下情自行配置)

server
    {
    listen 80;
    #listen [::]:80;
    server_name abc.com;
    index index.html index.htm index.php default.html default.htm default.php;
    root  /home/wwwroot/abc.com;;

    include other.conf;
location / {
           rewrite ^/(?!index\.php|assets|favicon.ico)(.*)$ /index.php/$1last;
      }        

location ~ [^/]\.php(/|$)
    {
        try_files $uri $uri/ /index.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }
    access_log  /home/wwwlogs/abc.com.log  access;
}

对上面的配置简单的解释,开始的配置不做过多解释,可以自行搜索,从location开始。

location / {
           rewrite ^/(?!index\.php|assets|favicon.ico)(.*)$ /index.php/$1last;
}

我们知道rewrite的作用是重写,last指令会重新将rewrite后的地址在server标签中匹配location执行。首先匹配所有uri中对静态文件等index.php请求一样对待,
location ~ [^/]\.php(/|$){}
对所有的php文件递交给fastgi处理。明白了上面,看一个完整的适合两个应用的CI Nginx配置。

server
{
    listen 80;
    #listen [::]:80;
    server_name abc.com;
    index index.html index.htm index.php default.html default.htm default.php;
    root  /home/wwwroot/abc.com;

location / {
        rewrite ^/(?!index\.php|admin\.php|assets|a.txt|favicon.ico)(.*)$ /index.php/$1last;
    }

    location ~ admin\.php(/|$)
    {
    try_files $uri $uri/ /admin.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index admin.php;
        include fastcgi.conf;
    }

    location ~ [^/]\.php(/|$)
    {
    try_files $uri $uri/ /index.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }
    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }
    access_log  /home/wwwlogs/abc.com.log  access;
}

原理其实是一样的,只不过多了一个入口,因为每个应用的入口文件统一,所知只需对特定的入口文件精确匹配即可,额外家了一项location即:

 location ~ admin\.php(/|$)
    {
    try_files $uri $uri/ /admin.php?$query_string;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index admin.php;
        include fastcgi.conf;
    }

然后对其他部分做简单修改。
重启或者重新载入nginx配置生效即可。

总结:

Codeigniter这样做多赢用违背了统一入口规范,对开发来说页比较蹩脚,希望CI4能有所改善。