1. ASP.Net簡介及學(xué)習(xí)
1. 什么是ASP.Net –ASP.Net是一種動態(tài)網(wǎng)頁技術(shù),在服務(wù)器端運(yùn)行.Net代碼,動態(tài)生成HTML。可以使用JavaScript、Dom在瀏覽器端完成很多工作。
學(xué)習(xí)ASP.NET不要陷入如何使用服務(wù)器控件的誤區(qū)中,我們要懂得每個控件的運(yùn)行原理。不要做一個只會拖控件的“程序員”。
2. webApplication 和webSite的區(qū)別。
WebApplication 有命名空間,更改c#代碼后要重新啟動瀏覽器方能看到更改的效果。webSite則沒有這個東東。
webSite是由ASP帶過來的程序開發(fā)習(xí)慣,但是它只適用于小型網(wǎng)站的開發(fā),因?yàn)榇a出錯了不容易發(fā)現(xiàn),而且所有頁面共用一個命名空間,代碼不容易管理。講簡單基礎(chǔ)知識時使用webSite,講高級技術(shù)和做大型項(xiàng)目用WebApplication。
3.自己動手寫動態(tài)網(wǎng)站
提交到服務(wù)器的表單元素一定要設(shè)置name屬性(名字),id是設(shè)給Dom和jquery用的,服務(wù)只認(rèn)name。form表單提交到Hello1.ashx頁面處理
ashx是一個服務(wù)器處理程序,頁面form提交到服務(wù)器的數(shù)據(jù)都是調(diào)用他來處理,其實(shí)aspx也是處理程序,只不過是通過.Net封裝之后的處理程序,繼承自ashx。
Http是請求、響應(yīng)的模型,服務(wù)器不會來讀取瀏覽器的內(nèi)容,用戶在輸出的內(nèi)容中填入數(shù)據(jù),能夠得到的就是客戶端瀏覽器提交過來的數(shù)據(jù)。
4.Get和Post的區(qū)別
Get方法傳參數(shù),可以在地址欄看到參數(shù),而post傳遞的表單值隱藏到http報文中,就看不到了
Get傳遞的數(shù)據(jù)量是有限的,如果要傳遞大量的數(shù)據(jù),不能有get。Post則沒有這個限制;而post會有瀏覽器提示重新提交表單的問題,而get沒有
Get方式URL數(shù)據(jù)格式,服務(wù)器文件名后跟著?,由于客戶端可能向服務(wù)器端提交多個鍵值對,鍵值之間用&進(jìn)行分割,如果URL中有漢字、特殊字符,則要對url進(jìn)行編碼。
Post方法刷新時,他會提示你是否重新發(fā)送信息,不重送信息則無法刷新頁面。
5.Input版自增
取得頁面提交的數(shù)據(jù),在ashx頁面上進(jìn)行處理,然后返回響應(yīng)值。
6.ViewState初探
查看生成的源代碼,ASP.Net將所有隱藏內(nèi)容統(tǒng)一放到了名字為_WIEWSTATE的隱藏字段個,使用序列化算法將所有隱藏內(nèi)容放到一個字符串中,點(diǎn)擊幾次再用ViewStateDecoder這個工具查看viewstate內(nèi)容,發(fā)現(xiàn)了確實(shí)將這些改變的內(nèi)容放到了ViewState中。
Label版本的值存放到了ViewState中,TextBox版本的不存,因?yàn)?span style="FONT-FAMILY: Times New Roman" face="Times New Roman">TextBox就是input,自己就會提交給服務(wù)器,不需要隱藏字段。
禁用ViewState的方法,禁用控件的ViewState設(shè)定enableviewstate=false,禁用整個頁面的ViewState在aspx頁面源碼最上邊的Page指令區(qū)內(nèi)加上EnableViewState=”false”.內(nèi)網(wǎng)系統(tǒng),互聯(lián)網(wǎng)的后臺可以盡情的用ViewState。
無狀態(tài)Http:Http協(xié)議是無狀態(tài)的,不會記得上次和網(wǎng)頁發(fā)生了什么,服務(wù)器不記得上次給了瀏覽器什么,瀏覽器要記住這些值,(input就放到value中,對于其他的值就要放到隱藏字段中啦,比如ViewState)下次提交時服務(wù)器在原來的基礎(chǔ)上進(jìn)行處理。
狀態(tài)信息保存到隱藏字段中的缺點(diǎn):加大網(wǎng)站的流量,降低訪問速度,機(jī)密數(shù)據(jù)放到表單中會有數(shù)據(jù)欺騙等安全性問題
Cookie
有時候希望在服務(wù)器的任意一個地方存取一些和訪問者有關(guān)的信息,這時候就不方便將信息保存到表單中了,而Cookie是和站點(diǎn)相關(guān)的,并且每次向服務(wù)器請求的時候,除了發(fā)送表單外,還會將所有和站點(diǎn)有關(guān)的Cookie都提交到服務(wù)器。服務(wù)器返回數(shù)據(jù)除了普通的html數(shù)據(jù)外,還會返回修改的Cookie,瀏覽器把拿到的Cookie值更新到本地瀏覽器的Cookie就可以了。
網(wǎng)站的優(yōu)化,大型網(wǎng)站,圖片的服務(wù)器域名跟網(wǎng)站域名不一樣,這樣就不會把網(wǎng)站的cookie提交給圖片。比如 www.yahoo.com 圖片則為:www.yimg.com/a.gif 減少cookie的傳輸。
Session原理
首先SessionId保存在客戶端的cookie中,然后在服務(wù)器內(nèi)存中開辟一塊空間放sesion內(nèi)容。 sessionId為key,Session內(nèi)容為value的鍵值對。如下:
private static IDictionary<string, IDictionary<string, object>> data = new Dictionary<string, IDictionary<string, object>>();
因?yàn)閟ession本身又是一個鍵值對,一個sessionId對應(yīng)的內(nèi)容可以是多個鍵值對,比如sessionID為112233 。對應(yīng)的value又是一個Dictionary。字典名為session。則可以有session[“name”],,sesion[“sex”]等多個值。
不要放太大的對象到Session,Session還會有超時銷毀的機(jī)制.可以看到,Session不是http協(xié)議規(guī)定的,是ASP.net實(shí)現(xiàn)的。
用Session實(shí)現(xiàn)驗(yàn)證碼,HttpHandler要能夠操作Session,必須要實(shí)現(xiàn)IrequiresSessionState接口。
新建一個一般處理程序:
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "image/JPEG";
using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 50))
{
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
{
/*
g.DrawString("騰訊呀的",new System.Drawing.Font("宋體",18),System.Drawing.Brushes.Red,new System.Drawing.Point(0,0));
bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);*/
Random rand = new Random();
int code = rand.Next(1000,9999); //動態(tài)生成一個驗(yàn)證碼
HttpContext.Current.Session["YanZhengMa"] = code; //將驗(yàn)證碼保存到Session中
string strCode = code.ToString();
g.DrawString(strCode, new System.Drawing.Font("宋體", 30), System.Drawing.Brushes.Red, new System.Drawing.Point(0, 0)); //畫一個驗(yàn)證碼圖片。
bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
<body>
<form id="form1" runat="server">
<div>
<img src="驗(yàn)證碼?.ashx" alt="看不清,換一張?" onclick="this.src='驗(yàn)證碼?.ashx?aa='+new Date()"/>
</div> <%--向一般處理程序請求一個圖片。因?yàn)轵?yàn)證圖片是由一般處理程序畫出來的--%>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="提交" />
</form>
HTTP協(xié)議簡介
1.web開發(fā)是和http協(xié)議打交道的,必須了解http協(xié)議。http協(xié)議版本:http/0.9、http/1.0、http/1.1版本
http協(xié)議分析工具
1.DebugBar,Http(s)標(biāo)簽的內(nèi)容。免費(fèi)的,只能分析當(dāng)前瀏覽器中的內(nèi)容。
HttpWatch,收費(fèi)的,也是只能分析當(dāng)前瀏覽器的內(nèi)容。推薦使用。
http協(xié)議的幾個概念:
1. 連接(connection):瀏覽器和服務(wù)器之間傳輸數(shù)據(jù)的通道,一般請求完畢就關(guān)閉,不會保持連接
2. 請求(Request):瀏覽器向服務(wù)器發(fā)送的“我要。?!钡南ⅲ埱蟮念愋?,請求的數(shù)據(jù)、瀏覽器的信息(語言、瀏覽器的版本等)
3. 相應(yīng)(Response):服務(wù)器對瀏覽器請求的返回的數(shù)據(jù),包含是否成功,錯誤碼等。
Http響應(yīng)碼 瀏覽器向服務(wù)器發(fā)出請求,服務(wù)器處理可能是成功,可能是失敗、可能沒有權(quán)限訪問等原因,服務(wù)器會通過響應(yīng)碼來告訴瀏覽器處理結(jié)果。
HTTP/1.1 200 OK 200是狀態(tài)碼:表示請求處理成功。
301表示永久轉(zhuǎn)移。 302 Found暫時轉(zhuǎn)移 400 錯誤請求 發(fā)出不符合http協(xié)議的請求
404 頁面找不到。 307 臨時重定向 401 未認(rèn)證 一般需要輸入用戶名密碼才能登錄
500內(nèi)部服務(wù)器錯誤。 403 :Forbidden 禁止訪問
網(wǎng)頁中如果有圖片,css,js等外部文件的話,圖片,css,js都在單獨(dú)的請求中,也就是并不是頁面的所有內(nèi)容都在一個請求中完成,而是每一個資源一個請求。
一般情況下,只有瀏覽器請求服務(wù)器端,服務(wù)器端才有給瀏覽器相應(yīng)數(shù)據(jù),不會主動向?yàn)g覽器推送數(shù)據(jù),這樣是安全考慮,也是提高服務(wù)器的性能。如果要服務(wù)器像客戶端瀏覽器推送數(shù)據(jù),則需要使用ServerPush等額外技術(shù)。
http是“請求—響應(yīng)”工作方式,因此頁面會不斷的刷新,如果不希望頁面刷新則要使用AJAX等技術(shù)。
多線程下載基于斷點(diǎn)續(xù)傳。
請求響應(yīng)模型的例子
超鏈接和提交表單的區(qū)別,一個是直接訪問,一個是有postback。
Web開發(fā)的一些基本原則
1.最小權(quán)限原則。只允許用戶做***,而不是“不允許用戶做***”
2.瀏覽器看、查看的是服務(wù)器端代碼的執(zhí)行輸出的文本,除非服務(wù)器有漏洞,否則瀏覽者無法看到服務(wù)器端的aspx、cs代碼,目標(biāo)另存為也是保存的aspx的執(zhí)行結(jié)果,而不是aspx的源代碼。Js、html是被初入到瀏覽器上執(zhí)行的,因此無法禁止瀏覽者查看js、html。
C#代碼是運(yùn)行在服務(wù)器端的,js代碼是運(yùn)行在瀏覽器端的??梢栽诳蛻舳藞?zhí)行的代碼就放在客戶端執(zhí)行,例如按鈕確認(rèn)提交在button的onclientclick="return confirm('真的要刪除嗎?')。運(yùn)行在瀏覽器端。
還有一種看起來像是在服務(wù)器端彈出對話框。但其實(shí)也是在瀏覽器中執(zhí)行的:
Response.Write(“<script>alert(‘刪除成功!’)</script>”);其實(shí)這段代碼,是在服務(wù)器端將段字符串寫到瀏覽器中的,瀏覽器執(zhí)行時識別出這是JavaScript代碼,就彈框了。其實(shí)服務(wù)器端根本不知道這是一句彈框代碼,也不會阻塞服務(wù)器端代碼繼續(xù)執(zhí)行下去。(不推薦使用,推薦使用RegisterClientStartupScript)
真正在服務(wù)器端彈出對話框也沒有意義:比如:DialogResult dr= MessageBox.Show("服務(wù)器端彈出?對話框,要先添加winForm的引用,怎么我上次那么傻呢!這樣都沒想到。","傻逼?",MessageBoxButtons.YesNo);
為什么會沒有意義呢?很簡單,我們的網(wǎng)站是供人訪問的,但是如果每次訪問后彈出的提示框都在服務(wù)器端,那么客戶端根本就不會知道,而且服務(wù)器端也會因?yàn)閺棾鎏嗟目蚩蚨ㄋ溃。?/p>
按鈕隱藏一個控件就不要寫服務(wù)器端代碼,在客戶端用JavaScript、dom來操作就可以。校驗(yàn)用戶名,密碼這樣的操作可以放到瀏覽器端,但是安全性差,因此還是必須放到服務(wù)器端。
客戶端驗(yàn)證不能代替服務(wù)端驗(yàn)證
像網(wǎng)銀金額校驗(yàn),不單單在客戶端要校驗(yàn),服務(wù)器端也要校驗(yàn),客戶端校驗(yàn)是為了很好的客戶體驗(yàn),快速發(fā)現(xiàn)問題,不必要再執(zhí)行下去,服務(wù)器端是最后一次把關(guān),防止惡意請求
不要把敏感數(shù)據(jù),算法寫在瀏覽器端
不要把機(jī)密信息保存在html中
服務(wù)器端的控件visible=false時,控件定義根本不會畫到客戶端瀏覽器中,而客戶端控件則不同,只是把display屬性設(shè)為none。
XSS漏洞
不要在一個頁面中直接請求一個字符串然后顯示成html代碼。你可以將請求的字符串經(jīng)過html編碼后顯示出來,而不是讓他執(zhí)行html代碼
用戶發(fā)貼時也存在xss的問題。將發(fā)帖內(nèi)容保存到一個文本文件中。
我們可以對請求的數(shù)據(jù)做檢測,如果請求數(shù)據(jù)中有<等就認(rèn)為是惡意攻擊,禁止提交,aspx默認(rèn)就是才用這種策略,這樣做的缺點(diǎn)是不能在論壇中html代碼的帖子,這樣不好。
因此,更好的處理方法是將html內(nèi)容原樣顯示出來,而不是以html的方式顯示出來。使用HttpUtility HtmlEncode就可以將字符串中的特殊字符串顯示出來,也就是不把<script>當(dāng)成定義腳本的標(biāo)簽,而是當(dāng)成<script>這樣可以在頁面中直接顯示出來的內(nèi)容。