CakePHP HTTPS安全支付表格

时间:2011-08-05 16:31:40

标签: forms cakephp ssl https cakephp-1.3

使用CakePHP 1.3,我们为酒店客房预订系统。支票可用表格应将用户带到安全的支付页面(https://secure.domain.com/bookings/payment)。付款后,用户获得一个确认页面(安全也没问题),但是从这里开始,页眉/页脚中的任何链接都应该将用户带回非安全域(http://domain.com)。

目前,我们已为域https://secure.domain.comhttps://domain.com设置了SSL UCC证书。我们还对检查可用性表单进行了硬编码,以运行操作https://secure.domain.com/bookings/payment。因此,我们可以让用户进入HTTPS安全区域,但不会退出,除非我们对该部分中的所有链接进行硬编码。

Cake的安全组件非常混乱,因此我正在寻找实现这一目标的最佳解决方案。

Can Cake的安全组件可用于HTTPS支付页面,使生活更轻松,并使代码更加标准化吗?还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

这是一个非常好的方法:http://techno-geeks.org/2009/03/using-the-security-component-in-cakephp-for-ssl/所以你甚至不需要硬编码。

答案 1 :(得分:0)

我使用了http://techno-geeks.org/2009/03/using-the-security-component-in-cakephp-for-ssl/中的示例,但发现它存在问题。我最终将以下内容添加到我的app_controller.php。

以下代码将HTTPS重定向到www.example.com,将HTTP重定向到example.com。如果用户已登录(请参阅$loggedUser),则会为每个连接强制使用HTTPS。

// Pages requiring a secure connection.
$secureItems = array();

// beforeFilter
function beforeFilter() {
    // Your logic...    
    $this->__checkSSL();
}

/**
 * Check SSL connection.
 */
function __checkSSL() {
    /** Make sure we are secure when we need to be! **/
    if (empty($this->loggedUser)) {
        if (in_array($this->action, $this->secureItems) && !env('HTTPS')) {
            $this->__forceSSL();
        } 

        if (!in_array($this->action, $this->secureItems) && env('HTTPS')) {
            $this->__unforceSSL();
        }
    } else {
        // Always force HTTPS if user is logged in.
        if (!env('HTTPS')) {
            $this->__forceSSL();
        }
    }
}

/**
 * Redirect to a secure connection
 * @return unknown_type
 */
function __forceSSL() { 
    if (strstr(env('SERVER_NAME'), 'www.')) {
        $this->redirect('https://' . env('SERVER_NAME') . $this->here);
    } else {
        $this->redirect('https://www.' . env('SERVER_NAME') . $this->here); 
    }
}

/**
 * Redirect to an unsecure connection
 * @return unknown_type
 */
function __unforceSSL() {
    if (strstr(env('SERVER_NAME'), 'www.')) {
        $server = substr(env('SERVER_NAME'), 4);
        $this->redirect('http://' . $server . $this->here);
    } else {
        $this->redirect('http://' . env('SERVER_NAME') . $this->here);  
    }
}