YII提出的安全Ajax请求

时间:2013-08-25 19:28:00

标签: php ajax security yii

我目前正在编写基于YII的申请 我对索引的行动:

  public function actionIndex() {
    $data = array();
    $data['server'] = Server::model()->findByPk(1);
    $data['dataProvider'] = new CActiveDataProvider('ServerUserPermission', array('criteria' => array('condition' => 'serverID=:id', 'params' => array(':id' => 1))));
    $this->render('index', $data);
}

我的ajax行动:

public function actionAddPermission($server) {
    if(Util::checkServerPower($server, Permission::MODIFY_SERVER)) {
        $perm = new ServerUserPermission;
        $perm->userID = 1;
        $perm->serverID = $server;
        $perm->power = 10;
        try {
            if ($perm->save()) {
                echo "OK";
            } else {
                echo Util::print_r($perm->getErrors());
            }
        } catch (Exception $e) {
            echo 'Critical Error Code: ' . $e->getCode();
        }
    } else {
        echo 'No Permissions';
    }
}

我的视图使用按钮链接到addPermission操作:

echo CHtml::ajaxButton("Insert New Player", array('addPermission', 'server' => $server->serverID), array('success'=>'refresh')); 

我的函数Util :: checkServerPower(...)检查应用程序的当前用户。结果:YII中的Ajax请求由Guest AuthWeb用户处理,但我需要检查是否实际允许用户添加权限。我目前无法想到一个安全的解决方案来保护其他客人发送的恶意数据。是否有可能获得Ajax调用的(服务器端)用户ID?

非常感谢 诚恳

1 个答案:

答案 0 :(得分:0)

我会使用内置的访问控制和extending CWebUser来实现。 它可能看起来很冗长,但我认为这是一个干净的解决方案。 (我们已经有Yii :: app() - > user-> isGuest等,为什么不在这里检查所有权限?)

1)激活访问控制过滤器。

(在一个控制器中或在/components/controller.php中同时显示所有控制器)

public function filters()
{
    return array( 'accessControl' ); // Tell Yii to use access rules for this controller
}

2)添加访问规则

在有关的控制器中。 (对不起,我没有打扰你的索引动作。)

public function accessRules()
{
    return array(
        [
            'allow', 
            'actions'=>['AddPermission'], 
            'expression'=>'$user->has(Permission::MODIFY_SERVER)'
        ],
        ['deny'],  // Deny everything else. 
    );
}

3)扩展CWebUser

// components/WebUser.php
class WebUser extends CWebUser {
    public function has( $permission)
    {
            // Check database for permissions using Yii::app()->user->id
            ...
    }
}

4)将您的应用配置为使用新的WebUser而不是CWebUser

// config/main.php
'components'=>[
    'user'=>[
        'class' => 'WebUser',
    ],
],