HTTP協議簡介
1.web開發是和http協議打交道的,必須瞭解http協議。http協議版本:http/0.9、http/1.0、http/1.1版本
http協議分析工具
1.DebugBar,Http(s)標籤的內容。免費的,只能分析當前瀏覽器中的內容。
HttpWatch,收費的,也是只能分析當前瀏覽器的內容。推薦使用。
http協議的幾個概念:
1. 串連(connection):瀏覽器和伺服器之間傳輸資料的通道,一般請求完畢就關閉,不會保持串連
2. 請求(Request):瀏覽器向伺服器發送的“我要。。”的訊息,包含請求的類型,請求的資料、瀏覽器的資訊(語言、瀏覽器的版本等)
3. 相應(Response):伺服器對瀏覽器請求的返回的資料,包含是否成功,錯誤碼等。
Http響應碼 瀏覽器向伺服器發出請求,伺服器處理可能是成功,可能是失敗、可能沒有許可權訪問等原因,伺服器會通過響應碼來告訴瀏覽器處理結果。
HTTP/1.1 200 OK 200是狀態代碼:表示請求處理成功。
301表示永久轉移。 302 Found暫時轉移 400 錯誤請求 發出不符合http協議的請求
404 頁面找不到。 307 臨時重新導向 401 未認證 一般需要輸入使用者名稱密碼才能登入
500內部伺服器錯誤。 403 :Forbidden 禁止訪問
網頁中如果有圖片,css,js等外部檔案的話,圖片,css,js都在單獨的請求中,也就是並不是頁面的所有內容都在一個請求中完成,而是每一個資源一個請求。
一般情況下,只有瀏覽器請求伺服器端,伺服器端才有給瀏覽器相應資料,不會主動向瀏覽器推送資料,這樣是安全考慮,也是提高伺服器的效能。如果要伺服器像用戶端瀏覽器推送資料,則需要使用ServerPush等額外技術。
http是“請求—響應”工作方式,因此頁面會不斷的重新整理,如果不希望頁面重新整理則要使用AJAX等技術。
多線程下載基於斷點續傳。
請求響應模型的例子
超連結和提交表單的區別,一個是直接存取,一個是有postback。
Web開發的一些基本原則
1.最小許可權原則。只允許使用者做***,而不是“不允許使用者做***”
2.瀏覽器看、查看的是伺服器端代碼的執行輸出的文本,除非伺服器有漏洞,否則瀏覽者無法看到伺服器端的aspx、cs代碼,目標另存新檔也是儲存的aspx的執行結果,而不是aspx的原始碼。Js、html是被初入到瀏覽器上執行的,因此無法禁止瀏覽者查看js、html。
C#代碼是運行在伺服器端的,js代碼是運行在瀏覽器端的。可以在用戶端執行的代碼就放在用戶端執行,例如按鈕確認提交在button的onclientclick="return confirm('真的要刪除嗎?')。運行在瀏覽器端。
還有一種看起來像是在伺服器端彈出對話方塊。但其實也是在瀏覽器中執行的:
Response.Write(“<script>alert(‘刪除成功!’)</script>”);其實這段代碼,是在伺服器端將段字串寫到瀏覽器中的,瀏覽器執行時識別出這是JavaScript代碼,就彈框了。其實伺服器端根本不知道這是一句彈框代碼,也不會阻塞伺服器端代碼繼續執行下去。(不推薦使用,推薦使用RegisterClientStartupScript)
真正在伺服器端彈出對話方塊也沒有意義:比如:DialogResult dr= MessageBox.Show("伺服器端彈出?對話方塊,要先添加winForm的引用,怎麼我上次那麼傻呢!這樣都沒想到。","傻逼?",MessageBoxButtons.YesNo);
為什麼會沒有意義呢?很簡單,我們的網站是供人訪問的,但是如果每次訪問後彈出的提示框都在伺服器端,那麼用戶端根本就不會知道,而且伺服器端也會因為彈出太多的框框而卡死!!
按鈕隱藏一個控制項就不要寫伺服器端代碼,在用戶端用JavaScript、dom來操作就可以。校正使用者名稱,密碼這樣的操作可以放到瀏覽器端,但是安全性差,因此還是必須放到伺服器端。
用戶端驗證不能代替服務端驗證
像網銀金額校正,不單單在用戶端要校正,伺服器端也要校正,用戶端校正是為了很好的客戶體驗,快速發現問題,不必要再執行下去,伺服器端是最後一次把關,防止惡意請求
不要把敏感性資料,演算法寫在瀏覽器端
不要把機密資訊儲存在html中
伺服器端的控制項visible=false時,控制項定義根本不會畫到用戶端瀏覽器中,而用戶端控制項則不同,只是把display屬性設為none。
XSS漏洞
不要在一個頁面中直接請求一個字串然後顯示成html代碼。你可以將請求的字串經過html編碼後顯示出來,而不是讓他執行html代碼
使用者發貼時也存在xss的問題。將發帖內容儲存到一個文字檔中。
我們可以對請求的資料做檢測,如果請求資料中有<等就認為是惡意攻擊,禁止提交,aspx預設就是才用這種策略,這樣做的缺點是不能在論壇中html代碼的文章,這樣不好。
因此,更好的處理方法是將html內容原樣顯示出來,而不是以html的方式顯示出來。使用HttpUtility HtmlEncode就可以將字串中的特殊字元串顯示出來,也就是不把<script>當成定義指令碼的標籤,而是當成<script>這樣可以在頁面中直接顯示出來的內容。