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的上傳元件了,太鳥了...!
沒有留言:
張貼留言