本文主要記錄我們的討論程序及結論,具體測驗代碼就不貼了,
一、背景
最近研發讓我開一下服務器的put、delete方法,被我以不安全的http方法給拒絕了,
研發表示我很無理,put怎么就是不安全的了,在他看來,put和post只是語意上的不同,如果put是不安全的方法,那么post也是不安全的方法了,
網上的說法也是分為兩派,一派說這些都是不安全的方法,要關掉;另一派說它們只是語意上的區別,不存在安不安全,
二、一探究竟
經過我和研發各自撰寫測驗用例來論證后,我明白了為什么會有這樣的分歧:我是從nginx作為web服務器的角度來看問題的,研發是從java代碼上來看問題的,
1、為什么說POST和PUT只是語意上的區別?
在研發的代碼里,終端(瀏覽器或客戶端)過來的流量,最終通過java的注解,攜帶引數進入到了研發寫了一個方法里來了,比如研發對某個自定義方法使用PUT的注解,那么終端通過PUT方法傳遞的引數就會進入到這個自定義方法中,有點編程經驗的話,就會知道,到了你寫的方法里,這些引數就隨便你玩了,
對于PUT、POST,研發都可以通過添加不同注解的方式,得到傳遞的引數,然后進行操作,所以研發會認為他們只是語意上的區別,
2、為什么說PUT、DELETE是不安全的方法?
對于nginx,可以使用HttpDavModule編譯nginx(./configure --with-http_dav_module),開啟PUT、DELETE等方法,開啟后,惡意攻擊者就可以直接將病毒檔案等傳到nginx服務器上,所以PUT等方法對nginx來說是不安全的,
3、上面兩個問題是否矛盾?
并不矛盾,
假如研發人員打包一個jar包,這時客戶端直接訪問這個jar包起的服務,那么put傳遞過來的所有引數,是可以由研發人員撰寫的代碼控制的,只要控制得沒有貓病,那么就是安全的,假如開發的是一個tomcat容器部署的工程,引數也是一樣可以由研發的代碼控制的,
同時,用nginx也可以反向代理put方法(不用HttpDavModule),所以只要后端服務對put服務做好控制,nginx不需要做任何更改,也就實作了對put方法的支持,
但nginx不能單獨開啟put等,因為研發的代碼不能對nginx做控制,
三、結論
后端服務可開啟put方法,只需要后端服務對put傳遞的引數做好控制,并實作put方法即可,
nginx不可開啟put方法,這是一種危險的方法,
才疏學淺,如果分析得不對,請各位大佬指正~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236031.html
標籤:其他
