Board logo

主題: [php] [討論] 是誰把東西給弄壞了(程式的防呆設計) [打印本頁]

發表人: 陽だまり    時間: 2006-7-1 03:20 PM     主題: [討論] 是誰把東西給弄壞了(程式的防呆設計)

我們永遠不會知道使用者會搞什麼飛機
更不會猜到,有心人士會如何的利用程式的bug來圖利or破壞程式


小弟在寫php的時候,總是會在程式中加入防呆設計
為了避免不會使用or惡意人士的誤用造成資料錯誤

但是小弟最近在思考,是否真的有必要加上防呆呢
加了防呆後,雖然可以防止資料的錯誤
不過是否有需要將所有的防呆加入,這是小弟目前覺得疑問的地方

以目前twed2k來舉例的話,送花一個人最多3朵,我們可以有送1、2、3朵可以選
如果我去選一次送5朵呢,不知會造成什麼樣的訊息出來

當然小弟是沒去試,畢竟熊小有說過不能破壞

不過像這樣的防呆真的有必要嗎
會用特殊的方法的人才可能會去試試一次送5朵or100朵
不會用的人就會按3朵

其實主要問題是,如果每個地方均設置防呆的話,應該會造成資源的浪費
但是不加的話,如果真的有有心人士的出現,有可能資料會受到破壞這樣

小弟的話,則是不管什麼地方全加上防呆,只要想的出來能破壞的地方


其實應該不一定是php才需要用到防呆,因為小弟目前在學php,所以設在php這一類
請問各位怎麼看待防呆這一部分呢

ps:用javascript雖然可以防呆,但只能防一般使用者這樣,所以效果應該不大,對有心人士來說
發表人: Vic    時間: 2006-7-1 04:12 PM

防呆是指 validation嗎?

這是必要的, 否則被有心人破壞的後果絕對可以很嚴重. 資料錯亂, buffer overflow, 進而可以控制server.

沒遇過 (or 遇上但沒發覺) 的人會認為這些事都不會發生在自己的身上...但我可以告訴你, 世界上無聊的人實在太多(Script kiddie), 特別是一些網絡程式. 所面臨的 威脅更大.

當然, 在寫程式的時候. 我們不能夠一開始就 考慮到全部可能的威脅並一一加上檢查. 但如果發現時, 我的意見是 立即補上. 正如程式有bug一樣, 應該立即修正.

另外, 很多 防呆的方法都是大同小異....所以如果想省時間, 大可以找找 前人的作品, 套用在自己的程式上就好. Standing on the shoulder of Giants

在web application, js的檢查只是很基本而且不應該被依賴的. server side的檢查也是必要的.

p.s. 有關送花的問題, 你試試就知道了. 不是不可以亂試....只是 找到漏洞時, 請回報而並非用於破壞. 這也是White hat 與 black hat的分別.
發表人: 陽だまり    時間: 2006-7-1 04:47 PM


引用:
Vic寫到:

嗯,那果然還是都要加上,以防被破壞的危險這樣

馬上試了試送十朵花看看,結果出現未定義操作的提示這樣

感謝熊小的解說這樣,有空再來試試別的東東
發表人: ARTIMIS    時間: 2006-7-2 02:14 AM

前幾年不是還有輸入字串的地方...例如輸入:
kkk" or "1"="1
甚至 ' + bash script造成登入為root
就可隨意登入.........其實這種漏洞大家早已知道,只不過那時候利用此方法的人極少數,
後來不知為何,漸漸普及後,大家才感覺到危機,才另寫function對輸入字串作parse
今日各種web language已經都有patch 這個漏洞了~~
說明validation應該需要完整的plan~來實行,否則後果不堪設想,試想如果一旦被人hack到機密資料或個人資料的話,損失慘重~~
發表人: jocosn    時間: 2006-7-7 02:13 AM

防呆跟駭客是不一樣的。
防呆是可能有欄位要你輸入字串,結果你輸入數值。
駭客例如像資料庫隱碼攻擊,這種大部分情況是因沒做脫逸處理。
2者完全不同,請小心混為一談容易造成設計方向與處理步驟搞混。
發表人: 陽だまり    時間: 2006-7-7 02:53 AM

那請問jocosn樣對於程式的防呆部分均是怎麼做處理呢


小弟一開始學php的時候是利用mysql來做資料存取
後來覺得蠻麻煩的,且並不是所有空間都支援sql
所以後來繼續研究利用文字檔來做資料存取這樣

不過寫著寫著,就發現當資料不如預期輸入的話
可能會造成格式大亂,所以就針對該部分做了些預防

不過,做到後來突然覺得這樣好像蠻佔系統資源的
所以上來請教一下大家對於防呆部分有如何的見解這樣


ps:這一陣子,也發現jocosn樣所跨的領域蠻大的

[陽だまり 在  2006-7-7 02:56 AM 作了最後編輯]
發表人: jocosn    時間: 2006-7-7 06:52 PM

雖然不是所有空間都提供資料庫,但是有專門只提供資料庫的網站。
對於不提供資料庫的網站,大部分都可以對外連接資料庫,如果不行,建議趕快換空間。

使用文字檔做資料楚哩,資料庫隱碼攻擊應該就無效,但是相對的也無法用到資料庫所提供的功能。
PHP 對於 CSV 檔案也有相關函數可供支援,
也可以用 PHP 相關函數做樣式比對,做字串長度限制,或是取出後再自行做資料形態轉換等等,
看自己的需求。
這個論壇很多人寫程式都嚇嚇叫,應該有很多前輩可以解決你的問題。

[jocosn 在  2006-7-7 07:17 PM 作了最後編輯]
發表人: 陽だまり    時間: 2006-7-7 10:49 PM


引用:
jocosn寫到:
雖然不是所有空間都提供資料庫,但是有專門只提供資料庫的網站。
對於不提供資料庫的網站,大部分都可以對外連接資料庫,如果不行,建議趕快換空間。
使用文字檔做資料楚哩,資料庫隱碼攻擊應該就無效,但是相對的也無法用到資料庫所提供的功能。
PHP 對於 CSV 檔案也有相關函數可供支援,
也可以用 PHP 相關函數做樣式比對,做字串長度限制,或是取出後再自行做資料形態轉換等等,
看自己的需求。
這個論壇很多人寫程式都嚇嚇叫,應該有很多前輩可以解決你的問題。

恩恩
因為用mysql的時候,倒是還沒開始注意相關的利弊這樣
最近才要開始來看mysql的文章這樣,因為差不多要開始找工作了

解決問題的話,目前遇到的應該都是小問題,不敢拿出來見笑
有朝一日還請多多指教,也感謝回覆的各位大大
發表人: taichiun    時間: 2006-7-28 05:41 PM

以前唸書的時候,學校老師說過他們以前寫的程式拿去交卷的時候,
他們的老師做的第一件事就是執行程式之後,就先開始亂敲一通,
如果出現任何問題,那就丟回去退卷.....
所以讓程式順利運作不要出現讓 USER 看不懂的訊息也算是 PG 該盡的義務吧?
像我現在待在 User 單位,只要出現任何跟他想像中不一樣的東西,
出現中文訊息都會說不懂了,更不要說英文訊息,那是直接死給你看啦。
有的時候是程式的問題,有的時候是資料面上的錯誤,User 輸入了錯誤的資料,
但是這時候你要 User 怎麼辦?你當然可以說是他的錯,
但是不管是誰對誰錯,到最後還是你要去處理,反正他們就是兩手一拍,
說一句:『啊,我不懂啊!』,你能奈他何?
ㄜ....好像變成在發牢騷了....到此結束...
發表人: laikyo    時間: 2006-7-29 03:25 AM

所以才需要測試工程師阿
發表人: soupjvc999    時間: 2006-10-16 04:19 AM

防呆的意思,應該是防開發者的呆
哈  出錢的人永遠都是說話大聲的那邊

一開始有想到的地方就盡量做  沒想到的地方等到有蟲再改
無聊時候就打開別的 framework 看看別人怎麼防
發表人: chrixtal    時間: 2008-2-19 05:23 PM

哈 Soupjvc999 大大說的很有同感啊~

其實外面有一些在講這方面的書可以去找來看看,我有陣子對這方面的東西很有興趣
他大抵上是歸類在 GUI 設計和程式設計 "法則" 之類的書~
發表人: Acute    時間: 2008-2-22 08:35 PM

輸入界面的防呆, 其實已經是寫程式裡面最簡單的一部分了, 只是繁瑣而已
但是, 只要是輸入界面, 就應該每個部份都要加上去, 這是寫程式無聊而必須做的一部分
至於浪費資源, 其實也還好, 現在CPU 那麼快, 跑那一點點檢查程式, 影響還是很小的
一般程式, 防呆當然只需要一段, client/server 的程式, 就必須乖乖做兩段
一段可以在client 端先檢查, 但是可能遇到有人進行實驗, 硬是幫你把client 端程式改變
所以, 另一段必須乖乖放server 端, 不可省略

防呆程式只是繁瑣的檢查資料是不是容許的, 難度不高, 但是粉煩
反而某些處理格式相關的程式, 才真的是猜謎大會串 -- 不但繁瑣, 還很困難
例如: 寫個MP3 IDxx 的parser, 你就會發現, 資料說明只是參考, 實際上是猜謎大會
          猜的內容則是網路上四面八方的仁兄, 可能會怎樣誤解規格, 或者寫出怎樣的錯誤程式
          然後產生千奇百怪的資料, 而你的程式, 要在各種情形下, 不容許當機, 呵
發表人: 桂正和    時間: 2008-2-23 01:31 AM

個人是認為

永遠不要把使用者想得太聰明
也不要把使用者想得太笨
使用者會幹出什麼傻事實在很難想像

以WEB方面的程式來說
我會建議客戶端的檢查寫一份(以Script的方式)
然後在伺服器端在寫一份檢查

第一個檢查因為是在客戶端檢查
大部分的使用者如果沒有意外的話
操作錯誤都可以在第一個檢查就被找出來
這樣可以減少伺服器的負擔

第二部分的檢查就是防止那種比較故意的破壞
所以非常重要一定要做

如果寫得很煩的話
可以多多利用函數或者是物件的方式把常用的檢查寫好
以後直接套用即可
寫的功能越全面也越好用

以我自己來說
RegExp的檢查就會寫兩種
一種是客戶端的
一種是伺服端的

針對表單在伺服器端的檢查還會加上來源判斷
當然,這個東西也可以加在一些必要的流程中(防止被直接省略過一些步驟)

有時候我自己覺得
參考使用者的習慣不是壞事
但是有些東西還是得制定好規定
並且做好防護措施比較好

寧願多花些功夫做好保險
也不要以後補洞補的要死
發表人: psycho    時間: 2008-2-24 05:09 AM


引用:
陽だまり寫到:


以目前twed2k來舉例的話,送花一個人最多3朵,我們可以有送1、2、3朵可以選
如果我去選一次送5朵呢,不知會造成什麼樣的訊息出來

<?xml version="1.0"?><root><message>er_2</message></root>

我送了八朵花
我送的header
GET /flower_ajax.php?pid=1015147&send_flower=8&math_rand=0.23964415885461487
發表人: psycho    時間: 2008-2-24 05:30 AM

送花有bug
你只要數字1,2,3, 後面再跟literal string 就可以做SQL injection

請管理員修復
發表人: psycho    時間: 2008-2-24 05:59 AM


引用:
陽だまり寫到:
那請問jocosn樣對於程式的防呆部分均是怎麼做處理呢


小弟一開始學php的時候是利用mysql來做資料存取
後來覺得蠻麻煩的,且並不是所有空間都支援sql
所以後來繼續研究利用文字檔來做資料存取這樣

不過寫著寫著,就發現當資料不如預期輸入的話
可能會造成格式大亂,所以就針對該部分做了些預防

http://codepoets.co.uk/doc/php_p ... se_web_applications
pear 的db package 的 Prepared Statements
人家都做好好
不要自己去造輪子

[psycho 在  2008-2-24 06:36 AM 作了最後編輯]




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0