Yii下防守CSRF與XSS[一]

參考連接: http://blog.coinidea.com/web%E5%BC%80%E5%8F%91/php/yii-php-888.htmljavascript

CSRF即跨站僞造請求,XSS即跨站腳本攻擊,說實話我也是最近才第一次接觸。php

編寫了一個Yii的網站,用測試軟件(好比,IBM APP Scan)掃描以後發現比較多以及比較嚴重的兩個問題,一個是CSRF,另外一個是XSS。html

那麼如何解決呢?前端

  • CSRF

參考連接:http://www.crarun.com/article-7.htmljava

Yii在配置文件中,支持csrf配置,一旦配置以後,會在表單中嵌入一個隱藏的value爲hash key的token,服務器經過token驗證當次請求是否被受權。web

'components'=>array(
      'request'=>array(
          // Enable Yii Validate CSRF Token
          'enableCsrfValidation' => true,
      ),
  ),

實際上,由於我用的Yii框架版本比較低,因此在form表單中,框架並無爲我本身建立input,因此被逼無奈,只能本身建立,插入一下代碼便可:ajax

<input type="hidden" value="<?php echo Yii::app()->getRequest()->getCsrfToken(); ?>" name="YII_CSRF_TOKEN" />

另外一個問題來了,由於是fix csrf,前期考慮得不是很周詳,可是整個系統中含有大量的ajax建立的post提交,這致使了不少js代碼中含有post提交,可是Yii的view輸出並不能影響到js的代碼裏面,即.js文件裏面就算是加了上述代碼,php也不會有任何輸出。 此時我想了一個折中的辦法: 在js的post提交中加入如下代碼:segmentfault

$("input[name='YII_CSRF_TOKEN']").val()

而後在php view裏面加入隱藏的代碼便可。 可是這也看出一個問題,這並不能完備的防止csrf,最優的解決辦法,仍是應該將受權嵌入每一個用戶的session中。服務器

  • XSS 在搜尋該問題的解決方案時,常常有人會問:在提交、保存、顯示那個階段作字符串過濾比較好。 在segmentfault上看到一我的的答案是,確認不可。一個防止入庫,一個防止生效。 我認爲, 首先提交時前端的用戶驗證必不可少,這會給用戶一個比較好的體驗。 可是服務器端的提交驗證仍是必須作的,由於程序是能夠繞過前端的。 最後,顯示的時候作麼?我建議作,這樣更加的保險,防止問題生效。 如何作?Yii下本身提供了CHtml以及CHTMLPurity供作一些過濾工做。 在GitHub上有不少人開源一個前臺比較好的庫用於作過濾,just search it.

參考連接: http://blog.coinidea.com/web%E5%BC%80%E5%8F%91/php/yii-php-888.htmlsession

相關文章
相關標籤/搜索