2016年10月5日 星期三

codeigniter csrf機制設定

串接金流後...想找些避免被有心人士誤用的頁面稽核機制,除了原有的那些措施之外,有文章推薦可啟用在 CI 2.0的 csrf(Cross Site Request Forgery) protection 功能。

設定 application\config\config.php將csrf打開

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;

接著在View中如果有需要提交的Form則使用form_open(action, variable array)來寫就會直接產生相關的Code,真方便。

不過...如果有接收金流的Return Url時,會出現不給接收的Message(謎之聲~當然因為金流公司不會送相關的稽核Code過來。
解法:

設定 application\config\config.php中改寫為

if (stripos($_SERVER["REQUEST_URI"],'controler name/function name') === FALSE) {
  $config['csrf_protection'] = TRUE;
else 
  $config['csrf_protection'] = FALSE; 

這樣就能有例外情況了。

另外如果不想使用form_open()要手動來的話~找到的範例如下。
$(function(){
    $('#btn').click(function(){
        $.ajax({
            type:'POST'
            ,url:'/ajax' //ajax接收的server端
            ,data:$('#form').serialize()+'&csrf_test_name='+ getCookie('csrf_test_name')
            ,success:function(data){
            alert(data.msg);
            }
            ,dataType:'json'
        });
    });
});

function getCookie(name){
    var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
    if(arr != null) return unescape(arr[2]); return null;

}

沒有留言: