Re: [請益] PHP接變數問題

看板PHP作者 (皮皮快跑)時間15年前 (2010/05/06 22:29), 編輯推噓5(5039)
留言44則, 8人參與, 最新討論串3/5 (看更多)
※ 引述《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

05/06 22:33, , 1F
不懂@@a input_code的值不是可以從原始碼看到嗎?
05/06 22:33, 1F

05/06 22:34, , 2F
那…不就連猜都不用猜了@@a
05/06 22:34, 2F

05/06 22:36, , 3F
看到的是被編碼過的32位元md5文字!
05/06 22:36, 3F

05/06 22:36, , 4F
除非你會反解MD5,否則你在程式中根本無法得知原始文字。
05/06 22:36, 4F

05/06 22:41, , 5F
不懂為甚麼要有input_code來判斷要不要desave.
05/06 22:41, 5F

05/06 22:41, , 6F
直接 desave 有壞處嗎?
05/06 22:41, 6F
如果你的程式有一個變數假設叫$test好了! 如果有人塞了一個表單: <input type="hidden" name="test" value="我要惡搞你的變數!"> 然後傳送到你的網站。 你想想$test這個變數會發生什麼事吧! 而且input_code只是用來判斷表單的來源是否合法。 desave()是另行處理$value的安全性內容。 ※ 編輯: tkdmaf 來自: 59.104.130.106 (05/06 22:50)

05/06 22:49, , 7F
三樓, 但我如果直接送出可以用的 input_code 不就繞過去了?
05/06 22:49, 7F

05/06 22:49, , 8F
重點在於 input_code 並不一定來自你自己的網頁
05/06 22:49, 8F

05/06 22:51, , 9F
desave 是要做的, 但你的範例 desave $$key 是個問題
05/06 22:51, 9F

05/06 22:52, , 10F
我的意思是不用input_code, desave都是要做的吧
05/06 22:52, 10F

05/06 22:52, , 11F
只是要換掉 $$key
05/06 22:52, 11F

05/06 22:52, , 12F
的確!所以事實上也應該對input_code做判斷!
05/06 22:52, 12F

05/06 22:52, , 13F
我個人寫的習慣還是要什麼再自己接 三行就三行管它那麼多
05/06 22:52, 13F

05/06 22:53, , 14F
甚至就直接在指令裡用 $_POST['var'] 做運算
05/06 22:53, 14F

05/06 22:54, , 15F
(例如數值欄位就過一層 intval 來用這樣)
05/06 22:54, 15F
關於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)

05/06 22:58, , 16F
LPH66意思是不論你MD5x2,SHA512..開原始碼還是能得到
05/06 22:58, 16F

05/06 22:58, , 17F
可以用的 input_code
05/06 22:58, 17F

05/06 23:02, , 18F
是能得到啊!但你知道那個碼是被編了幾次的嗎?
05/06 23:02, 18F

05/06 23:03, , 19F
..不需要知道被編了幾次...可以用就好阿...
05/06 23:03, 19F

05/06 23:05, , 20F
ABCDEFG的十次md5:5ebedce9c92d556f4b06442a8668ddf1
05/06 23:05, 20F

05/06 23:05, , 21F
我要不講他是經過十次的ABCDEFG的MD5你能猜得到?
05/06 23:05, 21F
<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)

05/06 23:06, , 22F
input_code=5ebedce9c92d556f4b06442a8668ddf1&hack=xxx
05/06 23:06, 22F

05/06 23:07, , 23F
你的程式是不是照樣desave?
05/06 23:07, 23F

05/06 23:07, , 24F
我管你hack什麼鬼?過來先md5一次再說(這樣就11次了!)
05/06 23:07, 24F

05/06 23:09, , 25F
那你的ABCDEFG是不是也要在md5一次才能對照?
05/06 23:09, 25F

05/06 23:09, , 26F
input_code比對不通過程式就結束你想跑什麼?
05/06 23:09, 26F

05/06 23:10, , 27F
請你看LPH66最後一行再往下數第5行!我放了幾個MD5?
05/06 23:10, 27F

05/06 23:11, , 28F
來源是一次,比對就是做二次!來源11次,比對就做12次!
05/06 23:11, 28F

05/06 23:11, , 29F
err..你自己送的 md_code("ABCDEFG",10) 會通過..
05/06 23:11, 29F

05/06 23:12, , 30F
而我送的 5ebedce9c92d556f4b06442a8668ddf1 就不過?
05/06 23:12, 30F

05/06 23:13, , 31F
請貼你寫的程式碼上來了。
05/06 23:13, 31F

05/06 23:14, , 32F
..我沒寫..@@
05/06 23:14, 32F

05/06 23:27, , 33F
OK!這部份是你說對。的確是我沒注意到的盲點
05/06 23:27, 33F

05/06 23:27, , 34F
不過什麼時候大家可以用程式碼來討論程式呢?
05/06 23:27, 34F

05/06 23:29, , 35F
給推...終於注意到了
05/06 23:29, 35F

05/06 23:30, , 36F
簡單來講md5加密的內容不變的話 一開始只要先從網頁拿到加
05/06 23:30, 36F

05/06 23:30, , 37F
密後的值 再來就可以直接寫script送表單了
05/06 23:30, 37F

05/06 23:32, , 38F
但原則上既然這是問題!就該再思考解決方案。
05/06 23:32, 38F

05/07 00:03, , 39F
一開始是想到session,但是並不想去使用session。
05/07 00:03, 39F

05/07 01:21, , 40F
為什麼不想使用session
05/07 01:21, 40F

05/07 06:52, , 41F
因為只要有人先進到你的網站,session就存在了。
05/07 06:52, 41F

05/07 06:53, , 42F
一樣變成他愛幹什麼就能幹什麼。\
05/07 06:53, 42F

05/07 10:49, , 43F
這不是CSRF攻擊的基本防禦方法嗎??
05/07 10:49, 43F

05/07 12:07, , 44F
不錯耶 總算看到討論出跨站假要求的文章了 XD
05/07 12:07, 44F
文章代碼(AID): #1Buj9B3e (PHP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 3 之 5 篇):
文章代碼(AID): #1Buj9B3e (PHP)