2015-02-03

uploadify、swfupload的cookie問題

http://www.javaworld.com.tw/jute/post/view?bid=49&id=280398

http://mini.nidbox.com/diary/read/1323

Flash 帶的 USER_AGENT是 Shockwave Flash,
Flash不支援非IE核心的瀏覽器cookie送出,
FLASH的POST資料,會將+變為空白,
Falsh會修改上傳檔案的MIME TYPE 成為 application/octet-stream

WTF......

難怪這二天拿Uploadify做上傳相片功能,
使用Chrome時Cookie會抓不到,ADOBE是有收M$錢逆...
SWFupload也是一樣的問題。



沒關係,本山人這二天終於想出解法:

1.外掛Jquery cookie plugin,抓出cookie值,
csrf的cookie我是取名為csrf_cookie_name,
sesscion cookie我是取名為kh_calssweb_session,
$.cookie('var_name')

2.在uploadify 加 scriptData:{},做為POST資料,
將上述的資訊都用此方法送出。

3.暫時關掉自動csrf檢查,在config.php加上:
if (isset($_SERVER["REQUEST_URI"]))
$config['csrf_protection'] = (stripos($_SERVER["REQUEST_URI"],'/upload/photo/path') === FALSE)?TRUE:FALSE;

因為比對csrf token也是要抓cookie資料的,無言。

4.FLASH會將POST資料中的+變為" ",因此要先取代回來:
$order = array("\r\n", "\n", "\r", " ");
$session_data = str_replace($order, '+', $this->input->npost('session_data'));

然後使用encrypt類別中的decode,解密session cookie,
再使用session類別中的_unserialize方法,將sesscion cookie資料轉為陣列。

5.可以開始手動比對 csrf 跟取得cookie資料了!

6.檔案上傳,先把mime type 改回來
if($_FILES['file']['type'] == 'application/octet-stream')
{
$ext = end(explode('.', $_FILES['file']['name']));//副檔名

if($ext == 'jpg' || $ext == 'JPG' || $ext == 'jpeg' || $ext == 'JPEG')
$_FILES['file']['type'] = 'image/jpeg';
elseif($ext == 'png' || $ext == 'PNG')
$_FILES['file']['type'] = 'image/png';
}

7.如想folder參數也能傳入正確中文資料夾,
需在jquery.uploadify.v2.1.4.min.js中修改以下程式碼
g.folder = escape(f.folder);
修改成
g.folder = encodeURI(f.folder);


想不到用FLASH做上傳元件,會產生一堆問題...
但安全性檢查又不可少,這素偶的堅持!

不過以後我不想碰FLASH的上傳元件了,太鳥了...!

沒有留言:

張貼留言