看板 PHP 關於我們 聯絡資訊
※ 引述《chan15 (ChaN)》之銘言: : 接變數不外乎 : $xxx = $_POST['xxx'] : 如果變數有10幾個就要下10幾次 : 請問各位朋友有比較便捷的寫法嗎? 先前有人提及用foreach做$$key = $value 也有提及$key的來源造成的變數異常的情況。 這會有安全性的問題(包含sql injetion之類的問題。) 這麼一來就是得要對$key做處理還有將$value所傳入的字串做安全性的判斷。 比如說過濾不該存在的符號,將html字碼轉成普通字元……等等的方法。 改一改就長成這個樣子了。如果有更好的方法請指教: 前一個欄位增加一個隱藏欄位表單。 <input type="hidden" name="input_code" value="<?=md5("編碼值")?>" /> $post = $_POST; //有人說不要將$_POST直接放入foreach處理,那就先用變數。 要做foreach前得先解編碼值: if($post["input_code"] == md5("編碼值")){ unset($post["input_code"]); //因為不需要把他也解進變數,就刪了他。 foreach($post as $key => $value){ $$key = desave($value); } }else{ 看你要幹嘛! } function desave($value){ 看你要怎麼處理安全性,將值放入$re_value,最後: return $re_value; } 還有一種方式就是利用action取$get; <form name="xxxxx" method="post" action="xxxx.php?input_code= <?=md5("xxxxxx")?>"> $post = $_POST; if($_GET["input_code"] == md5("xxxxxx")){ foreach($post as $key => $value){ $$key = $desave($value); } }else{ 看你要幹嘛! } 因為基本上md5是無法反解的。 所以除非對方能猜到你md5給的值不然就一定無法通過程式判斷。 這樣多少可稍微避免外來的侵害。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.130.106
grassboy2:不懂@@a input_code的值不是可以從原始碼看到嗎? 05/06 22:33
grassboy2:那…不就連猜都不用猜了@@a 05/06 22:34
tkdmaf:看到的是被編碼過的32位元md5文字! 05/06 22:36
tkdmaf:除非你會反解MD5,否則你在程式中根本無法得知原始文字。 05/06 22:36
evernever:不懂為甚麼要有input_code來判斷要不要desave. 05/06 22:41
evernever:直接 desave 有壞處嗎? 05/06 22:41
如果你的程式有一個變數假設叫$test好了! 如果有人塞了一個表單: <input type="hidden" name="test" value="我要惡搞你的變數!"> 然後傳送到你的網站。 你想想$test這個變數會發生什麼事吧! 而且input_code只是用來判斷表單的來源是否合法。 desave()是另行處理$value的安全性內容。 ※ 編輯: tkdmaf 來自: 59.104.130.106 (05/06 22:50)
LPH66:三樓, 但我如果直接送出可以用的 input_code 不就繞過去了? 05/06 22:49
LPH66:重點在於 input_code 並不一定來自你自己的網頁 05/06 22:49
evernever:desave 是要做的, 但你的範例 desave $$key 是個問題 05/06 22:51
evernever:我的意思是不用input_code, desave都是要做的吧 05/06 22:52
evernever:只是要換掉 $$key 05/06 22:52
tkdmaf:的確!所以事實上也應該對input_code做判斷! 05/06 22:52
LPH66:我個人寫的習慣還是要什麼再自己接 三行就三行管它那麼多 05/06 22:52
LPH66:甚至就直接在指令裡用 $_POST['var'] 做運算 05/06 22:53
LPH66:(例如數值欄位就過一層 intval 來用這樣) 05/06 22:54
關於LPH66提到的input_code自己寫。 老實說變這樣就很好玩了。 $input_code = md5($_POST["input_code"]); if($input_code == md5(md5("XXXX"))){ xxxxxx } 並沒有規定md5不能用二次! ※ 編輯: tkdmaf 來自: 59.104.130.106 (05/06 22:56)
evernever:LPH66意思是不論你MD5x2,SHA512..開原始碼還是能得到 05/06 22:58
evernever: 可以用的 input_code 05/06 22:58
tkdmaf:是能得到啊!但你知道那個碼是被編了幾次的嗎? 05/06 23:02
evernever:..不需要知道被編了幾次...可以用就好阿... 05/06 23:03
tkdmaf:ABCDEFG的十次md5:5ebedce9c92d556f4b06442a8668ddf1 05/06 23:05
tkdmaf:我要不講他是經過十次的ABCDEFG的MD5你能猜得到? 05/06 23:05
<form method="post" action="showmdcode"> <input type="hidden" name="mdword" value="<?=md_code("ABCDEFG",10)?>" /> <input type="submit" value="送出" /> </form> <?php function md_code($word,$time = 1){ for ($i = 0 ;$i < $time ;$i++){ $word = md5($word); } return $word; } ?> 那就請你們親自跑跑看這個東西吧! 看看你用原始碼看到的是什麼東西。 ※ 編輯: tkdmaf 來自: 59.104.130.106 (05/06 23:06)
evernever:input_code=5ebedce9c92d556f4b06442a8668ddf1&hack=xxx 05/06 23:06
evernever:你的程式是不是照樣desave? 05/06 23:07
tkdmaf:我管你hack什麼鬼?過來先md5一次再說(這樣就11次了!) 05/06 23:07
evernever:那你的ABCDEFG是不是也要在md5一次才能對照? 05/06 23:09
tkdmaf:input_code比對不通過程式就結束你想跑什麼? 05/06 23:09
tkdmaf:請你看LPH66最後一行再往下數第5行!我放了幾個MD5? 05/06 23:10
tkdmaf:來源是一次,比對就是做二次!來源11次,比對就做12次! 05/06 23:11
evernever:err..你自己送的 md_code("ABCDEFG",10) 會通過.. 05/06 23:11
evernever:而我送的 5ebedce9c92d556f4b06442a8668ddf1 就不過? 05/06 23:12
tkdmaf:請貼你寫的程式碼上來了。 05/06 23:13
evernever:..我沒寫..@@ 05/06 23:14
tkdmaf:OK!這部份是你說對。的確是我沒注意到的盲點 05/06 23:27
tkdmaf:不過什麼時候大家可以用程式碼來討論程式呢? 05/06 23:27
evernever:給推...終於注意到了 05/06 23:29
hwakeye:簡單來講md5加密的內容不變的話 一開始只要先從網頁拿到加 05/06 23:30
hwakeye:密後的值 再來就可以直接寫script送表單了 05/06 23:30
tkdmaf:但原則上既然這是問題!就該再思考解決方案。 05/06 23:32
tkdmaf:一開始是想到session,但是並不想去使用session。 05/07 00:03
bibo9901:為什麼不想使用session 05/07 01:21
tkdmaf:因為只要有人先進到你的網站,session就存在了。 05/07 06:52
tkdmaf:一樣變成他愛幹什麼就能幹什麼。\ 05/07 06:53
rickysu:這不是CSRF攻擊的基本防禦方法嗎?? 05/07 10:49
clubflymf:不錯耶 總算看到討論出跨站假要求的文章了 XD 05/07 12:07