æå»ºå®å ¨ç ASP 页忧件
å叿¥æï¼ 1/21/2005 | æ´æ°æ¥æï¼ 1/21/2005

æ¥çå ¨é¨çå®å ¨æ§æå¯¼ä¸»é¢
Microsoft Corporation
æ¬åå æ¦è¦
Web 页忧件å¤å¨åºç¨ç¨åºçé²å¾¡ç¬¬ä¸çº¿ï¼å¯è½éå°è¯å¾å¨èåºç¨ç¨åºå®å ¨çåç§æ»å»è çå¯éæ¢æ¥ãç»å¸¸ï¼è¿äºæ»å»æç»çç®æ å°æ¯å端系ç»åæ°æ®åå¨åºã
æåçåºç¨ç¨åºæ»å»æ¯å¦ä»£ç æ³¨å ¥æè è·¨ç«ç¹èæ¬æ»å» (XSS)ï¼å°å©ç¨æå¡å¨ç«¯åºç¨ç¨åºæ¼æ´ï¼å ¶åæå°æ¯æ¯çæ§çï¼å¯è½å¯¼è´ä¿¡æ¯æ³æ¼ï¼æ è¯æ¬ºéªï¼ç¹ææååè¿ç¨ä»£ç æ§è¡ãè¦æå»ºå®å ¨ç Web 页忧件ï¼éè¦éµå¾ªæ¬åå è®¨è®ºçæ£ç¡®ç¼ç¨å®è·µã
æ¬åå çå¼å§ååºåè§£éäºå¸¸è§ç ASP.NET 页忧件å¨è以åç¸å ³ç对çãç¶åæ¯å¿ é¡»å¤ççåºç¨ç¨åºå®å ¨é¢åçä¸ä¸ªå ¨é¢å表ãè¿å æ¬è¾å ¥éªè¯ï¼è¾åºç¼ç ï¼èº«ä»½éªè¯ï¼ææï¼æ¨¡æï¼æææ°æ®ä¿æ¤ï¼å®å ¨çä¼è¯ç®¡çï¼åæ°æä½ä¿æ¤åå¼å¸¸ç®¡çãè¿äºææ¯é½æ¯çºµæ·±é²èå®å ¨è§£å³æ¹æ¡çåºæ¬é¨åãæ¬åå 䏿åè¿°çå¨èç»å¸¸è¢«äººå¿½è§ï¼å®ä»¬ä¼ä½¿æ»å»è æåå°æå®³ç³»ç»å®å ¨ï¼æ 论æ¨çåºç¡ç»æå¦ä½å®å ¨ã
è¿å页é¦
ç®æ
ä½¿ç¨æ¬åå å¯ä»¥ï¼
⢠| 设计å®å ¨ç ASP.NET 页忧件ã |
⢠| ä½¿ç¨æ£å表达å¼åå ¶ä»ææ¯å¼åå®å ¨çéªè¯ä»£ç ã |
⢠| 鲿¢è·¨ç«ç¹èæ¬æ»å» (XSS)ã |
⢠| å¯¹ç¨æ·è¿è¡èº«ä»½éªè¯åææã |
⢠| å¼åå®å ¨ççªä½èº«ä»½éªè¯ã |
⢠| 鲿¢ä¸°å¯çå¼å¸¸è¯¦ç»ä¿¡æ¯å°è¾¾å®¢æ·ç«¯ã |
⢠| 管çåä¿æ¤ ASP.NET ä¼è¯ã |
⢠| 鲿¢åæ°æä½ã |
⢠| äºè§£åªäºå¯¹çéç¨äºåºå¯¹å¸¸è§çå¨èï¼å æ¬ä»£ç æ³¨å ¥ãä¼è¯å«æãæ è¯æ¬ºéªãåæ°æä½ãç½ç»ä¾¦å¬ãä¿¡æ¯æ³æ¼ãè·¨ç«ç¹èæ¬æ»å» (XSS) å cookie éæ¾æ»å»ã |
è¿å页é¦
éç¨èå´
æ¬åå éç¨äºä¸å产ååææ¯ï¼
⢠| Microsoft® Windows® Server 2000 å Windows Server⢠2003 æä½ç³»ç» |
⢠| Microsoft .NET Framework 1.1 å ASP.NET 1.1 |
è¿å页é¦
å¦ä½ä½¿ç¨æ¬åå
é¤äºææåºçå®å ¨ç¼ç¨å®è·µä¹å¤ï¼è¿åºè¯¥ä½¿ç¨æ¬æåä¸ç¸åºçåå è¾ å©å®å ¨ ASP.NET 页忧件çæå»ºã
⢠| å®ç°âä¿æ¤ ASP.NET åºç¨ç¨åºçå®å ¨âåå ä¸çæ¥éª¤ãæ¤åå æå©äºç¨ Machine.config å Web.config ä¸çå®å ¨è®¾ç½®éå½å°å¯¹ ASP.NET è¿è¡é ç½®ã |
⢠| 使ç¨é å¥çæ ¸å¯¹è¡¨âæ ¸å¯¹è¡¨ï¼ä¿æ¤ ASP.NET çå®å ¨âãå®å°æ¬åå ä¸çæ¨èå®è·µä¸âä¿æ¤ ASP.NET åºç¨ç¨åºçå®å ¨âç»åèµ·æ¥ãç¡®ä¿æ¨å®ç°æ¬æå¯¼ã |
⢠| çè§£ç¹å®äº ASP.NET 页忧件çå¨èåæ»å»ãæç §æ¬åå ä¸çåååºç¨å¯¹çã |
⢠| é 读âå®å ¨ Web åºç¨ç¨åºç设计ååâåå ãæ¬åå ä¸çè®¸å¤æ¨èå®è·µå°±æ¯åºäºæ¤åå ä¸è®¨è®ºç设计ååã |
⢠| æ¶æå¸åºè¯¥ä½¿ç¨æ¬åå ä¸çâ设计注æäºé¡¹âé¨åã |
⢠| å¼å人ååºè¯¥å°æ¬åå ä¸çæå¯¼åºç¨äºå ¶å¼åè¿ç¨ãå¼å人åå¿ é¡»ç¹å«æ³¨æå¯¹è¾å ¥æ°æ®çéªè¯ï¼å ä¸ºå¤§å¤æ°ä¸»è¦çåºç¨ç¨åºçº§æ»å»é½ä¾èµè¿ä¸ªåºåä¸çæ¼æ´ã |
⢠| ä»ç¼ç¨çè§åº¦çè§£æ§ä»¶ï¼å¯¹ ASP.NET 页忧件å®å ¨è¿è¡ç²¾ç»è°æ´ã |
⢠| 使ç¨åºç¨ç¨åºæ¼æ´ç±»å«ä½ä¸ºä¸ç§è§£å³å¸¸è§é®é¢çåæ³ãåºç¨ç¨åºæ¼æ´ç±»å«æä¾äºçæå¤çååç±»é®é¢çæç¨æ¹å¼ã |
æ¬é¡µå 容
| æ¬åå æ¦è¦ |
| ç®æ |
| éç¨èå´ |
| å¦ä½ä½¿ç¨æ¬åå |
| å¨èä¸å¯¹ç |
| 设计注æäºé¡¹ |
| è¾å ¥éªè¯ |
| è·¨ç«ç¹èæ¬æ»å» |
| 身份éªè¯ |
| ææ |
| 模æ |
| æææ°æ® |
| ä¼è¯ç®¡ç |
| åæ°æä½ |
| å¼å¸¸ç®¡ç |
| å®¡æ ¸åæ¥å¿è®°å½ |
| å°ç» |
| å ¶ä»èµæº |
è¿å页é¦
å¨èä¸å¯¹ç
大夿° Web åºç¨ç¨åºæ»å»é½éè¦å¨ HTTP 请æ±ä¸ä¼ å ¥æ¶æè¾å ¥ã é常çç®çæ¯å¼ºå¶åºç¨ç¨åºæ§è¡æªææçæä½æè ç ´åå ¶æ£å¸¸æä½ãè¿å°±æ¯ä¸ºä»ä¹å½»åºçè¾å ¥éªè¯æ¯è®¸å¤æ»å»çæ ¸å¿å¯¹çï¼èä¸å®åºè¯¥å¨å¼å ASP.NET Web 页忧件æ¶è¢«ç½®äºæé«ä¼å 级çåå ãæå¤§çå¨èå æ¬ï¼
⢠| ä»£ç æ³¨å ¥ |
⢠| ä¼è¯æ»å» |
⢠| æ è¯æ¬ºéª |
⢠| åæ°æä½ |
⢠| ç½ç»ä¾¦å¬ |
⢠| ä¿¡æ¯æ³æ¼ |
å¾ 1 çªåºæ¾ç¤ºäº Web åºç¨ç¨åºæå¸¸è§çå¨èã
彿»å»è 使ç¨åºç¨ç¨åºçå®å ¨ä¸ä¸æä½¿ä»»æä»£ç è¿è¡æ¶å°±åçäºä»£ç æ³¨å ¥ã妿æ¨çåºç¨ç¨åºä½¿ç¨ç¹æå¸æ·è¿è¡ï¼é£é©å°å¤§å¤§å¢å ã
æ»å»ä»£ç æ³¨å ¥æ»å»æå¾å¤ç§ç±»åãè¿äºç±»åå æ¬ï¼
⢠| è·¨ç«ç¹èæ¬æ»å» ãå Web åºç¨ç¨åºåéæ¶æèæ¬ä½ä¸ºè¾å ¥ãå®å°ä¼ åç¨æ·çæµè§å¨ï¼å¨é£éæ§è¡ã |
⢠| ç¼å²åºæº¢åºãéªè¯æç®¡ä»£ç çç±»åå®å ¨è½å¤æ¾èåå°é£é©ï¼ä½æ¯æ¨çåºç¨ç¨åºä»ç¶æ¯ææ¼æ´çï¼å°¤å ¶æ¯å¨å®è°ç¨éæç®¡ä»£ç çæ¶åãç¼å²åºæº¢åºè½å¤å 许æ»å»è 卿¨ç Web åºç¨ç¨åºè¿ç¨ä¸ä½¿ç¨å®å ¨ä¸ä¸ææ§è¡ä»»æä»£ç ã |
⢠| SQL æ³¨å ¥ ãè¿ç§æ»å»çç®æ æ¯ææ¼æ´çæ°æ®è®¿é®ä»£ç ãæ»å»è åéè½å¤å¨æ°æ®åºä¸æ´æ¹é¢ææ¥è¯¢æè æ§è¡å ¨æ°æ¥è¯¢ç SQL è¾å ¥ãçªä½èº«ä»½éªè¯ç»å½é¡µæ¯å¸¸è§çç®æ ï¼å 为è¦ä½¿ç¨ç¨æ·åç§°åå¯ç æ¥è¯¢ç¨æ·åå¨åºã |
è½å¤å¯¼è´æåä»£ç æ³¨å ¥æ»å»çæ¼æ´å æ¬ï¼
⢠| èå¼±æè éæ¼çè¾å ¥éªè¯ï¼æè ä¾èµå®¢æ·ç«¯è¾å ¥éªè¯ |
⢠| å¨ HTML è¾åºä¸å 嫿ªéªè¯çè¾å ¥ |
⢠| 卿æé ä¸ä½¿ç¨ç±»åååæ°ç SQL è¯å¥ |
⢠| 使ç¨ç¹æè¿é«çè¿ç¨å¸æ·åæ°æ®åºç»å½ |
以ä¸å¯¹çå¯ä»¥ç¨äºé²æ¢ä»£ç æ³¨å ¥ï¼
⢠| éªè¯è¾å ¥ï¼ä»è使æ»å»è æ æ³æ³¨å ¥èæ¬ä»£ç æè 导è´ç¼å²åºæº¢åºã |
⢠| ç¼ç ææå å«è¾å ¥çè¾åºãè¿è½å¤é²æ¢æå¯è½å卿¶æçèæ¬æ 记被客æ·ç«¯çæµè§å¨è§£é为代ç ã |
⢠| ä½¿ç¨æ¥ååæ°çåå¨è¿ç¨ï¼é²æ¢æ¶æ SQLè¾å ¥è¢«æ°æ®åºå½ä½å¯æ§è¡è¯å¥å¤çã |
⢠| ä½¿ç¨æä½ç¹æè¿ç¨å模æå¸æ·ãè¿è½å¤éä½é£é©ååå°æ»å»è 设æ³ä½¿ç¨åºç¨ç¨åºçå®å ¨ä¸ä¸ææ§è¡ä»£ç æ¶å¸¦æ¥çç ´åã |
卿»å»è æè·äºä¸ä¸ªèº«ä»½éªè¯æ è®°å¹¶æ§å¶äºå¦ä¸ä¸ªç¨æ·çä¼è¯æ¶å°±ä¼åçä¼è¯å«æã身份éªè¯æ è®°ç»å¸¸åå¨å¨ cookie æè URL ä¸ã妿æ»å»è æè·äºèº«ä»½éªè¯æ è®°ï¼ä»å°±è½å¤å°å ¶ä¸è¯·æ±ä¸èµ·ä¼ è¾å°åºç¨ç¨åºã åºç¨ç¨åºä¼å°è¯·æ±ä¸åæ³ç¨æ·çä¼è¯å ³èèµ·æ¥ï¼ä»è使æ»å»è è½å¤è·åå¯¹è¦æ±èº«ä»½éªè¯è®¿é®çåºç¨ç¨åºåéåºåçè®¿é®æéãæ»å»è ç¶å使ç¨åæ³ç¨æ·çæ è¯åç¹æã
æ¼æ´ä½¿æ¨ç Web 页忧件容æéå°ä¼è¯å«æç常è§çæ¼æ´å æ¬ï¼
⢠| URL ä¸çä¸åä¿æ¤çä¼è¯æ è¯ç¬¦ |
⢠| å°ä¸ªæ§å cookie ä¸èº«ä»½éªè¯ cookie æ··å |
⢠| 身份éªè¯ cookie éè¿æªå å¯ç龿¥ä¼ é |
ä¼è¯å«ææ»å»å æ¬ï¼
⢠| cookie éæ¾ ãæ»å»è éè¿ä½¿ç¨ç½ç»çè§è½¯ä»¶æè éè¿å ¶ä»æ¹å¼ï¼ä¾å¦ï¼éè¿å©ç¨ XSS èæ¬æ³¨å ¥æ¼æ´æè·èº«ä»½éªè¯ cookieã |
⢠| æ¥è¯¢å符串æä½ ãæ¶æç¨æ·å°æ´æ¹ URL æ¥è¯¢åç¬¦ä¸²ä¸æ¾èæè§çä¼è¯æ è¯ç¬¦ã |
æ¨å¯ä»¥ä½¿ç¨ä»¥ä¸å¯¹ç鲿¢ä¼è¯å«æï¼
⢠| å°ä¸ªæ§å cookie å身份éªè¯ cookie å离ã |
⢠| åªéè¿ HTTPS è¿æ¥ä¼ é身份éªè¯ cookieã |
⢠| ä¸è¦å¨æ¥è¯¢å符串ä¸ä¼ é代表已ç»è¿èº«ä»½éªè¯çç¨æ·çä¼è¯æ è¯ç¬¦ã |
⢠| å¨è¿è¡å ³é®æä½ï¼å¦ä¸å®åã转å¸ççï¼ä¹åï¼å¯¹ç¨æ·å次è¿è¡èº«ä»½éªè¯ã |
æ è¯æ¬ºéª
卿¶æç¨æ·ä½¿ç¨åæ³ç¨æ·çæ è¯ä»èè½å¤è®¿é®åºç¨ç¨åºæ¶å°±ä¼åçæ è¯æ¬ºéªã
æ¼æ´ä½¿æ¨ç Web 页忧件容æéå°æ è¯æ¬ºéªæ»å»çå¸¸è§æ¼æ´å æ¬ï¼
⢠| éè¿æªå å¯é¾è·¯ä¼ é身份éªè¯åæ® |
⢠| éè¿æªå å¯é¾è·¯ä¼ é身份éªè¯ cookie |
⢠| èå¼±çå¯ç åçç¥ |
⢠| ç¨æ·åå¨åºä¸èå¼±çåæ®åå¨åº |
æ è¯æ¬ºéªæ»å»å æ¬ï¼
⢠| cookie éæ¾ ãæ»å»è éè¿ä½¿ç¨ç½ç»çè§è½¯ä»¶æè ä½¿ç¨ XSS æ»å»çªå身份éªè¯ cookieãæ»å»è ç¶åå° cookie åéå°åºç¨ç¨åºä»¥è·å欺éªè®¿é®ã |
⢠| 强åå¯ç æ»å» ãæ»å»è åå¤å°è¯åç§ç¨æ·åç§°åå¯ç ç»åã |
⢠| åå ¸æ»å» ãå¨è¿ç§èªå¨å½¢å¼ç强åå¯ç æ»å»ä¸ï¼å°å°è¯ç¨åå ¸ä¸çæ¯ä¸ªè¯ä½ä¸ºå¯ç ã |
æ¨å¯ä»¥ä½¿ç¨ä»¥ä¸å¯¹ç鲿¢æ è¯æ¬ºéªï¼
⢠| åªéè¿ HTTPS è¿æ¥ä¼ è¾èº«ä»½éªè¯åæ®å cookieã |
⢠| 强å¶ä½¿ç¨ååºçå¯ç ãæ£å表达å¼å¯ä»¥ç¨äºç¡®ä¿ç¨æ·ææä¾çå¯ç 满足åéç夿æ§éæ±ã |
⢠| 卿°æ®åºä¸åå¨å¯ç éªè¯å¨ãåå¨å¸¦æéæº salt å¼çä¸å¯éå¯ç åå¸å¼ï¼ä»¥åå°åå ¸æ»å»çé£é©ã |
æå ³å¨æ°æ®åºä¸åå¨å¯ç åå¸å¼åå ¶ä»æºå¯çæ´å¤ä¿¡æ¯ï¼è¯·åé âæå»ºå®å ¨çæ°æ®è®¿é®âåå ã
åæ°æä½åæ°æ¯éè¿ç½ç»ä»å®¢æ·ç«¯ä¼ éå°æå¡å¨çæ°æ®é¡¹ãå®ä»¬å æ¬çªä½åæ®µãæ¥è¯¢åç¬¦ä¸²ãæ¥çç¶æãcookie å HTTP 头ãå¦ææææ°æ®æè ç¨äºå¨æå¡å¨ä¸ååºå®å ¨å³ççæ°æ®æ¯ä½¿ç¨ä¸åä¿æ¤çåæ°ä¼ éçï¼æ¨çåºç¨ç¨åºå°å¯è½å¾å®¹æåçä¿¡æ¯æ³æ¼æè æªææè®¿é®ã
æ¼æ´è½å¤å¯¼è´åæ°æä½çæ¼æ´å æ¬ï¼
⢠| 使ç¨éèçªä½å段æè å å«æææ°æ®çæ¥è¯¢å符串 |
⢠| éè¿æªå å¯çè¿æ¥ä¼ è¾å å«å®å ¨æ§æææ°æ®ç cookie |
åæ°æä½æ»å»å æ¬ï¼
⢠| cookie éæ¾æ»å» ãæ»å»è æè·å¹¶æ´æ¹ cookie ç¶åå°å ¶éæ¾ç»åºç¨ç¨åºãè¿è½å¤å¾å®¹æå°å¯¼è´æ è¯æ¬ºéªåç¹ææåï¼å¦æ cookie ä¸å 嫿å¡å¨ä¸ç¨äºèº«ä»½éªè¯æè ææçæ°æ®ã |
⢠| éèçªä½å段çæä½ ãè¿äºå段å å«å¨æå¡å¨ä¸ç¨æ¥è¿è¡å®å ¨å³ççæ°æ®ã |
⢠| æ¥è¯¢åç¬¦ä¸²åæ°çæä½ ã |
æ¨å¯ä»¥ä½¿ç¨ä»¥ä¸å¯¹ç鲿¢åæ°æä½ï¼
⢠| ä¸è¦ä¾èµå®¢æ·ç«¯ç¶æç®¡çé项ãé¿å 使ç¨ä»»ä½å®¢æ·ç«¯ç¶æç®¡çé项ï¼ä¾å¦æ¥çç¶æãcookieãæ¥è¯¢å符串æè éèçªä½åæ®µï¼æ¥åå¨æææ°æ®ã |
⢠| å°æææ°æ®åå¨å¨æå¡å¨ä¸ã使ç¨ä¼è¯æ è®°å°ç¨æ·çä¼è¯ä¸å¨æå¡å¨ä¸ç»´æ¤çæææ°æ®é¡¹å ³èèµ·æ¥ã |
⢠| ä½¿ç¨æ¶æ¯èº«ä»½éªè¯ä»£ç (MAC) ä¿æ¤ä¼è¯æ è®°ãå°è¿ç§æ¹å¼ä¸èº«ä»½éªè¯ãææåæå¡å¨ä¸çä¸å¡é»è¾ç»åï¼ç¡®ä¿æ è®°ä¸ä¼éæ¾ã |
ç½ç»ä¾¦å¬å¾å¾è¦ä½¿ç¨ç½ç»çè§è½¯ä»¶è·è¸ªå¨æµè§å¨å Web æå¡å¨ä¹é´åéçæ°æ®å ãè¿è½å¤å¯¼è´ç¹å®äºåºç¨ç¨åºçæºå¯æ°æ®çæ³æ¼ãç»å½åæ®çæ£ç´¢æè 身份éªè¯ cookie çæè·ã
æ¼æ´è½å¤å¯¼è´æåçç½ç»ä¾¦å¬çæ¼æ´å æ¬ï¼
⢠| åéæææ°æ®æ¶ç¼ºä¹å å¯ |
⢠| éè¿æªå å¯çä¿¡éåé身份éªè¯ cookie |
ç½ç»ä¾¦å¬æ»å»æ¯éè¿ä½¿ç¨ç½®äºç½ç»ä¸æè·æµéçæ°æ®å å æ¢å·¥å ·æ¥æ§è¡çã
对çè¦å¯¹æç½ç»ä¾¦å¬ï¼åºè¯¥ä½¿ç¨å®å ¨å¥æ¥åå± (SSL) åè®®å¨æµè§å¨å Web æå¡å¨ä¹é´æä¾å å¯çéä¿¡ä¿¡éãä½¿ç¨ SSL æ¯å¿ éçï¼æ 论éè¿ç½ç»åéçæ¯åæ®ã身份éªè¯ç¥¨è¯æè ææçåºç¨ç¨åºæ°æ®ã
ä¿¡æ¯æ³æ¼å¨æ»å»è æ¢æµæ¨ç Web 页以寻æ¾å¯¼è´å¼å¸¸æ å½¢çæ¹æ³æ¶å°±ä¼åçä¿¡æ¯æ³æ¼ãè¿å¯¹äºæ»å»è èè¨æ¯ä¸ç§æææ¾èçææ®µï¼å 为å¼å¸¸è¯¦ç»ä¿¡æ¯ï¼ç»å¸¸ä»¥ HTML è¿åå¹¶æ¾ç¤ºå¨æµè§å¨ä¸ï¼è½å¤æ³æ¼æä¸ºæç¨çä¿¡æ¯ï¼ä¾å¦å 嫿°æ®åºè¿æ¥å符串çå æ è·è¸ªä¿¡æ¯ãæ°æ®åºåç§°ãæ°æ®åºæ¶æä¿¡æ¯ãSQL è¯å¥åæä½ç³»ç»åå¹³å°çæ¬ã
æ¼æ´è½å¤å¯¼è´ä¿¡æ¯æ³æ¼çæ¼æ´å æ¬ï¼
⢠| èå¼±çå¼å¸¸å¤ç |
⢠| å 许åå§å¼å¸¸è¯¦ç»ä¿¡æ¯ä¼ æå°å®¢æ·ç«¯ |
è½å¤å¯¼è´ä¿¡æ¯æ³æ¼çæ»å»æè®¸å¤ç§ãè¿äºæ»å»å æ¬ï¼
⢠| ç¼å²åºæº¢åºã |
⢠| æ æåéæ ¼å¼é误çè¾å ¥ã |
为äºé²æ¢ä¿¡æ¯æ³æ¼ï¼åºè¯¥ï¼
⢠| 使ç¨ç»æåå¼å¸¸å¤çã |
⢠| è¿åä¸è¬æ§é误页å°å®¢æ·ç«¯ã |
⢠| 使ç¨å å«ä¸è¬åæ 害éè¯¯æ¶æ¯çé»è®¤éå®å页ã |
è¿å页é¦
设计注æäºé¡¹
卿¨å¼å Web 页忧件ä¹åï¼æè®¸å¤éè¦çé®é¢åºè¯¥å¨è®¾è®¡æ¶èèã以䏿¯å ³é®ç注æäºé¡¹ï¼
⢠| ä½¿ç¨æå¡å¨ç«¯è¾å ¥éªè¯ ã |
⢠| å° Web ç«ç¹ååº ã |
⢠| èèç¨äºèµæºè®¿é®çæ è¯ ã |
⢠| ä¿æ¤åæ®å身份éªè¯ç¥¨è¯ ã |
⢠| å®å ¨å°å¤±è´¥ ã |
⢠| èèææç²åº¦ ã |
⢠| å° Web æ§ä»¶åç¨æ·æ§ä»¶ç½®äºä¸åçç¨åºéä¸ ã |
⢠| å°èµæºè®¿é®ä»£ç ç½®äºä¸åçç¨åºéä¸ ã |
å¨è®¾è®¡æ¶ï¼æ è¯æ¨ç Web 页忧件å¤ççç¨æ·è¾å ¥çææåç§æ¥æºãè¿å æ¬çªä½åæ®µãæ¥è¯¢å符串åä» Web ç¨æ·æ¥æ¶ç cookie 以忥èªåç«¯æ°æ®æºçæ°æ®ãWeb ç¨æ·æ¾ç¶ä¸å¨æ¨çåºç¨ç¨åºç信任边çä¹å ï¼å æ¤æææ¥èªæ¤æ¥æºçè¾å ¥é½å¿ 须卿å¡å¨ä¸è¿è¡èº«ä»½éªè¯ãé¤éæ¨å¯ä»¥ç»å¯¹ä¿¡ä»»æ¥æ¶èªåç«¯æ°æ®æºçæ°æ®ï¼å¦åæ°æ®ä¹åºè¯¥è¿è¡éªè¯åååï¼æè½åéå°å®¢æ·ç«¯ãç¡®ä¿æ¨çè§£å³æ¹æ¡å¹¶ä¸ä¾èµå®¢æ·ç«¯éªè¯ï¼å 为è¿å¾å®¹æç»è¿ã
å° Web ç«ç¹ååºæ¨ç Web ç«ç¹è®¾è®¡åºè¯¥æç¡®å°åºåå¯å ¬å¼è®¿é®åºååè¦æ±ç»èº«ä»½éªè¯æè½è®¿é®çåéåºåã使ç¨åºç¨ç¨åºèææ ¹ç®å½ä¹ä¸ä¸åçåç®å½ç»´æ¤åé页ï¼ä¾å¦å¨ä¼ ç»ççµååå¡ Web ç«ç¹ä¸çç»å¸åè½ï¼å°±è¦æ±ç»èº«ä»½éªè¯ç访é®å¹¶ä¼ è¾æææ°æ®ä¾å¦ä¿¡ç¨å¡å·ç ãä¸åçåç®å½ä½¿æ¨è½å¤åºç¨æ´å¤å®å ¨æ§ï¼ä¾å¦ï¼éè¿è¦æ±ä½¿ç¨ SSLï¼èä¸ä¼å¨æ´ä¸ªç«ç¹äº§ç SSL æ§è½å¼éãå®è¿ä½¿æ¨è½å¤éè¿éå¶èº«ä»½éªè¯ cookie ä¼ è¾åªä½¿ç¨ HTTPS è¿æ¥ï¼ä»èåå°ä¼è¯å«æçé£é©ãå¾ 2 说æäºå ¸åçååºã
注æå¨å¾ 2 ä¸ï¼åéåæä»¶å¤¹å¨ Internet ä¿¡æ¯æå¡ (IIS) ä¸é ç½®ä¸ºè¦æ± SSL 访é®ãWeb.config ä¸ç第ä¸ä¸ª <
authorization>
å ç´ å 许ææç¨æ·è®¿é®å ¬å¼åºåï¼è第äºä¸ªå ç´ å鲿¢æªç»èº«ä»½éªè¯çç¨æ·è®¿é®åä¿æ¤åæä»¶å¤¹çå 容并强å¶ç»å½ãæå ³éå¶èº«ä»½éªè¯ cookie ä»èä½¿å ¶åªä½¿ç¨ HTTPS è¿æ¥ä¼ éï¼ä»¥åå¦ä½å¨åéåéåé页ä¹é´å¯¼èªçæ´å¤ä¿¡æ¯ï¼è¯·åé æ¬åå â身份éªè¯âé¨åä¸çâ使ç¨ç»å¯¹ URL è¿è¡å¯¼èªâã
èèç¨äºèµæºè®¿é®çæ è¯é»è®¤æ¶ï¼ASP.NET åºç¨ç¨åºå¹¶ä¸æ¨¡æï¼èä¸ä½¿ç¨æä½ç¹æ ASPNET è¿ç¨å¸æ·è¿è¡ ASP.NET Web åºç¨ç¨åºåè¿è¡èµæºè®¿é®ãé»è®¤å¼æ¯æ¨èé ç½®ãå¨å ç§æ åµä¸ï¼å¯è½éè¦ä½¿ç¨ä¸åç Windows å®å ¨ä¸ä¸æè¿è¡èµæºè®¿é®ãè¿äºæ åµå æ¬ï¼
⢠| å¨å䏿å¡å¨ä¸å¯å®¿å¤ä¸ªåºç¨ç¨åº æ¨å¯ä»¥ä½¿ç¨ IIS é ç½®æ¯ä¸ªåºç¨ç¨åºä»¥ä½¿ç¨ä¸åçå¿å Internet ç¨æ·å¸æ·ç¶åå¯ç¨æ¨¡æãæ¯ä¸ªåºç¨ç¨åºä»è齿å¯ä¸æ è¯è¿è¡èµæºè®¿é®ãæå ³è¿ç§æ¹å¼çæ´å¤ä¿¡æ¯ï¼è¯·åé âå¯å®¿å¤ä¸ª Web åºç¨ç¨åºâåå ã |
⢠| 访é®å¸¦æç¹å®èº«ä»½éªè¯éæ±çè¿ç¨èµæº 妿æ¨éè¦è®¿é®ç¹å®è¿ç¨èµæºï¼ä¾å¦ï¼æä»¶å ±äº«ï¼å¹¶ä¸å·²ç»æä¾äºç¹æ®ç Windows 叿·ï¼å¯ä»¥é ç½®è¿ä¸ªå¸æ·ä¸ºåºç¨ç¨åºçå¿å Web ç¨æ·å¸æ·ãç¶åå¯ä»¥å¨è®¿é®ç¹å®è¿ç¨èµæºä¹å使ç¨ç¼ç¨æ¨¡æãæå ³æ´å¤ä¿¡æ¯ï¼è¯·åé æ¬åå åé¢çâæ¨¡æâã |
æ¨ç设计åºè¯¥å æ¬å¦ä½ä¿æ¤åæ®å身份éªè¯ç¥¨è¯ãåæ®å¨è·¨ç½ç»ä¼ 鿶以åæä¹ åå¨å¨åå¨åºï¼ä¾å¦é ç½®æä»¶ä¸ï¼æ¶éè¦è¿è¡ä¿æ¤ã身份éªè¯ç¥¨è¯å¿ é¡»å¨è·¨ç½ç»æ¶è¿è¡ä¿æ¤ï¼å 为å®ä»¬å®¹æéå°å«æãå 坿ä¾äºä¸ç§è§£å³æ¹æ¡ãSSL æè IPSec å¯ä»¥ç¨äºä¿æ¤ç½ç»ä¸çåæ®å票è¯ï¼è DPAPI 为å å¯é ç½®æä»¶ä¸çåæ®æä¾äºä¸ç§å¾å¥½çè§£å³æ¹æ¡ã
å®å ¨å°å¤±è´¥å¦ææ¨çåºç¨ç¨åºç±äºæä¸ªä¸å¯æ¢å¤çå¼å¸¸æ å½¢è失败äºï¼ç¡®ä¿å®å°å®å ¨å°å¤±è´¥ï¼èä¸ä¸ä¼ä½¿ç³»ç»é¨æ·å¤§å¼ãç¡®ä¿ä¸å è®¸å¯¹æ¶æç¨æ·æä»·å¼çå¼å¸¸è¯¦ç»ä¿¡æ¯ä¼ æå°å®¢æ·ç«¯ï¼èæ¯è¿åä¸è¬æ§é误页ã计å使ç¨ç»æåå¼å¸¸å¤çæ¥å¤çé误ï¼èä¸è¦ä¾èµæ¹æ³çé误代ç ã
èèææç²åº¦èèå¨ç«ç¹ç身份éªè¯é¨åä¸ä½¿ç¨çææç²åº¦ã妿æ¨é ç½®äºä¸ä¸ªè¦æ±èº«ä»½éªè¯çç®å½ï¼åææç¨æ·é½å°æç¸åç对该ç®å½ä¸é¡µçè®¿é®æéåï¼å¦æå¿ è¦ï¼æ¨å¯ä»¥éè¿ä½¿ç¨ä¸å <
location> å ç´ ä¸çå¤ä¸ª
<authorization> å ç´ ï¼æ ¹æ®æ è¯æè°ç¨æ¹çè§è²æåèµæ ¼ï¼åè æ´å 常è§ï¼ä¸ºä¸åç页åºç¨ä¸åçææè§åã
ä¾å¦ï¼åä¸ç®å½ä¸çä¸¤ä¸ªé¡µå¨ Web.config ä¸å¯æä¸åç <
allow> å <
deny> å ç´ ã
å° Web æ§ä»¶åç¨æ·æ§ä»¶ç½®äºä¸åçç¨åºéä¸å½ Web æ§ä»¶åç¨æ·æ§ä»¶ç½®äºåèªçç¨åºéä¸ï¼æ¨å¯ä»¥éè¿ä½¿ç¨ä»£ç 访é®å®å ¨çç¥ç¬ç«å°ä¸ºæ¯ä¸ªç¨åºéé ç½®å®å ¨æ§ãè¿ä¸ºç®¡çåæä¾äºæ´å¤§ççµæ´»æ§ï¼èä¸è¿æå³çæ¨ç¨ä¸çåªæ¯ä¸ºäºæ»¡è¶³ä¸ä¸ªæ§ä»¶çéæ±ï¼èéè¦ç»æææ§ä»¶æäºæ©å±æéã
å°èµæºè®¿é®ä»£ç ç½®äºä¸åçç¨åºéä¸ä½¿ç¨ä¸åçç¨åºéï¼èä¸ä»é¡µç±»è°ç¨å®ä»¬ï¼è䏿¯å°èµæºè®¿é®ä»£ç åµå ¥é¡µç±»çäºä»¶å¤çç¨åºä¸ãè¿ä¸ºä»£ç 访é®å®å ¨çç¥æä¾æ´å¤§ççµæ´»æ§ï¼èä¸å¯¹äºæå»ºé¨åä¿¡ä»» Web åºç¨ç¨åºå°¤å ¶éè¦ãæå ³æ´å¤ä¿¡æ¯ï¼è¯·åé åå âå¨ ASP.NET ä¸ä½¿ç¨ä»£ç 访é®å®å ¨â
è¿å页é¦
è¾å ¥éªè¯
å¦ææ¨æ²¡æä»»ä½éå¶å°æ¥åè¾å ¥çç±»åãé¿åº¦ãæ ¼å¼æè èå´ï¼é£ä¹æ¨çåºç¨ç¨åºä¸å¯è½æ¯å¯é çã妿æ»å»è åç°æ¨å¯¹è¾å ¥ä¼æ²¡æä»»ä½éå¶å°æ¥åï¼è¾å ¥éªè¯å°æä¸ºå®å ¨é®é¢ãæ»å»è ç¶å伿ä¾ä»ç»ç¼åçè¾å ¥å±ååºç¨ç¨åºçå®å ¨ãå¯¹ç¨æ·è¾å ¥çéè¯¯ä¿¡ä»»æ¯ Web åºç¨ç¨åºä¸æå¸¸è§åæå ·ç ´åæ§çæ¼æ´ã
约æãç¶åååé¦å éè¿éªè¯ç±»åãé¿åº¦ãæ ¼å¼åèå´çº¦æè¾å ¥åæ£æ¥æ°æ®æ¯å¦æ£å¸¸ãææ¶è¿éè¦ååè¾å ¥å使æå¯è½å卿¶æçè¾å ¥å®å ¨ãä¾å¦ï¼å¦ææ¨çåºç¨ç¨åºæ¯æèªç±æ ¼å¼çè¾å ¥å段ï¼ä¾å¦æ³¨éåæ®µï¼å¯è½éè¦å 许ä¸äºâå®å ¨âç HTML å ç´ ï¼ä¾å¦<
b>ï¼å¹¶å¥ç¦»å ¶ä»çææ HTML å ç´ ã以ä¸è¡¨æ»ç»äºçº¦æåååæ°æ®å¯ä»¥éç¨çéæ©ï¼
表 1 约æåååæ°æ®çéæ© | |
è¦æ± | éæ© |
ç±»åæ£æ¥ | .NET Framework ç±»åç³»ç»ãåæåç¬¦ä¸²æ°æ®ï¼è½¬æ¢ä¸ºå¼ºç±»åï¼ç¶åå¤ç FormatExceptionsã æ£å表达å¼ãä½¿ç¨ ASP.NET RegularExpressionValidator æ§ä»¶æè Regex ç±»ã |
é¿åº¦æ£æ¥ | ä½¿ç¨æ£å表达å¼ç String.Length 屿§ |
æ ¼å¼æ£æ¥ | ä½¿ç¨æ£å表达å¼å¯¹ .NET Framework ç±»åç³»ç»è¿è¡æ¨¡å¼å¹é |
èå´æ£æ¥ | ASP.NET RangeValidator æ§ä»¶ï¼æ¯æè´§å¸ãæ¥æãæ´æ°ãå精度ååç¬¦ä¸²æ°æ®ï¼ ç±»åæ°æ®æ¯è¾ |
æ¨å¯ä»¥ä½¿ç¨æ£å表达å¼éå¶ææå符çèå´ï¼ä»¥å é¤ä¸å¸æçå符并æ§è¡é¿åº¦åæ ¼å¼æ£æ¥ãæ¨å¯ä»¥éè¿å®ä¹è¾å ¥å¿ é¡»å¹é çæ¨¡å¼çº¦æè¾å ¥æ ¼å¼ãASP.NET æä¾äº
RegularExpressionValidatoræ§ä»¶ï¼è
Regexç±»å¯ä»¥ä»
System.Text.RegularExpressionså½å空é´è·å¾ã
妿æ¨ä½¿ç¨éªè¯ç¨åºæ§ä»¶ï¼éªè¯å°å¨æ§ä»¶ä¸ºç©ºæ¶éè¿ã对äºå¿ éçåæ®µï¼ä½¿ç¨
RequiredFieldValidatorãåæ ·ï¼æ£å表达å¼éªè¯å®ç°å¨å®¢æ·ç«¯åæå¡å¨ä¸ä¹æå¾®å°çå·®å¼ãå¨å®¢æ·ç«¯ï¼ä½¿ç¨ Microsoft JScript_ å¼åè½¯ä»¶çæ£å表达å¼è¯æ³ã卿å¡å¨ï¼ä½¿ç¨
System.Text.RegularExpressions.Regexè¯æ³ãå 为 JScript æ£å表达å¼è¯æ³æ¯
System.Text.RegularExpressions.Regexè¯æ³çåéï¼æ¨èä½¿ç¨ JScript æ£å表达å¼è¯æ³ï¼è¿æ ·è½å¤å¨å®¢æ·ç«¯åæå¡å¨ä¸å¾å°åæ ·çç»æã
æå ³ ASP.NET éªè¯ç¨åºæ§ä»¶å®æ´èå´çæ´å¤ä¿¡æ¯ï¼è¯·åè .NET Framework ææ¡£ã
RegularExpressionValidator æ§ä»¶è¦éªè¯ Web çªä½çåæ®µè¾å ¥ï¼æ¨å¯ä»¥ä½¿ç¨
RegularExpressionValidatoræ§ä»¶ãå°æ§ä»¶æå° Web çªä½ï¼å¹¶è®¾ç½®å ¶
ValidationExpressionã
ControlToValidateå
ErrorMessage屿§ã
æ¨å¯ä»¥ä½¿ç¨ Microsoft Visual Studio_ .NET ä¸ç屿§çªå£è®¾ç½®éªè¯è¡¨è¾¾å¼ï¼ä¹å¯ä»¥å¨
Page_Loadäºä»¶å¤çç¨åºä¸å¨æå°è®¾ç½®å±æ§ãåä¸ç§æ¹æ³ä½¿æ¨è½å¤å°é¡µä¸æææ§ä»¶çæææ£å表达å¼ç»åèµ·æ¥ã
Regex Class妿æ¨ä½¿ç¨ä¸å¸¦
runat="server"屿§ï¼ä¸ä½¿ç¨
RegularExpressionValidatoræ§ä»¶ï¼çå¸¸è§ HTML æ§ä»¶ï¼æè éè¦éªè¯æ¥èªå ¶ä»æ¥æºï¼ä¾å¦æ¥è¯¢å符串æè cookieï¼çè¾å ¥ï¼å¯ä»¥å¨é¡µç±»ä¸æè éªè¯è¾ 婿¹æ³ä¸ï¼å¯è½å¨ä¸åçç¨åºéä¸ï¼ä½¿ç¨
Regexç±»ãæ¬é¨ååé¢ä¸¾åºäºä¸äºä¾åã
æ£åè¡¨è¾¾å¼æ³¨é妿æ¨ä½¿ç¨ä»¥ä¸è¯æ³ï¼å¹¶ä½¿ç¨ # 注é表达å¼çæ¯ä¸ªç»æé¨åï¼æ£å表达å¼å°±å®¹æçè§£å¤äºãè¦ä½¿ç¨æ³¨éï¼æ¨è¿å¿ é¡»æå®
RegexOptions.IgnorePatternWhitespaceï¼è¿æå³ç忽ç¥é转ä¹ç©ºæ ¼ã
Regex regex = new Regex(@"
^ # anchor at the start
(?=.*/d) # must contain at least one digit
(?=.*[a-z]) # must contain one lowercase
(?=.*[A-Z]) # must contain one uppercase
.{8,10} # From 8 to 10 characters in length
$ # anchor at the end",
RegexOptions.IgnorePatternWhitespace);
åç¬¦ä¸²åæ®µ è¦éªè¯åç¬¦ä¸²åæ®µï¼ä¾å¦å§åãå°åãç¨å¡æ è¯å·ç ççï¼å¯ä»¥ä½¿ç¨æ£å表达å¼è¿è¡ä»¥ä¸æä½ï¼
⢠| 约æè¾å ¥å符ç坿¥åèå´ã |
⢠| åºç¨æ ¼å¼è§åãä¾å¦ï¼åºäºæ¨¡å¼çåæ®µå¦ç¨å¡æ è¯å·ç ã鮿¿ç¼ç ï¼è¦æ±è¾å ¥å符éç¨ç¹å®æ¨¡å¼ã |
⢠| æ£æ¥é¿åº¦ã |
以ä¸ç¤ºä¾è¯´æäº
RegularExpressionValidatoræ§ä»¶å¦ä½ç¨äºéªè¯å§ååæ®µã
<form id="WebForm" method="post" runat="server">
<asp:TextBox id="txtName" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator id="nameRegex"runat="server"
ControlToValidate="txtName"
ValidationExpression="^[a-zA-Z'.`-̫̉/s]{1,40}$"
ErrorMessage="Invalid name">
</asp:regularexpressionvalidator>
</form>
åé¢çéªè¯è¡¨è¾¾å¼å°è¾å ¥å§ååæ®µçº¦æä¸ºåæ¯å符ï¼å°å忝å大å忝ï¼ï¼æäºå§åä¸çä¸ä¸ªæå·å符ï¼ä¾å¦ O'Dellï¼åå¥ç¹ç¬¦ãæ¤å¤ï¼å段é¿åº¦çº¦æä¸º 40 个å符ã
社ä¼å®å ¨å·ä»¥ä¸ç¤ºä¾è¯´æäºä¸ºç¨äºéªè¯ç¾å½ç¤¾ä¼å®å ¨å·çªä½å段ç
RegularExpressionValidatoræ§ä»¶æçæç HTML 代ç ï¼
<form id="WebForm" method="post" runat="server">
<asp:TextBox id="txtSSN" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator id="ssnRegex" runat="server"
ErrorMessage="Invalid social security number"
ValidationExpression="/d{3}-/d{2}-/d{4}"
ControlToValidate="txtSSN">
</asp:RegularExpressionValidator>
</form>
åé¢çéªè¯è¡¨è¾¾å¼æ¯ Visual Studio .NET æä¾çæ å表达å¼ä¹ä¸ãå®éªè¯äºææä¾çè¾å ¥åæ®µçæ ¼å¼åå ¶ç±»ååé¿åº¦ãè¾å ¥å¿ é¡»å å«ä¸ä½æ°å ä¸ä¸ªçå线ï¼ç¶åæ¯ä¸¤ä¸ªæ°åè·ä¸ä¸ªçå线ï¼ç¶åæ¯å个æ°ã
妿æ¨ä¸ä½¿ç¨æå¡å¨æ§ä»¶ï¼ä¸ä½¿ç¨éªè¯ç¨åºæ§ä»¶ï¼ï¼æè éè¦éªè¯æ¥èªçªä½å段ä¹å¤æ¥æºçè¾å ¥ï¼å¯ä»¥å¨æ¹æ³ä»£ç ä¸ä½¿ç¨
System.Text.RegularExpression.Regexç±»ã以ä¸ç¤ºä¾è¯´æäºå¦ä½éè¿ç´æ¥å¨é¡µç±»ä¸ä½¿ç¨éæ
Regex.IsMatchæ¹æ³è䏿¯ä½¿ç¨éªè¯ç¨åºæ§ä»¶ï¼æ¥éªè¯åä¸å段ï¼
if (!Regex.IsMatch(txtSSN.Text, @"^/d{3}-/d{2}-/d{4}$"))
{
// Invalid Social Security Number
}
æ¥æåæ®µ æçæ .NET Framework ç±»åçè¾å ¥å段å¯ä»¥éè¿ .NET Framework ç±»åç³»ç»è¿è¡ç±»åæ£æ¥ãä¾å¦ï¼è¦éªè¯æ¥æï¼å¯ä»¥å°è¾å ¥å¼è½¬æ¢ä¸º
System.DateTimeç±»åçä¸ä¸ªåéï¼å¹¶å¨è¾å ¥æ°æ®ä¸å ¼å®¹çæ åµä¸å¤çä»»ä½çæçæ ¼å¼å¼å¸¸ï¼å¦ä¸æç¤ºã
try
{
DateTime dt = DateTime.Parse(txtDate.Text).Date;
}
// If the type conversion fails, a FormatException is thrown
catch( FormatException ex )
{
// Return invalid date message to caller
}
é¤äºæ ¼å¼åç±»åæ£æ¥ï¼æ¨å¯è½è¿éè¦å¯¹æ¥æå段æ§è¡èå´æ£æ¥ãè¿å¯ä»¥ä½¿ç¨
DateTimeåéå¾å®¹æå°æ§è¡ï¼å¦ä¸æç¤ºã
// Exception handling is omitted for brevity
DateTime dt = DateTime.Parse(txtDate.Text).Date;
// The date must be today or earlier
if ( dt > DateTime.Now.Date )
throw new ArgumentException("Date must be in the past");
æ°ååæ®µ 妿æ¨éè¦éªè¯æ°åæ°æ®ä¾å¦å¹´é¾ï¼å¯ä»¥ä½¿ç¨
intç±»åæ§è¡ç±»åæ£æ¥ãè¦å°å符串è¾å ¥è½¬æ¢ä¸ºæ´æ°å½¢å¼ï¼æ¨å¯ä»¥ä½¿ç¨
Int32.Parseæè
Convert.ToIn32ï¼ç¶åå¤çç±äºéæ³æ°æ®ç±»åèçæçä»»ä½
FormatExceptionï¼å¦ä¸æç¤ºï¼
try
{
int i = Int32.Parse(txtAge.Text);
. . .
}
catch( FormatException)
{
. . .
}
èå´æ£æ¥ ææ¶æ¨éè¦éªè¯è¾å ¥æ°æ®æ¯å¦å¤äºé¢å ç¡®å®çèå´ä¸ã以ä¸ä»£ç 使ç¨äºä¸ä¸ª ASP.NET
RangeValidatoræ§ä»¶å°è¾å ¥çº¦æä¸º 0 å 255 ä¹é´çæ´æ°ãè¿ä¸ªä¾åè¿ä½¿ç¨äº
RequiredFieldValidatorãé¤
RequiredFieldValidatorä¹å¤ï¼å ¶ä»éªè¯ç¨åºæ§ä»¶æ¥å空ç½è¾å ¥ã
<form id="WebForm3" method="post" runat="server">
<asp:TextBox id="txtNumber" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator
id="rangeRegex"
runat="server"
ErrorMessage="Please enter a number between 0 and 255"
ControlToValidate="txtNumber"
style="LEFT: 10px; POSITION: absolute; TOP: 47px" >
</asp:RequiredFieldValidator>
<asp:RangeValidator
id="RangeValidator1"
runat="server"
ErrorMessage="Please enter a number between 0 and 255"
ControlToValidate="TextBox1"
Type="Integer"
MinimumValue="0"
MaximumValue="255"
style="LEFT: 10px; POSITION: absolute; TOP: 47px" >
</asp:RangeValidator>
<asp:Button id="Button1" style="LEFT: 10px; POSITION: absolute; TOP: 100px"
runat="server" Text="Button"></asp:Button>
</form>
以ä¸ç¤ºä¾è¯´æäºå¦ä½ä½¿ç¨
Regexç±»éªè¯èå´ï¼
try
{
// The conversion will raise an exception if not valid.
int i = Convert.ToInt32(sInput);
if ((0 <= i && i <= 255) == true)
{
// data is valid, use the number
}
}
catch( FormatException )
{
. . .
}
ååè¾å
¥ æè°ååå°±æ¯ä½¿æå¯è½åå¨çæ¶ææ°æ®åå¾å®å ¨ãå¨å 许çè¾å ¥èå´æ æ³ä¿è¯è¾å ¥å®å ¨æ¶ï¼è¿æ¯é常æç¨çãååå¯è½å æ¬å é¤ç¨æ·ææä¾çå符串æåç空ç½ï¼æè å°å¼è½¬ä¹ä½¿å®ä»¬å½ä½ææ¬å¤çã妿æ¨éè¦ååè¾å ¥ï¼è½¬æ¢æè å é¤ç¹å®çè¾å ¥å符ï¼å¯ä»¥ä½¿ç¨
Regex.Replaceã
注使ç¨è¿ç§æ¹å¼å¯ä»¥è¿è¡çºµæ·±é²èãåºè¯¥æ»æ¯é¦å 约æè¾å ¥ä¸ºå·²ç¥âæ£å¸¸âå¼çéåã
以ä¸ä»£ç å é¤äºå æ¬ <>/"'%;()& å¨å çä¸ç»æå¯è½ä¸å®å ¨çå符ãprivate string SanitizeInput(string input)
{
Regex badCharReplace = new Regex(@"^([<>""'%;()&])$");
string goodChars = badCharReplace.Replace(input, "");
return goodChars;
}
æå ³ååèªç±æ ¼å¼è¾å ¥åæ®µçæ´å¤ä¿¡æ¯ï¼ä¾å¦æ³¨éåæ®µï¼è¯·åé æ¬åå åé¢çâè·¨ç«ç¹èæ¬æ»å»âä¸çâååèªç±æ ¼å¼çè¾å ¥âã
éªè¯ HTML æ§ä»¶å¦ææ¨ä¸ä½¿ç¨æå¡å¨æ§ä»¶ï¼å³å¸¦æ
runat="server"屿§çæ§ä»¶ï¼èæ¯ä½¿ç¨å¸¸è§ç HTML æ§ä»¶ï¼åæ æ³ä½¿ç¨ ASP.NET éªè¯ç¨åºæ§ä»¶ãç¸åæ¨å¯ä»¥éè¿å¨
Page_Loadäºä»¶å¤çç¨åºä¸ä½¿ç¨æ£å表达å¼ï¼ä»¥éªè¯ Web 页çå 容ï¼å¦ä¸æç¤ºã
using System.Text.RegularExpressions;
. . .
private void Page_Load(object sender, System.EventArgs e)
{
// Note that IsPostBack applies only for
// server forms (with runat="server")
if ( Request.RequestType == "POST" ) // non-server forms
{
// Validate the supplied email address
if( !Regex.Match(Request.Form["email"],
@"^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$",
RegexOptions.None).Success)
{
// Invalid email address
}
// Validate the supplied name
if ( !RegEx.Match(Request.Form["name"],
@"^[A-Za-z'/- ]$",
RegexOptions.None).Success)
{
// Invalid name
}
}
}
éªè¯ç¨äºæ°æ®è®¿é®çè¾å
¥ å¦ææ¨æ ¹æ®ç¨æ·è¾å ¥çæå¨æç SQL æ¥è¯¢ï¼SQL æ³¨å ¥æ»å»è½å¤æ³¨å ¥å¯ä»¥å¨æ°æ®åºä¸æ§è¡çæ¶æ SQL å½ä»¤ãå¨å ¸åçåºäº Web çæ°æ®è®¿é®åºæ¯ä¸ï¼å¯ä»¥ä½¿ç¨ä»¥ä¸çºµæ·±é²èçç¥ï¼
⢠| ä½¿ç¨æ£å表达å¼çº¦æé¡µç±»ä¸çè¾å ¥ã |
⢠| ååæè æç»è¾å ¥ã为äºçºµæ·±é²èï¼æ¨å¯ä»¥éæ©ä½¿ç¨è¾ 婿¹æ³å é¤ç©ºå符æè å ¶ä»å·²ç¥çä¸è¯å符ã |
⢠| 使ç¨åæ°ååå¨è¿ç¨è¿è¡æ°æ®è®¿é®ï¼ä»èç¡®ä¿å¯¹ SQL æ¥è¯¢ä¸ä½¿ç¨çæ°æ®æ§è¡ç±»ååé¿åº¦æ£æ¥ã |
æå ³ä½¿ç¨åæ°è¿è¡æ°æ®è®¿é®åç¼åå®å ¨çæ°æ®è®¿é®ä»£ç çæ´å¤ä¿¡æ¯ï¼è¯·åé âæå»ºå®å ¨çæ°æ®è®¿é®âåå ã
éªè¯ç¨äºæä»¶ I/O çè¾å ¥ä¸è¬èè¨ï¼æ¨åºè¯¥é¿å ç¼åä»è°ç¨æ¹æ¥åæä»¶è¾å ¥æè è·¯å¾è¾å ¥ç代ç ãç¸åï¼å¨è¯»åååå ¥æ°æ®æ¶åºè¯¥ä½¿ç¨åºå®æä»¶ååä½ç½®ãè¿è½å¤ç¡®ä¿æ¨çä»£ç æ æ³è¢«å¼ºå¶è®¿é®ä»»ææä»¶ãè¿è½ç¡®ä¿ä»£ç ä¸å®¹æéå°è§èåé误ã
妿æ¨ç¡®å®éè¦æ¥åè¾å ¥æä»¶åï¼æä¸¤ä¸ªä¸»è¦çææãé¦å ï¼çæçæä»¶è·¯å¾ååç§°æ¯æææä»¶ç³»ç»åç§°åï¼å ¶æ¬¡ï¼è·¯å¾å¨æ¨çåºç¨ç¨åºçä¸ä¸æä¸æ¯ææçåï¼ä¾å¦ï¼å®å¨åºç¨ç¨åºçèææ ¹ç®å½ä¹ä¸åï¼
è¦è§èåæä»¶åï¼åºè¯¥ä½¿ç¨
System.IO.Path.GetFullPathãè¦æ£æ¥æä»¶è·¯å¾æ¯å¦å¨åºç¨ç¨åºçä¸ä¸æä¸ææï¼æ¨å¯ä»¥ä½¿ç¨ .NET 代ç 访é®å®å ¨ç»ä»£ç æäºç²¾ç¡®ç
FileIOPermissionï¼ä»è代ç åªè½è®¿é®æ¥èªç¹å®ç®å½çæä»¶ãæå ³æ´å¤ä¿¡æ¯ï¼è¯·åé âæå»ºå®å ¨çç¨åºéâåâ代ç 访é®å®å ¨å®è·µâåå ä¸çâæä»¶ I/Oâé¨åã
ä½¿ç¨ MapPath妿æ¨ä½¿ç¨
MapPathå°ææä¾çèæè·¯å¾æ å°å°æå¡å¨ä¸çä¸ä¸ªç©çè·¯å¾ï¼å¯ä»¥ä½¿ç¨æ¥å
boolåæ°ç
Request.MapPathçè´è½½ï¼ä»èå¯ä»¥é²æ¢è·¨åºç¨ç¨åºçæ å°ï¼å¦ä¸æç¤ºï¼
try
{
string mappedPath = Request.MapPath( inputPath.Text,
Request.ApplicationPath, false);
}
catch (HttpException)
{
// Cross-application mapping attempted
}
æåç
false忰鲿¢è·¨åºç¨ç¨åºæ å°ãè¿æå³çç¨æ·æ æ³æåå°æä¾å å« ".." çè·¯å¾ä»èéåå°åºç¨ç¨åºçèæç®å½å±æ¬¡ä¹å¤ãä»»ä½è¿æ ·åçä¼å¾ï¼é½ä¼å¯¼è´
HttpExceptionç±»åçå¼å¸¸ã
注æå¡å¨æ§ä»¶è½å¤ä½¿ç¨
Control.MapPathSecureæ¹æ³è¯»åæä»¶ãè¿ä¸ªæ¹æ³è¦æ±éè¿ä»£ç 访é®å®å ¨çç¥æäºå¼å«ä»£ç å®å ¨ä¿¡ä»»ï¼å¦åå°å¼åä¸ä¸ª
HttpExceptionãæå ³æ´å¤ä¿¡æ¯ï¼è¯·åé .NET Framework SDK ææ¡£ä¸ç
Control.MapPathSecureã
常è§çæ£å表达å¼Visual Studio .NET æä¾äºä¸ç»æç¨çæ£å表达å¼ãè¦è®¿é®å®ä»¬ï¼å°
RegularExpresssionValidatoræ§ä»¶æ·»å å° Web çªä½ï¼å¹¶å廿§ä»¶
Expression屿§å段ä¸ççç¥æé®ãä¸è¡¨ååºäºå¸¸ç¨ç Web 页忮µçå ¶ä»ä¸äºæç¨ç表达å¼ã
表 2 æç¨çæ£å表达å¼å段 | |||
åæ®µ | è¡¨è¾¾å¼ | æ ¼å¼ç¤ºä¾ | 说æ |
Name | [a-zA-Z'`-Ãâô/s]{1,40} | John Doe O'Dell | éªè¯åç§°ãå 许æå¤ 40 个大å忝ãå°å忝å符åä¸äºå§åä¸å¸¸è§çç¹æ®å符ãè¿ä¸ªå表å¯ä»¥è¿è¡è°æ´ã |
Numbers | ^/D?(/d{3})/D?/D?(/d{3})/D?(/d{4})$ | (425)-555-0123 425-555-0123 425 555 0123 | éªè¯ç¾å½çµè¯å·ç ã |
/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)* | [email protected] example.com | éªè¯çµåé®ä»¶å°åã | |
URL | ^(http|https|ftp)/://[a-zA-Z0-9/-/.]+/.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9/-/._/?/,/'+&%/$#/=~])*$ | éªè¯ URLã | |
Zip Code | ^(/d{5}-/d{4}|/d{5}|/d{9})$|^([a-zA-Z]/d[a-zA-Z] /d[a-zA-Z]/d)$ | éªè¯ç¾å½é®æ¿ç¼ç ï¼å 许 5 使è 9 使°ã | |
Password | ^(?=.*/d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ | éªè¯ååºçå¯ç ãå¿ é¡»å¨ 8 ä¸ªå° 10 个å符ä¹é´ãå¿ é¡»å å«å¤§å忝ãå°å忝忰åç»åï¼æ²¡æç¹æ®å符ã | |
éè´æ´æ° | /d+ | 986 | éªè¯å¤§äºé¶çæ´æ°ã |
Currency ï¼éè´ï¼ | "/d+(/./d/d)?" | éªè¯æ£è´§å¸å¼ãè¦æ±å°æ°ç¹å两ä½ã | |
Currency ï¼æ£æè è´ï¼ | "(-)?/d+(/./d/d)?" | éªè¯æ£æè è´è´§å¸å¼ãè¦æ±å°æ°ç¹å两ä½ã |
è¿å页é¦
è·¨ç«ç¹èæ¬æ»å»
XSS æ»å»éè¿æ³¨å ¥å®¢æ·ç«¯èæ¬ä»£ç å©ç¨ Web 页éªè¯ä¸çæ¼æ´ãè¿ä¸ªä»£ç ç¶åä¼åéåä¸å æççç¨æ·ï¼ç±æµè§å¨æ¥æ§è¡ãå 为æµè§å¨æ¯ä»å¯ä¿¡ç«ç¹ä¸è½½èæ¬ä»£ç ï¼æµè§å¨æ²¡æåæ³æ è¯ä»£ç æ¯å¦åæ³ï¼èä¸ Internet Explorer å®å ¨åºå乿²¡ææä¾ä»»ä½é²èãXSS æ»å»è¿è½å¤éè¿ HTTP æè HTTPS (SSL) è¿æ¥å·¥ä½ãå½ä¸ä¸ªæ»å»è ç¼åèæ¬æ£ç´¢è½å¤æä¾å¯¹å¯ä¿¡ç«ç¹è®¿é®æéç身份éªè¯ cookie ï¼å¹¶å°å®å¼ è´´å°æ»å»è ç¥éç Web å°åï¼å°åºç°æä¸¥éçé®é¢ãè¿å 许æ»å»è 欺éªåæ³ç¨æ·çæ è¯ï¼å¹¶è·åè®¿é® Web ç«ç¹çè¿æ³æéã使ç¨ä»¥ä¸å¯¹ç鲿¢ XSS æ»å»ï¼
⢠| éªè¯è¾å ¥ |
⢠| ç¼ç è¾åº |
ä½¿ç¨æ¬åå ä¸åé¢åè¿°çåç§ææ¯éªè¯æ¥èªåºç¨ç¨åºç信任边çä¹å¤çä»»ä½è¾å ¥çç±»åãé¿åº¦ãæ ¼å¼åèå´ã
ç¼ç è¾åºå¦ææ¨å°ææ¬è¾åºåå ¥ Web 页ï¼è䏿¨ä¸è½è¯å®å°ç¥éææ¬ä¸æ¯å¦ä¸å å« HTML ç¹æ®å符ï¼ä¾å¦ <ã> å
&ï¼ï¼ååºè¯¥ç¡®ä¿ä½¿ç¨
HttpUtility.HtmlEncodeæ¹æ³å¯¹å ¶è¿è¡é¢å¤çãå³ä½¿ææ¬æ¥èªç¨æ·è¾å ¥ãæ°æ®åºæè æ¬å°æä»¶ï¼ä¹åºè¯¥è¿æ ·åã类似å°ï¼ä½¿ç¨
HttpUtility.UrlEncodeç¼ç URL å符串ã
HtmlEncodeæ¹æ³å° HTML ä¸æç¹æ®æä¹çå符ç¨ä»£è¡¨è¿äºå符ç HTML åé代æ¿ãä¾å¦ï¼< å°ç¨
<代æ¿ï¼è
"ç¨
"代æ¿ãç¼ç çæ°æ®ä¸ä¼å¯¼è´æµè§å¨æ§è¡ä»£ç ãç¸åï¼æ°æ®ä¼ä»¥æ 害ç HTML 形弿¾ç¤ºã
Response.Write(HttpUtility.HtmlEncode(Request.Form["name"]));
æ°æ®ç»å®æ§ä»¶ æ°æ®ç»å® Web æ§ä»¶ä¸ä¼å¯¹è¾åºè¿è¡ç¼ç ãå¯ä¸ç¼ç è¾åºçæ§ä»¶æ¯
TextBoxæ§ä»¶ï¼å½å ¶
TextMode屿§è®¾ç½®ä¸º
MultiLineæ¶ï¼ã妿æ¨å°ä»»ä½å ¶ä»æ§ä»¶ç»å®å°ææ¶æ XSS 代ç çæ°æ®ï¼ä»£ç å°å¨å®¢æ·ç«¯æ§è¡ãå æ¤ï¼å¦ææ¨ä»æ°æ®åºä¸æ£ç´¢æ°æ®ï¼è䏿 æ³ç¡®å®æ°æ®æ¯å¦ææï¼å¯è½å ä¸ºæ°æ®åºæ¯ä¸å ¶ä»åºç¨ç¨åºå ±äº«çï¼ï¼å¨æ°æ®ä¼ å客æ·ç«¯ä¹åå¯¹æ°æ®è¿è¡ç¼ç ã
ååèªç±æ ¼å¼çè¾å ¥å¦ææ¨ç Web é¡µå æ¬èªç±æ ¼å¼ææ¬æ¡ï¼ä¾å¦âcommentsâåæ®µï¼å ¶ä¸éè¦å 许ä¸äºå®å ¨ç HTML å ç´ ä¾å¦ <
b> å <
i>ï¼å¯ä»¥éè¿é¦å ç¨
HtmlEncodeè¿è¡é¢å¤çï¼ç¶åæéæ©å°å 餿å 许å ç´ çç¼ç ï¼èå®å ¨å°è§£å³è¿ä¸é®é¢ï¼å¦ä¸æç¤ºï¼
StringBuilder sb = new StringBuilder( HttpUtility.HtmlEncode(userInput) ) ;
sb.Replace("<b>", "");
sb.Replace("</b>", "");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "");
Response.Write(sb.ToString());
纵深é²è对ç é¤äºåé¢è®¨è®ºçææ¯ä¹å¤ï¼è¿å¯ä»¥ä½¿ç¨ä»¥ä¸å¯¹çè¿è¡çºµæ·±é²è以鲿¢ XSSï¼
⢠| 设置æ£ç¡®çå符ç¼ç ã |
⢠| ä½¿ç¨ ASP.NET 1.1 ç validateRequest é项 ã |
⢠| å¨ Web æå¡å¨ä¸å®è£ URLScan ã |
⢠| ä½¿ç¨ HttpOnly cookie é项 ã |
⢠| ä½¿ç¨ < frame > å®å ¨å±æ§ ã |
⢠| ä½¿ç¨ innerText 屿§ ã |
è¦æåå°å¯¹ä»ä¹æ°æ®å¯¹äºæ¨ç Web 页ææè¿è¡éå¶ï¼éå¶è¾å ¥æ°æ®ç表示æ¹å¼é常éè¦ãè¿é²æ¢äºæ¶æç¨æ·ä½¿ç¨è§èååå¤åè转ä¹åºåæ¬ºéªæ¨çè¾å ¥éªè¯ä¾ç¨ã
ASP.NET 使æ¨è½å¤å¨é¡µçº§æè åºç¨ç¨åºçº§éè¿ä½¿ç¨ Web.config ä¸ç <
globalization> å ç´ æå®å符éã ä¸¤ç§æ¹æ³é½å¦ä¸æç¤ºï¼å ¶ä¸ä½¿ç¨äº ISO-8859-1 å符ç¼ç ï¼è¿å¨æ©æ HTML å HTTP çæ¬ä¸æ¯é»è®¤é项ã
å¨é¡µçº§è®¾ç½®å符ç¼ç ï¼ä½¿ç¨ <
meta> å ç´ æè
ResponseEncodingé¡µçº§å±æ§ï¼å¦ä¸æç¤ºï¼
<meta http-equiv="Content Type"
content="text/html; charset=ISO-8859-1" />
æè ï¼
<% @ Page ResponseEncoding="ISO-8859-1" %>
å¨ Web.config ä¸è®¾ç½®å符ç¼ç ï¼ä½¿ç¨ä»¥ä¸é ç½®ï¼
<configuration>
<system.web>
<globalization
requestEncoding="ISO-8859-1"
responseEncoding="ISO-8859-1"/>
</system.web>
</configuration>
éªè¯ Unicode å符 使ç¨ä»¥ä¸ä»£ç å¨é¡µä¸éªè¯ Unicode å符ï¼
using System.Text.RegularExpressions;
. . .
private void Page_Load(object sender, System.EventArgs e)
{
// Name must contain between 1 and 40 alphanumeric characters
// together with (optionally) special characters '`̫̉ for names such
// as D'Angelo
if (!Regex.IsMatch(Request.Form["name"], @"^[/p{L}/p{Zs}/p{Lu}/p{Ll}]{1,40}$"))
throw new ArgumentException("Invalid name parameter");
// Use individual regular expressions to validate other parameters
. . .
}
以ä¸è§£éäºåé¢ä»£ç 䏿¾ç¤ºçæ£å表达å¼ï¼
⢠| { < name > } æå®å½å Unicode å符类ã |
⢠| /p{ < name > } å¹é éè¿ { < name > } æå®çå½åå符类ä¸çä»»ä½å符ã |
⢠| {L} æ§è¡ä»å·¦å°å³çå¹é ã |
⢠| {Lu} æ§è¡å¤§å忝å¹é ã |
⢠| {Ll} æ§è¡å°å忝å¹é ã |
⢠| {Zs} å¹é åé符åç©ºæ ¼ã |
⢠| {1,40} æå³çå符æ°ä¸å°äº 1ï¼ä¸å¤§äº 40ã |
⢠| {Mn} å¹é æ è®°åéç©ºæ ¼å符ã |
⢠| {Zs} å¹é åé符åç©ºæ ¼ã |
⢠| * æå® 0 æè æ´å¤å¹é ã |
⢠| $ æå³ç卿¤ä½ç½®åæ¢æ¥çã |
屿§æ¯ .NET Framework 1.1 ççåè½ãè¿ä¸ªå±æ§å¨ Machine.config ä¸ç <
pages> å ç´ ä¸é»è®¤æ¶è®¾ç½®ä¸º trueãå®æç¤º ASP.NET æ£æ¥ææä»æµè§å¨æ¥æ¶çæ°æ®æ¯å¦æå¯è½å卿¶æçè¾å ¥ï¼ä¾å¦ï¼å å« <
script> å ç´ çè¾å ¥ãASP.NET æ£æ¥ä» HTML çªä½å段ãcookie åæ¥è¯¢åç¬¦ä¸²æ¥æ¶çè¾å ¥ã.NET Framework 1.0 çæ²¡ææä¾ä»»ä½çæçåè½ï¼ 使¯ IIS URLScan Internet æå¡å¨åºç¨ç¨åºç¼ç¨æ¥å£ (ISAPI) çéå¨è½å¤æ§è¡ç±»ä¼¼çå·¥ä½ãæ¨è¿å¯ä»¥ä½¿ç¨
@ Pageæ è®°å°è®¾ç½®åºç¨å°æ¯ä¸ªé¡µï¼å¦ä¸æç¤ºï¼
<% @ Page validateRequest="True" %>
å¨ Web æå¡å¨ä¸å®è£
URLScan URLScan æ¯ä¸ä¸ª ISAPI çéå¨ï¼å½æ¨è¿è¡ IISLockdown å·¥å ·æ¶å®è£ å®ãå®éè¿æç»æå¯è½å卿¶æçè¾å ¥ï¼æå©äºåå° XSS æ»å»çå¨èãæå ³ IISLockdown å URLScan çæ´å¤ä¿¡æ¯ï¼è¯·åé âä¿æ¤ Web æå¡å¨çå®å ¨âåå ã
注Windows Server 2003 ä¸ç IIS 6.0 å ·æçæäºå ç½®ç URLScan å·¥å ·çåè½ã
ä½¿ç¨ HttpOnly Cookie é项Internet Explorer 6 Service Pack 1 æ¯ææ°ç
HttpOnlycookie 屿§ï¼è¿è½å¤é²æ¢å®¢æ·ç«¯èæ¬è®¿é®æ¥èª
document.cookie屿§ç cookieãç¸åå®ä¼è¿åä¸ä¸ªç©ºçåç¬¦ä¸²ãæ è®ºä½æ¶ç¨æ·æµè§å°å½ååä¸ç Web ç«ç¹æ¶ï¼cookie ä»ç¶ä¼åéå°æå¡å¨ã
æ³¨ä¸æ¯æ
HttpOnlycookie 屿§ç Web æµè§å¨è¦ä¹å¿½ç¥ cookie è¦ä¹å¿½ç¥æ¤å±æ§ï¼è¿æå³çå®ä»ç¶å®¹æéå° XSS æ»å»ã
System.Net.Cookieç±»ç®å并䏿¯æ
HttpOnly屿§ãè¦å¨ cookie 䏿·»å ä¸ä¸ª
HttpOnly屿§ï¼éè¦ä½¿ç¨ä¸ä¸ª ISAPI çéå¨ï¼æè 妿æ¨éè¦æç®¡ä»£ç è§£å³æ¹æ¡ï¼å°ä»¥ä¸ä»£ç æ·»å å° Global.asax ä¸åºç¨ç¨åºç
Application_EndRequestäºä»¶å¤çç¨åºä¸ï¼
protected void Application_EndRequest(Object sender, EventArgs e)
{
string authCookie = FormsAuthentication.FormsCookieName;
foreach (string sCookie in Response.Cookies)
{
// Just set the HttpOnly attribute on the Forms authentication cookie
// Skip this check to set the attribute on all cookies in the collection
if (sCookie.Equals(authCookie))
{
// Force HttpOnly to be added to the cookie header
Response.Cookies[sCookie].Path += ";HttpOnly";
}
}
}
注 .NET Framework çæªæ¥çæ¬å¯è½å¨
Cookieç±»ä¸å å«ä¸ä¸ª
HttpOnly屿§ã
ä½¿ç¨ å®å ¨å±æ§Internet Explorer 6 åæ´é«çæ¬æ¯æ <
frame> å <
iframe> å ç´ çæ°ç
security屿§ãæ¨å¯ä»¥ä½¿ç¨
security屿§å°ç¨æ·çåéç«ç¹ Internet Explorer å®å ¨åºå设置åºç¨å°åç¬ç
frameæè
iframeãé»è®¤æ¶ï¼åéç«ç¹åºå䏿¯æèæ¬æ§è¡ã妿æ¨ä½¿ç¨
security屿§ï¼å¿ é¡»å¨å½åè®¾ç½®å ¶ä¸ºârestrictedâï¼å¦ä¸æç¤ºï¼
<frame security="restricted" src="http://www.somesite.com/somepage.htm"></frame>
ä½¿ç¨ innerText 屿§ 妿æ¨ç¨ä¸å¯ä¿¡è¾å ¥å建页ï¼ä½¿ç¨
innerText屿§ä»£æ¿
innerHTMLã
innerText屿§å°å®å ¨å°æä¾å 容ï¼å¹¶ç¡®ä¿èæ¬ä¸ä¼æ§è¡ã
è¿å页é¦
身份éªè¯
èå¼±ç身份éªè¯ä¼å¢å æ è¯æ¬ºéªå¨èãå¦æç¨æ·çç»å½åæ®è½å°äºæ¶æç¨æ·çæä¸ï¼æ»å»è å°æ¬ºéªç¨æ·çæ è¯å¹¶è·å访é®åºç¨ç¨åºçæéãæ»å»è å°å ±äº«åºç¨ç¨åºä¸ææç¨æ·çç¹æãåæ®å¨éè¿ç½ç»ä¼ è¾åæä¹ åå¨ï¼ä¾å¦åå¨å¨åºç¨ç¨åºçç¨æ·åå¨åºä¸ï¼æ¶å¿ é¡»äºä»¥ä¿æ¤ã代表ä¸ä¸ªå¯¹åºç¨ç¨åºå·²è¿è¡èº«ä»½éªè¯æ è¯ç身份éªè¯ cookieï¼å¨æåçç»å½ä¹åå¿ é¡»ä¹è¿è¡ä¿æ¤ï¼ä»¥åå°ä¼è¯å«æå cookie éæ¾æ»å»çé£é©ã
çªä½èº«ä»½éªè¯ä¼è¯å«æå cookie éæ¾æ»å»çå¨è对äºä½¿ç¨çªä½èº«ä»½éªè¯çåºç¨ç¨åºå°¤å ¶ä¸¥éãå¨ä½¿ç¨ç¨æ·ææä¾çåæ®æ¥è¯¢æ°æ®åºæ¶ï¼æ¨å¿ é¡»ç¹å«å°å¿ï¼ç¡®ä¿ä¸å®¹æéå° SQL æ³¨å ¥æ»å»ãæ¤å¤ï¼ä¸ºäºé²æ¢æ è¯æ¬ºéªï¼åºè¯¥ç¡®ä¿ç¨æ·åå¨åºçå®å ¨ï¼èä¸å®æ½äºååºçå¯ç ã
以ä¸ç段说æäº Web.config ä¸çâå®å ¨çâçªä½èº«ä»½éªè¯é ç½®ï¼
<forms loginUrl="Restricted/login.aspx" Login page in an SSL protected folder
protection="All" Privacy and integrity
requireSSL="true" Prevents cookie being sent over http
timeout="10" Limited session lifetime
name="AppNameCookie" Unique per-application name
path="/FormsAuth" and path
slidingExpiration="true" > Sliding session lifetime
</forms>
以䏿¨èå®è·µæå©äºæå»ºå®å ¨ççªä½èº«ä»½éªè¯è§£å³æ¹æ¡ï¼
⢠| 为 Web ç«ç¹ååº ã |
⢠| ä½¿ç¨ SSL ä¿æ¤åé页 ã |
⢠| ä½¿ç¨ URL ææ ã |
⢠| ä¿æ¤èº«ä»½éªè¯ cookie ã |
⢠| 使ç¨ç»å¯¹ URL è¿è¡å¯¼èª ã |
⢠| 使ç¨å®å ¨çåæ®ç®¡ç ã |
å¨ç«ç¹è®¾è®¡ä¸ï¼ä¸å®è¦å°è¦æ±èº«ä»½éªè¯è®¿é®æéçå®å ¨é¡µç½®äºä¸å¯å¿å访é®ç页ä¸åçåç®å½ä¸ãå¾ 3 说æäº Visual Studio .NET è§£å³æ¹æ¡èµæºç®¡çå¨çªå£çå ¸å宿ã请注æçªä½ç»å½é¡µæ¯ææ ·ä¸å ¶ä»åé页置äºä¸ååç®å½ä¸çã
妿æ¨å¨åºç¨ç¨åºä¸ä½¿ç¨
Server.Transferä»ä¸ä¸ªå¿åé¡µä¼ è¾å°å®å ¨é¡µï¼.NET Framework 1.1 çæè æ´æ©ççæ¬å°ç»è¿èº«ä»½éªè¯æ£æ¥ï¼å æ¤å¯¹ä½¿ç¨
Server.Transferç代ç åºè¯¥è¿è¡éªè¯ï¼ä»¥ç¡®ä¿å®ä¸ä¼ä¼ è¾å°å®å ¨çç®å½ã
ç¨ SSL ä¿æ¤åé页è¦ç¡®ä¿ä½¿ç¨ SSL ä¿æ¤ä»ç»å½çªä½åéèæ¥çç»å½åæ®ï¼ä»¥åä¿æ¤éè¿åé页çåç»è¯·æ±ä¼ éç身份éªè¯ cookieï¼è¯·å¨ IIS ä¸é ç½®å®å ¨çæä»¶å¤¹ä»¥è¦æ±ä½¿ç¨ SSLãè¿å°è®¾ç½® IIS å æ°æ®åºä¸æä»¶å¤¹ç
AccessSSL=true屿§ã对åä¿æ¤æä»¶å¤¹ä¸é¡µç请æ±åªæå¨è¯·æ± URL ä¸ä½¿ç¨ https æ¶æä¼æåã
å¯¹äº SSLï¼å¿ é¡»å¨ Web æå¡å¨ä¸å®è£ æå¡å¨è¯ä¹¦ãæå ³æ´å¤ä¿¡æ¯ï¼è¯·åé âå¦ä½ï¼å¨ Web æå¡å¨ä¸å®è£ SSL âï¼å¨â Microsoft patterns & practices 第 I å·ï¼æå»ºå®å ¨ç ASP.NET Web åºç¨ç¨åºï¼èº«ä»½éªè¯ãææåå®å ¨é讯âçâå¦ä½â¦â¦âé¨åä¸ï¼ç½åæ¯ï¼http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpMSDN.aspã
ä½¿ç¨ URL ææè¦å 许å¿å访é®å ¬å¼é¡µï¼ä½¿ç¨ä»¥ä¸ <
authorization> å ç´ ã
<system.web>
<!-- The virtual directory root folder contains general pages.
Unauthenticated users can view them and they do not need
to be secured with SSL. -->
<authorization>
<allow users="*" />
</authorization>
</system.web>
使ç¨ä»¥ä¸ Web.config ä¸ <
location> å ç´ ä¸ç <
authorization> å ç´ æç»æªç»èº«ä»½éªè¯çç¨æ·ç访é®ï¼å¹¶å¼ºå¶éå®åå° <
forms> å ç´ æå®çç»å½é¡µï¼
<!-- The restricted folder is for authenticated and SSL access only. -->
<location path="Secure" >
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
ä¿æ¤èº«ä»½éªè¯ cookie è¦é²æ¢ä¼è¯å«æå cookie éæ¾æ»å»ï¼éè¿ç¡®ä¿ cookie åªéè¿ä½¿ç¨ HTTPS åè®®ç SSL è¿æ¥è¿è¡ä¼ è¾æ¥ä¿æ¤æ¤ cookieã为äºè¿ä¸æ¥éä½é£é©ï¼å¨å° cookie åéå°å®¢æ·ç«¯ä¹åå¯¹å ¶å å¯ï¼å¹¶éå¶ cookie çæææ¶é´ãè¦ä¿æ¤èº«ä»½éªè¯ cookieï¼
⢠| éå¶èº«ä»½éªè¯ cookie åªä½¿ç¨ HTTPS è¿æ¥ ã |
⢠| å å¯ cookie ã |
⢠| éå¶ cookie çåæ ã |
⢠| èè使ç¨åºå®å°ææ¶é´ ã |
⢠| ä¸è¦æä¹ åå¨èº«ä»½éªè¯ cookie ã |
⢠| 使身份éªè¯å个æ§å cookie å离 ã |
⢠| 使ç¨å¯ä¸ç cookie åç§°åè·¯å¾ ã |
cookie æ¯æè½ç¡®å®æ¯å¦æµè§å¨åºè¯¥å° cookie åéåæå¡å¨çâå®å ¨â屿§ã设置å®å ¨å±æ§åï¼ cookie å°ç±æµè§å¨åªåéå°ä½¿ç¨ HTTPS URL 请æ±çå®å ¨ç页ã
妿æ¨ä½¿ç¨ .NET Framework 1.1 çï¼éè¿ä½¿ç¨ <
forms> å ç´ ç
requireSSL="true"设置å®å ¨å±æ§ï¼å¦ä¸æç¤ºï¼
<forms loginUrl="Secure/Login.aspx"
requireSSL="true" . . . />
妿æ¨ä½¿ç¨ .NET Framework 1.0 çï¼ä½¿ç¨ä»¥ä¸ä»£ç å¨ Global.asax ç
Application_EndRequestäºä»¶å¤çç¨åºä¸æå¨è®¾ç½®å®å ¨å±æ§ï¼
protected void Application_EndRequest(Object sender, EventArgs e)
{
string authCookie = FormsAuthentication.FormsCookieName;
foreach (string sCookie in Response.Cookies)
{
if (sCookie.Equals(authCookie))
{
// Set the cookie to be secure. Browsers will send the cookie
// only to pages requested with https
Response.Cookies[sCookie].Secure = true;
}
}
}
å å¯ cookie åºè¯¥å å¯ cookie å 容ï¼å³ä½¿æ¨ä½¿ç¨ SSLã妿仿è 她设æ³éè¿ XSS æ»å»çªå cookieï¼è¿è½å¤é²æ¢æ»å»è æ¥çæè ä¿®æ¹ cookieãå¨è¿ç§æ åµä¸ï¼æ»å»è ä»ç¶è½å¤ä½¿ç¨ cookie è·å对æ¨çåºç¨ç¨åºç访é®ãåå°è¿ç§é£é©çæä½³æ¹å¼æ¯å®ç°éå½ç对ç以鲿¢ XSS æ»å»ï¼å¨æ¬åå åé¢çâè·¨ç«ç¹èæ¬æ»å»âåè¿°ï¼ï¼å¹¶å¦ä¸é¢çæ¨èå®è·µä¸åè¿°ç飿 ·éå¶ cookie ççåæã
è¦æä¾ cookie çç§å¯æ§å宿´æ§ï¼åºè¯¥è®¾ç½® <
forms> å ç´ ç
protection屿§ï¼å¦ä¸æç¤ºï¼
<forms protection="All" Privacy and integrity
éå¶ cookie ççåæ éå¶ cookie ççåæè½å¤åå°æ»å»è è½å¤ä½¿ç¨å·²æè·ç cookie è·å对æ¨çåºç¨ç¨åºæ¬ºéªè®¿é®æéçæ¶é´çªå£ã
<forms timeout="10" Reduced cookie lifetime (10 minutes)
èè使ç¨åºå®çå°ææ¶é´ èè设置 <
forms> å ç´ ç
slidingExpiration="false"以åºå® cookie çå°ææ¶é´ï¼èä¸è¦å¨æ¯æ¬¡ Web 请æ±ä¹åéæ°è®¾ç½®å°ææ¶é´ã妿æ¨ä¸ä½¿ç¨ SSL ä¿æ¤ cookie ï¼è¿å°¤å ¶éè¦ã
注è¿ä¸åè½åå¨äº .NET Framework 1.1 çä¸ã
ä¸è¦æä¹ åå¨èº«ä»½éªè¯ cookieä¸è¦æä¹ åå¨èº«ä»½éªè¯ cookieï¼å 为å®ä»¬åå¨å¨ç¨æ·çé ç½®æä»¶ä¸ï¼å¦ææ»å»è è·å¾äºå¯¹ç¨æ·è®¡ç®æºçç©çè®¿é®æéï¼å°±å¯ä»¥çªåå®ã彿¨å建
FormsAuthenticationTicketæ¶ï¼å¯ä»¥æå®éæä¹ åå¨ cookieï¼å¦ä¸æç¤ºï¼
FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket(
1, // version
Context.User.Identity.Name, // user name
DateTime.Now, // issue time
DateTime.Now.AddMinutes(15), // expires every 15 mins
false, // do not persist the cookie
roleStr ); // user roles
使身份éªè¯å个æ§å cookie å离 使å å«ç¹å®äºç¨æ·çé¦é项åéæææ°æ®ç个æ§å cookie å身份éªè¯ cookie åç¦»å¼æ¥ãçªå个æ§å cookie å¯è½ä¸ä¼å¸¦æ¥å®å ¨å¨èï¼èæ»å»è è½å¤ä½¿ç¨çªå¾ç身份éªè¯ cookie è·å对æ¨çåºç¨ç¨åºçè®¿é®æéã
使ç¨å¯ä¸ç cookie åç§°åè·¯å¾ä½¿ç¨å¯ä¸ç <
forms> å ç´ ç
nameå
path屿§å¼ãéè¿ç¡®ä¿åç§°å¯ä¸ï¼å¯ä»¥é²æ¢å¨å䏿å¡å¨å¯å®¿å¤ä¸ªåºç¨ç¨åºæ¶å¯è½åççåç§é®é¢ãä¾å¦ï¼å¦ææ¨ä¸ä½¿ç¨å¯ä¸åç§°ï¼å¨ä¸ä¸ªåºç¨ç¨åºä¸å·²èº«ä»½éªè¯çç¨æ·å°±æå¯è½è¯·æ±å¦ä¸ä¸ªåºç¨ç¨åºï¼èä¸ç¨éå®åå°è¯¥åºç¨ç¨åºçç»å½é¡µã
æå ³æ´å¤ä¿¡æ¯ï¼è¯·åé Microsoft ç¥è¯åºæç« 313116ï¼â PRB:Forms Authentication Requests Are Not Directed to loginUrl Pageâï¼å 310415ï¼âPRB:Mobile Forms Authentication and Different Web Applicationsâã
使ç¨ç»å¯¹ URL è¿è¡å¯¼èªå¨æ¨çç«ç¹å ¬å¼ååéåºåä¹é´ï¼å³å¨ HTTP å HTTPS 页ä¹é´ï¼å¯¼èªæ¯ä¸ä¸ªé®é¢ï¼å 为éå®åæ»è¦ä½¿ç¨å½å页èéç®æ 页çåè®®ï¼HTTPS æè HTTPï¼ã
å¨ç¨æ·ç»å½åæµè§ç¨ SSL ä¿æ¤çç®å½ä¸ç页ä¹åï¼ç¸å ³é¾æ¥ä¾å¦â../publicpage.aspxâæè éå®åå° HTTP 页ï¼é½å°å¯¼è´é¡µä½¿ç¨ https åè®®è·å¾æå¡ï¼è¿æ ·ä¼äº§çä¸å¿ è¦çæ§è½å¼éãè¦é¿å è¿ç§ç°è±¡ï¼å½ä»ä¸ä¸ª HTTPS 页éå®åå°ä¸ä¸ª HTTP 页æ¶ï¼ä½¿ç¨ç»å¯¹é¾æ¥ä¾å¦âhttp://servername/appname/publicpage.aspxâã
类似å°ï¼å½æ¨ä»ç«ç¹çå ¬å¼åºåéå®åå°å®å ¨ç页ï¼ä¾å¦ï¼ç»å½é¡µï¼æ¶ï¼å¿ 须使ç¨ç»å¯¹ HTTPS è·¯å¾ï¼ä¾å¦âhttps://servername/appname/secure/login.aspxâï¼è䏿¯ç¸å¯¹è·¯å¾ï¼ä¾å¦ restricted/login.aspxãä¾å¦ï¼å¦ææ¨ç Web 页æä¾ç»å½æé®ï¼å使ç¨ä»¥ä¸ä»£ç éå®åå°å®å ¨çç»å½é¡µã
private void btnLogon_Click( object sender, System.EventArgs e )
{
// Form an absolute path using the server name and v-dir name
string serverName =
HttpUtility.UrlEncode(Request.ServerVariables["SERVER_NAME"]);
string vdirName = Request.ApplicationPath;
Response.Redirect("https://" + serverName + vdirName +
"/Restricted/Login.aspx");
}
使ç¨å®å
¨çåæ®ç®¡ç æ è¯æ¬ºéªæ¯åºç¨ç¨åºæå¸¸è§çä¸èº«ä»½éªè¯ç¸å ³çå¨èä¹ä¸ã卿»å»è ä¼ªè£ æå¦ä¸ä¸ªç¨æ·è·åäºå¯¹åºç¨ç¨åºçè®¿é®æéæ¶å°±ä¼åçæ è¯æ¬ºéªãå®ç°çæ¹æ³ä¹ä¸æ¯å«æä¼è¯ cookieï¼ä½æ¯å¦ææ¨å·²ç»å¦åæè¿°ä¿æ¤äºèº«ä»½éªè¯ cookieï¼é£é©å°æ¾èåå°ãæ¤å¤ï¼å¿ é¡»æå»ºå®å ¨çåæ®ç®¡çåå®å ¨çç¨æ·åå¨åºï¼ä»¥åå°éè¿å¼ºåå¯ç æ»å»ãåå ¸æ»å»å SQL æ³¨å ¥æ»å»å¸¦æ¥çé£é©ã
以䏿¨èå®è·µæå©äºåå°é£é©ï¼
⢠| 对å¯ç 使ç¨å忣å ã |
⢠| 使ç¨ååºçå¯ç ã |
⢠| 鲿¢ SQL æ³¨å ¥ ã |
对å¯ç 使ç¨å忣å
妿æ¨çç¨æ·åå¨åºæ¯ SQL Serverï¼åºè¯¥åå¨å¸¦æéå éæº salt å¼çååå¯ç æè¦ï¼æ£åå¼ï¼ãéå ç salt å¼è½å¤åå°å¼ºåå¯ç ç ´è§£ä¼å¾ï¼ä¾å¦åå ¸æ»å»ï¼çé£é©ãèæè¦æ¹æ³åæå³çæ¨æ°¸è¿é½æ éçæ£å°åå¨å¯ç ãç¸åä»ç¨æ·é£éæ£ç´¢å¯ç ï¼ç¶åéè¿éæ°è®¡ç®æè¦å¹¶å°å ¶ä¸æåå¨ç弿¯è¾ï¼å¯¹å ¶è¿è¡éªè¯ã
使ç¨ååºçå¯ç ä½¿ç¨æ£å表达å¼ç¡®ä¿ç¨æ·å¯ç éµå®ååºå¯ç çååã以䏿£å表达å¼å¯ä»¥ç¨äºç¡®ä¿å¯ç é¿åº¦ä½äº 8 个å 10 个å符ä¹é´ï¼èä¸å å«å¤§å忝ãå°ååæ¯ãæ°ååç¹æ®å符çç»åãè¿å°è¿ä¸æ¥åå°åå ¸æ»å»çé£é©ã
private bool IsStrongPassword( string password )
{
return Regex.IsMatch(password, @"^(?=.*/d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$");
}
鲿¢ SQL 注å
¥ çªä½èº«ä»½éªè¯å°¤å ¶å®¹æåºç°ä¼å¯¼è´ SQL æ³¨å ¥æ»å»çæ¼æ´ï¼å 为å®ä½¿ç¨ç¨æ·æä¾çç»å½åæ®æ¥è¯¢æ°æ®åºãè¦åå°è¿ç§é£é©ï¼
⢠| å½»åºéªè¯ææä¾çåæ®ãä½¿ç¨æ£å表达å¼ç¡®ä¿åæ®ä¸ä¸å æ¬ SQL å符ã |
⢠| 使ç¨åæ°ååå¨è¿ç¨è®¿é®ç¨æ·åå¨åºæ°æ®åºã |
⢠| 使ç¨åéåæä½ç¹æçæ°æ®åºç»å½ã |
æå ³é²æ¢ SQL æ³¨å ¥çæ´å¤ä¿¡æ¯ï¼è¯·åé âæå»ºå®å ¨çæ°æ®è®¿é®âåå ã
è¿å页é¦
ææ
æ¨å¯ä»¥ä½¿ç¨ææä»¥æ§å¶å¯¹ç®å½ãåç¬ç Web 页ãé¡µç±»åæ¹æ³ç访é®ãå¦æå¿ è¦ï¼æ¨è¿å¯ä»¥å¨æ¹æ³ä»£ç ä¸å æ¬ææé»è¾ãå¨ Web é¡µåæ§ä»¶ä¸æå»ºæææ¶ï¼èè以䏿¨èå®è·µï¼
⢠| 对页åç®å½è®¿é®æ§ä»¶ä½¿ç¨ URL ææ ã |
⢠| 对 Windows身份éªè¯ä½¿ç¨æä»¶ææ ã |
⢠| å¨ç±»åæ¹æ³ä¸ä½¿ç¨ä¸»ä½è¦æ± ã |
⢠| ä½¿ç¨æ¾å¼è§è²æ£æ¥è¿è¡ç»è´çææ ã |
对äºé¡µçº§åç®å½çº§çè®¿é®æ§å¶ï¼ä½¿ç¨ URL ææï¼è¿æ¯éè¿ <
authorization> å ç´ é ç½®çãè¦éå¶å¯¹ç¹å®æä»¶æè ç®å½ç访é®ï¼å° <
authorization> å ç´ ç½®äº <
location> å ç´ ä¸ã
æå ³æ´å¤ä¿¡æ¯ï¼è¯·åé âä¿æ¤ ASP.NET åºç¨ç¨åºçå®å ¨âåå ä¸çâææâé¨åã
对 Windows身份éªè¯ä½¿ç¨æä»¶ææå¦æ ASP.NET 为 Windows身份éªè¯è¿è¡äºé ç½®ï¼
FileAuthorizationModuleå°ä¸º ASP.NET æä»¶ç±»åæ£æ¥ææè¯·æ±ãè¿å æ¬ ASP.NET 页æä»¶ (.aspx)ãç¨æ·æ§ä»¶ (.ascx) åéè¿ IIS æ å°å° ASP.NET ISAPI çéå¨çä»»ä½å ¶ä»æä»¶ç±»åã
è¦é ç½®
FileAuthorizationModuleï¼åºè¯¥å¨ ASP.NET æä»¶ä¸è®¾ç½®åéç Windows è®¿é®æ§å¶å表 (ACL)ã
å¨ç±»åæ¹æ³ä¸ä½¿ç¨ä¸»ä½è¦æ±ä¸»ä½æéè¦æ±ä½¿æ¨è½å¤æ ¹æ®æ è¯åè°ç¨æ¹çè§è²æåèµæ ¼è¿è¡ææå³çãè°ç¨æ¹çæ è¯åè§è²æåèµæ ¼æ¯éè¿ä¸å½å Web 请æ±ï¼éè¿
HttpContext.User访é®ï¼ç¸å ³ç主ä½å¯¹è±¡ç»´æ¤çãå¯ä»¥ä½¿ç¨å£°ææ§å®å ¨å±æ§æä¾å¯¹ç±»åæ¹æ³çè®¿é®æ§å¶ï¼å¦ä¸æç¤ºï¼
// Declarative syntax
[PrincipalPermission(SecurityAction.Demand,
[email protected]"DomainName/WindowsGroup")]
public void SomeRestrictedMethod()
{
}
ä½¿ç¨æ¾å¼è§è²æ£æ¥è¿è¡ç»è´çææ å£°ææ§å®å ¨æ£æ¥è½å¤é²æ¢ç¨æ·è®¿é®ç±»æè è°ç¨ç¹å®æ¹æ³ã妿æ¨éè¦å¨æ¹æ³ä¸ææ´å¤é»è¾è¿è¡ææå³çï¼å¯ä»¥ä½¿ç¨å½ä»¤æ§ä¸»ä½æéè¦æ±æè 使ç¨
IPrincipal.IsInRoleçæ¾å¼è§è²æ£æ¥ãè¿äºæ¹æ³ä½¿æ¨è½å¤ä½¿ç¨æ´å¤è¿è¡æ¶åéç²¾ç»è°æ´ææå³çã以ä¸ç¤ºä¾è¯´æäºå¦ä½ä½¿ç¨å½ä»¤æ§ä¸»ä½æéè¦æ±ï¼
// Imperative syntax
public void SomeRestrictedMethod()
{
// Only callers that are members of the specified Windows group
// are allowed access
PrincipalPermission permCheck = new PrincipalPermission(
null, @"DomainName/WindowsGroup");
permCheck.Demand();
// Some restricted operations (omitted)
}
以ä¸ç¤ºä¾è¯´æäºå¦ä½ä½¿ç¨
IPrincipal.IsInRoleï¼
public void TransferMoney( string fromAccount,
string toAccount, double amount)
{
// Extract the authenticated user from the current HTTP context.
// The User variable is equivalent to HttpContext.Current.User if you
// are using an .aspx page (or .asmx)
WindowsPrincipal authenticatedUser = User as WindowsPrincipal;
if (null != authenticatedUser)
{
// Note: To retrieve the authenticated user's username, use the
// following line of code
// string username = authenticatedUser.Identity.Name;
// If the amount exceeds a threshold value, manager approval is required
if (amount > thresholdValue) {
// Perform a role check
if (authenticatedUser.IsInRole(@"DomainName/Manager") )
{
// OK to proceed with transfer
}
else
{
throw new Exception("Unauthorized funds transfer");
}
}
else
{
. . .
}
}
}
å¯è½è¿ææ¹æ³å 许è°ç¨æ¹æ¥èªå ç§ä¸åè§è²ã使¯ï¼å¯è½éè¦ç»§èè°ç¨ä¸åæ¹æ³ï¼è¿æ¯ä¸å¯è½éè¿å£°ææ§å®å ¨å®ç°çã
è¿å页é¦
模æ
é»è®¤æ¶ï¼ASP.NET åºç¨ç¨åºé常åºäºè®¾è®¡ãå®ç°åå¯ä¼¸ç¼©æ§çåå ï¼å¹¶ä¸æ¨¡æåå§è°ç¨æ¹ãä¾å¦ï¼æ¨¡æä¼é²æ¢ä½¿ç¨ææçä¸é´å±è¿æ¥æ± ï¼è¿ä¼å¯¹åºç¨ç¨åºå¯ä¼¸ç¼©æ§äº§ç严éå½±åã
å¨ä¸äºåºæ¯ä¸ï¼å¯è½è¦æ±æ¨¡æï¼ä¾å¦ï¼å¦ææ¨è¦æ±éç¨æ¿ä»£æ è¯ï¼éè¿ç¨æ è¯ï¼è¿è¡èµæºè®¿é®ï¼ãå¨å¯å®¿ç¯å¢ä¸ï¼ç»å¸¸ä½¿ç¨å¤ä¸ªå¿åæ è¯ä½ä¸ºåºç¨ç¨åºé离çä¸ç§å½¢å¼ãä¾å¦ï¼å¦ææ¨çåºç¨ç¨åºä½¿ç¨çªä½æè Passport 身份éªè¯ï¼å¯ä»¥æ¨¡æéè¿ IIS ä¸åºç¨ç¨åºçèæç®å½ç¸å ³çå¿å Internet ç¨æ·å¸æ·ã
æ¨å¯ä»¥æ¨¡æåå§è°ç¨æ¹ï¼å®å¯è½æ¯å¿å Internet ç¨æ·å¸æ·æè åºå®æ è¯ãè¦æ¨¡æåå§è°ç¨æ¹ï¼IIS 已身份éªè¯çæ è¯ï¼ï¼ä½¿ç¨ä»¥ä¸é ç½®ï¼
<identity impersonate="true" />
è¦æ¨¡æåºå®æ è¯ï¼ä½¿ç¨ <
identity> å ç´ çéå
userNameå
password屿§ï¼ä½æ¯ä¸å®è¦ä½¿ç¨ Aspnet_setreg.exe 卿³¨å表ä¸åå¨å å¯åæ®ãæå ³å¨é ç½®æä»¶ä¸å å¯åæ®å Aspnet_setreg.exe çæ´å¤ä¿¡æ¯ï¼è¯·åé âä¿æ¤ ASP.NET åºç¨ç¨åºçå®å ¨âåå ã
使ç¨ç¼ç¨æ¨¡æå¦ææ¨ä¸æ³å¯¹æ´ä¸ªè¯·æ±æ¨¡æä¸ä¸ªå¸æ·ï¼å¯ä»¥ä½¿ç¨ç¼ç¨æ¨¡ææ¥æ¨¡æé¨å请æ±ãä¾å¦ï¼éè¦ä½¿ç¨ ASP.NET è¿ç¨å¸æ·è®¿é®åºç¨ç¨åºç主è¦èµæºä»¥å䏿¸¸æ°æ®åºï¼ä½æ¯è¿éè¦è®¿é®å¦ä¸ä¸ªèµæºï¼ä¾å¦å¦ä¸ä¸ªè¿ç¨æ°æ®åºæè è¿ç¨æä»¶å ±äº«ï¼ï¼éè¦ä½¿ç¨å¦ä¸ä¸ªæ è¯ã
è¦å®ç°è¿ä¸ç¹ï¼ä½¿ç¨ IIS å°å¿åç¨æ·å¸æ·é 置为å¯ä¿¡çæ¿ä»£æ è¯ãç¶å使ç¨ä»¥ä¸ä»£ç åªå¨æ§è¡è¿ç¨èµæºè®¿é®ä»£ç æ¶ä½¿ç¨å¿å叿·åå»ºæ¨¡ææ è®°ï¼
HttpContext context = HttpContext.Current;
// Get the service provider from the context
IServiceProvider iServiceProvider = context as IServiceProvider;
//Get a Type which represents an HttpContext
Type httpWorkerRequestType = typeof(HttpWorkerRequest);
// Get the HttpWorkerRequest service from the service provider
// NOTE: When trying to get a HttpWorkerRequest type from the HttpContext
// unmanaged code permission is demanded.
HttpWorkerRequest httpWorkerRequest =
iServiceProvider.GetService(httpWorkerRequestType) as HttpWorkerRequest;
// Get the token passed by IIS
IntPtr ptrUserToken = httpWorkerRequest.GetUserToken();
// Create a WindowsIdentity from the token
WindowsIdentity winIdentity = new WindowsIdentity(ptrUserToken);
// Impersonate the user
Response.Write("Before impersonation: " +
WindowsIdentity.GetCurrent().Name + "");
WindowsImpersonationContext impContext = winIdentity.Impersonate();
Response.Write("Impersonating: " + WindowsIdentity.GetCurrent().Name + "");
// Place resource access code here
// Stop impersonating
impContext.Undo();
Response.Write( "After Impersonating: " +
WindowsIdentity.GetCurrent().Name + "");
注 è¿ç§æ¹å¼å°ä½¿ç¨çªä½æè Passport 身份éªè¯ï¼è¿éæ¨çåºç¨ç¨åºçèæç®å½å¨ IIS ä¸é ç½®ä¸ºæ¯æå¿å访é®ã
妿æ¨ä½¿ç¨è¿ä¸ªä»£ç ï¼éè¦ä½¿ç¨ä»¥ä¸ <
identity> é ç½®ï¼
<identity impersonate="false" />
注 代ç è¦æ±éæç®¡ä»£ç æé
SecurityPermission(SecurityPermissionFlag.UnmanagedCode)ï¼è¿ç§æéåªæäºå®å ¨å¯ä¿¡ç Web åºç¨ç¨åºã
è¿å页é¦
æææ°æ®
æææ°æ®å æ¬åºç¨ç¨åºçé 置详ç»ä¿¡æ¯ï¼ä¾å¦ï¼è¿æ¥å符串åæå¡å¸æ·åæ®ï¼åç¹å®äºåºç¨ç¨åºçæ°æ®ï¼ä¾å¦ï¼ç¨æ·çä¿¡ç¨å¡å·ç ï¼ã以䏿¨èå®è·µæå©äºåå°å¤çæææ°æ®æ¶çé£é©ï¼
⢠| ä¸è¦ä»é¡µå°é¡µä¼ éæææ°æ® ã |
⢠| é¿å å¨é ç½®æä»¶ä¸åºç°ææå¯ç ã |
⢠| ä½¿ç¨ DPAPI é¿å è¿è¡å¯é¥ç®¡ç ã |
⢠| å ³éæææ°æ®çè¾åºç¼å ã |
åºè¯¥é¿å 使ç¨ä»»ä½å®¢æ·ç«¯ç¶æç®¡çé项ï¼ä¾å¦æ¥çç¶æãcookieãæ¥è¯¢å符串æè éèçªä½å段åéï¼æ¥åå¨æææ°æ®ãæ°æ®å¯è½è¢«ç¯¡æ¹åä»¥æææ¥çãä½¿ç¨æå¡å¨ç«¯ç¶æç®¡çé项ï¼ä¾å¦ SQL Server æ°æ®åºï¼è¿è¡å®å ¨çæ°æ®äº¤æ¢ã
é¿å å¨é ç½®æä»¶ä¸åºç°ææå¯ç å¨ Machine.config å Web.config ä¸ç <
processModel>ã<
sessionState> å <
identity> å ç´ æ
userNameå
password屿§ãä¸è¦ä»¥ææåå¨è¿äºä¿¡æ¯ã卿³¨å表ä¸ä½¿ç¨ Aspnet_setreg.exe å·¥å ·åå¨å å¯åæ®ã
æå ³é ç½®æä»¶ä¸å å¯åæ®å Aspnet_setreg.exe çæ´å¤ä¿¡æ¯ï¼è¯·åé âä¿æ¤ ASP.NET åºç¨ç¨åºå Web æå¡çå®å ¨âåå ã
ä½¿ç¨ DPAPI é¿å è¿è¡å¯é¥ç®¡çDPAPI ç¨äºå 坿ºå¯ï¼ä¾å¦è¿æ¥å符串åæå¡å¸æ·åæ®ï¼æ¯éå¸¸çæ³çã妿æ¨ç页éè¦ä½¿ç¨è¿ç§ç±»åçé ç½®æ°æ®ï¼ä½¿ç¨ DPAPIï¼å¯ä»¥é¿å å¤çå¯é¥ç®¡çé®é¢ã
æå ³æ´å¤ä¿¡æ¯ï¼è¯·åé âæå»ºå®å ¨çç¨åºéâåå ä¸çâå 坿æ¯âã
å ³éæææ°æ®çè¾åºç¼å妿æ¨ç页å 嫿æçæ°æ®ï¼ä¾å¦å¯ç ãä¿¡ç¨å¡å·ç æè 叿·ç¶æï¼åä¸åºè¯¥ç¼å页ãè¦å ³é对ç¹å®é¡µçç¼åï¼ä½¿ç¨ä»¥ä¸é¡µçº§å±æ§ï¼
<%@ Page OutputCache Duration="0" Location="None" VaryByParam="None" %>
è¿å页é¦
ä¼è¯ç®¡ç
è¦æä¾å®å ¨çä¼è¯ç®¡çï¼æä¸¤ä¸ªä¸»è¦å ç´ éè¦èèãé¦å ï¼ç¡®ä¿ä¼è¯æ è®°æ æ³è¢«ç¨äºè·å对æ§è¡å®å ¨æä½çææé¡µçè®¿é®æéï¼æè ç¨äºè·åå¯¹æææ°æ®é¡¹çè®¿é®æéãå ¶æ¬¡ï¼å¦æä¼è¯æ°æ®å 嫿æç项ï¼å¿ é¡»ä¿æ¤ä¼è¯æ°æ®ï¼å æ¬ä¼è¯åå¨åºã
以ä¸ä¸¤ä¸ªç±»åçæ è®°æ¯ä¸ä¼è¯ç®¡çç¸å ³çï¼
⢠| ä¼è¯æ è®° ãè¿ä¸ªæ è®°æ¯ ASP.NET èªå¨çæçï¼å¦æå¯ç¨ä¼è¯ç¶æï¼ä¾å¦ï¼éè¿å° < sessionState > å ç´ ç mode 屿§è®¾ç½®ä¸º InProc ã SQLServer æè StateServer ã æ³¨ æ¨å¯ä»¥æ¹å < sessionState > é ç½®å¹¶ä½¿ç¨ @Page æ è®°ç EnableSessionState 屿§é页ç¦ç¨æè å¯ç¨ä¼è¯ç¶æã |
⢠| 身份éªè¯æ è®° ãè¿æ¯ç±èº«ä»½éªè¯æºå¶ä¾å¦çªä½èº«ä»½éªè¯çæçï¼ç®çæ¯è·è¸ªå·²èº«ä»½éªè¯çç¨æ·çä¼è¯ãæäºææç身份éªè¯æ è®°ï¼ç¨æ·å°±è½å¤è·å¾å¯¹ Web ç«ç¹åéé¨åçè®¿é®æéã |
以䏿¨èå®è·µæå©äºæå»ºå®å ¨çä¼è¯ç®¡çï¼
⢠| è¦æ±å¯¹ææé¡µè¿è¡èº«ä»½éªè¯ ã |
⢠| ä¸è¦ä¾èµå®¢æ·ç«¯ç¶æç®¡çé项 ã |
⢠| ä¸è¦æ··åä¼è¯æ è®°å身份éªè¯æ è®° ã |
⢠| ææå°ä½¿ç¨ SSL ã |
⢠| ä¿æ¤ä¼è¯æ°æ® ã |
ä¸å®è¦å¨å è®¸ç¨æ·è®¿é®ç«ç¹çææååéé¨åä¹åå¯¹å ¶è¿è¡èº«ä»½éªè¯ã妿æ¨ä½¿ç¨å®å ¨ç身份éªè¯å¹¶ç¨ SSL ä¿æ¤èº«ä»½éªè¯æ è®°ï¼åç¨æ·çä¼è¯å°æ¯å®å ¨çï¼å 为æ»å»è æ æ³å«æåéæ¾ä¼è¯æ è®°ãæ»å»è å°éè¦èº«ä»½éªè¯æ 记以éè¿æææ£æ¥ã
æå ³å¦ä½ä¸ºçªä½èº«ä»½éªè¯ä¿æ¤èº«ä»½éªè¯æ è®°çæ´å¤ä¿¡æ¯ï¼è¯·åé æ¬åå åé¢çâçªä½èº«ä»½éªè¯âã
ä¸è¦ä¾èµå®¢æ·ç«¯ç¶æç®¡çé项ä¸è¦ä½¿ç¨ä»»ä½å®¢æ·ç«¯ç¶æç®¡çé项ï¼ä¾å¦æ¥çç¶æãcookieãæ¥è¯¢å符串æè éèçªä½åæ®µï¼æ¥åå¨æææ°æ®ãè¿æ ·ä¿¡æ¯å¯è½è¢«ç¯¡æ¹æè ä»¥æææ¥çãä½¿ç¨æå¡å¨ç«¯ç¶æç®¡çé项ï¼ä¾å¦æ°æ®åºï¼æ¥åå¨æææ°æ®ã
ä¸è¦æ··åä¼è¯æ è®°å身份éªè¯æ è®°å®å ¨çä¼è¯ç®¡çè¦æ±ä¸è½æ··å两ç§ç±»åçæ è®°ãé¦å ï¼ä¿æ¤èº«ä»½éªè¯æ è®°ï¼ä»¥ç¡®ä¿æ»å»è æ æ³æè·å®å¹¶ä½¿ç¨å®è·å访é®åºç¨ç¨åºåéåºåçæéãå ¶æ¬¡ï¼è¿æ ·æå»ºæ¨çåºç¨ç¨åºï¼ä½¿å¾åç¬ä½¿ç¨ä¼è¯æ è®°æ æ³ç¨äºè·å对ææé¡µæè æ°æ®çè®¿é®æéãä¼è¯æ è®°åºè¯¥ä» ç¨äºä¸ªæ§åç®çæè å¨å¤ä¸ª HTTP 请æ±ä¸ç»´æ¤ç¨æ·ç¶æãå¦ææ²¡æèº«ä»½éªè¯ï¼å°±ä¸è¦ç»´æ¤ç¨æ·ç¶æçææé¡¹ã
ææå°ä½¿ç¨ SSL妿æ¨çç«ç¹æ¢æå®å ¨åºååæå ¬å¼è®¿é®åºåï¼å¿ é¡»ç¨ SSL ä¿æ¤å®å ¨ç身份éªè¯åºåãå½ç¨æ·å¨å®å ¨åºååå ¬å¼åºåæ¥åç§»å¨çæ¶åï¼ASP.NET çæçä¼è¯ cookieï¼æè URLï¼å¦ææ¨å¯ç¨äºæ cookie ä¼è¯ç¶æï¼å°ä»¥ææå½¢å¼éä¹ç§»å¨ï¼ä½æ¯åªè¦è®¾ç½®äº
Securecookie 屿§ï¼èº«ä»½éªè¯ cookie åä¸ä¼éè¿æªå å¯ç HTTP è¿æ¥ä¼ éã
注æ¨å¯ä»¥éè¿è®¾ç½®
<
forms> å ç´ ç
requireSSL="true"ï¼ä¸ºçªä½èº«ä»½éªè¯ cookie 设置
Secure屿§ã
æ»å»è è½å¤è·åéè¿æªå å¯ç HTTP ä¼è¯ä¼ éçä¼è¯ cookieï¼ä½æ¯å¦ææ£ç¡®è®¾è®¡äºç«ç¹ï¼å°åé页åèµæºç½®äºä¸åçå®å ¨ç®å½ä¸ï¼åæ»å»è åªè½ä½¿ç¨å®è®¿é®ä¸å®å ¨çå ¬å¼è®¿é®é¡µãå¨è¿ç§æ åµä¸ï¼å¹¶æ²¡æä»ä¹å®å ¨å¨èï¼å 为è¿äºé¡µä¸æ§è¡ææçæä½ã䏿¦æ»å»è è¯å¾éæ¾ä¼è¯æ è®°å°åä¿æ¤é¡µï¼å 为没æèº«ä»½éªè¯æ è®°ï¼æ»å»è å°è¢«éå®åå°åºç¨ç¨åºçç»å½é¡µã
æå ³ä½¿ç¨
Securecookie 屿§åå¦ä½æå»ºå®å ¨ççªä½èº«ä»½éªè¯è§£å³æ¹æ¡çæ´å¤ä¿¡æ¯ï¼è¯·åé æ¬åå åé¢çâçªä½èº«ä»½éªè¯âã
ä¿æ¤ä¼è¯æ°æ®çå®å ¨å¦ææå¡å¨ä¸çä¼è¯æ°æ®å 嫿æé¡¹ï¼åæ°æ®ååå¨åºé½éè¦ä¿æ¤èµ·æ¥ãASP.NET æ¯æå ç§ä¼è¯ç¶ææ¨¡å¼ãæå ³å¦ä½ä¿æ¤ ASP.NET ä¼è¯ç¶æçä¿¡æ¯ï¼è¯·åé âä¿æ¤ ASP.NET åºç¨ç¨åºçå®å ¨âåå ä¸çâä¼è¯ç¶æâã
è¿å页é¦
åæ°æä½
åæ°ï¼ä¾å¦çªä½åæ®µãæ¥è¯¢åç¬¦ä¸²ãæ¥çç¶æå cookie ä¸çåæ°ï¼å¯è½è¢«æ»å»è ï¼ä»ä»¬é常ä¼è®¾æ³è·å访é®åé页çæéæè 欺éªåºç¨ç¨åºæ§è¡æªææçæä½ï¼ææä½ã
ä¾å¦ï¼å¦ææ»å»è ç¥éæ¨ä½¿ç¨äºè弱身份éªè¯æ è®°æ¹æ¡ï¼ä¾å¦ cookie ä¸å¯ä»¥çåºçæ°åï¼æ»å»è å°±è½å¤ç¨å¦ä¸ä¸ªæ°åæé cookieï¼å¹¶ä»¥å¦ä¸ä¸ªï¼å¯è½æ¯æç¹æçï¼ç¨æ·èº«ä»½ååºè¯·æ±ã
以䏿¨èå®è·µæå©äºé¿å åæ°æä½æ¼æ´ï¼
⢠| ç¨ MAC ä¿æ¤æ¥çç¶æ ã |
⢠| ä½¿ç¨ Page.ViewStateUserKey 对æå廿»å» ã |
⢠| 卿å¡å¨ä¸ä¿çæææ°æ® ã |
⢠| éªè¯è¾å ¥åæ° ã |
妿æ¨ç Web 页æè æ§ä»¶ä½¿ç¨æ¥çç¶æå¨å¤ä¸ª HTTP 请æ±ä¸ç»´æ¤ç¶æï¼ç¡®ä¿ä½¿ç¨ MAC 对æ¥çç¶æè¿è¡äºå å¯å宿´æ§æ£æ¥ãé»è®¤æ¶ï¼Machine.config ä¸ <
pages> å ç´ ç
enableViewStateMac屿§è½å¤ç¡®ä¿æ¥çç¶æç¨ MAC ä¿æ¤ã
<pages buffer="true" enableSessionState="true"
enableViewState="true" enableViewStateMac="true"
autoEventWireup="true" validateRequest="true"/>
注 @Page æä»¤ä¹æ¯æåé¢ç屿§ï¼è¿ä½¿æ¨è½å¤å¯¹æ¯ä¸ªé¡µèªå®ä¹è®¾ç½®ã
è½ç¶æ¨å¯ä»¥æ¹åæ¯å¦å¯¹æ¯ä¸ªæ§ä»¶ã页æè åºç¨ç¨åºå¯ç¨æ¥çç¶æï¼ä½æ¯åªè¦ä½¿ç¨æ¥çç¶æï¼ä¸å®è¦å°
enableViewStateMac设置为 trueã
Server.Transfer妿æ¨çåºç¨ç¨åºå¦ä¸æç¤ºä½¿ç¨
Server.Transferï¼å¹¶è®¾ç½®å¯éç第äºä¸ª Boolean åæ°ä¸º trueï¼ä»è使
QueryStringå
Forméåè¢«ä¿æ¤èµ·æ¥ï¼åå½ä»¤å°å¤±è´¥ï¼å¦æ
enableViewStateMac设置为 trueï¼ã
Server.Transfer("page2.aspx", true);
妿æ¨å¿½ç¥äºç¬¬äºä¸ªåæ°æè å°å ¶è®¾ç½®ä¸º falseï¼åé误å°ä¸ä¼åçã妿æ¨éè¦ä¿æ¤
QueryStringå
Forméåè䏿¯è®¾ç½®
enableViewStateMac为 falseï¼è¯·éµå¾ª Microsoft ç¥è¯åºæç« 316920ï¼âPRB:View State Is Invalid" Error Message When You Use Server.Transferâä¸è®¨è®ºçè§£å³æ¹æ³ã
æå ³ä¸ºæ¥çç¶æå å¯å宿´æ§æ£æ¥é ç½® <
machineKey> å ç´ çä¿¡æ¯ï¼è¯·åé âä¿æ¤ ASP.NET åºç¨ç¨åºçå®å ¨âåå ã
ä½¿ç¨ Page.ViewStateUserKey 对æå廿»å»å¦ææ¨å¯¹è°ç¨æ¹è¿è¡èº«ä»½éªè¯ï¼å¹¶ä½¿ç¨æ¥çç¶æï¼åå¨
Page_Initäºä»¶å¤çç¨åºä¸è®¾ç½®
Page.ViewStateUserKey屿§ï¼ä»¥é²æ¢å廿»å»ã卿»å»è ç¨æ¥çç¶æå建äºé¢å¡«å ç Web 页ï¼.htm æè .aspxï¼æ¶å°ä¼åçå廿»å»ãæ¥çç¶æå¯ä»¥ä»æ»å»è å·²ç»å建ç页ï¼ä¾å¦å¸¦æ 100 项çè´ç©è½¦é¡µï¼çæãæ»å»è ä¼å¼è¯±æ²¡æäº§çæççç¨æ·æµè§å°è¯¥é¡µï¼ç¶å使页åéå°æå¡å¨ï¼å ¶ä¸æ¥çç¶ææ¯ææçãæå¡å¨æ²¡æåæ³ç¥éæ¥çç¶ææ¯å¦ç±æ»å»è åèµ·ãæ¥çç¶æéªè¯å MAC æ æ³å¯¹æè¿ç§æ»å»ï¼å 为æ¥çç¶ææ¯ææçï¼è页æ¯å¨ç¨æ·çå®å ¨ä¸ä¸æä¸æ§è¡çã
éå½å°
Page.ViewStateUserKey屿§è®¾ç½®ä¸ºå¯ä¸å¼ï¼å¯ä»¥ä½ä¸ºå¯¹ä»å廿»å»ç对çãæ¤å¼åºè¯¥å¯¹äºæ¯ä¸ªç¨æ·é½æ¯å¯ä¸çï¼èä¸é常æ¯ç¨æ·åç§°æè æ è¯ç¬¦ã彿»å»è å建æ¥çç¶ææ¶ï¼
ViewStateUserKey屿§å°è¢«åå§åä¸ºä»æè 她çåç§°ãå½ç¨æ·æäº¤é¡µç»æå¡å¨æ¶ï¼å®æ¯ç¨æ»å»è çåç§°åå§åçãå æ¤ï¼æ¥çç¶æ MAC æ£æ¥å°å¤±è´¥ï¼å¹¶çæä¸ä¸ªå¼å¸¸æ å½¢ã
注è¿ç§æ»å»é常对äºå¿åæµè§ç页ï¼å ¶ä¸æ²¡æç¨æ·åç§°ï¼ä¸æé®é¢ï¼å 为è¿ç§ç±»åç页åºè¯¥ä¸ä¼è¿è¡ææçäºå¡ã
卿å¡å¨ä¸ä¿çæææ°æ®ä¸è¦ä¿¡ä»»è¾å ¥åæ°ï¼å°¤å ¶æ¯å®ä»¬è¦ç¨äºå¨æå¡å¨ä¸è¿è¡å®å ¨å³ççæ¶åãåæ ·ï¼ä»»ä½å½¢å¼çæææ°æ®é½ä¸è¦ä½¿ç¨ææåæ°ãç¸åï¼å°æå¡å¨ä¸çæææ°æ®åå¨å¨ä¼è¯åå¨åºä¸ï¼ä½¿ç¨ä¼è¯æ è®°å¼ç¨åå¨åºä¸ç项ãç¡®ä¿ç¨æ·å·²ç»å®å ¨å°è¿è¡äºèº«ä»½éªè¯ï¼è䏿£ç¡®ä¿æ¤äºèº«ä»½éªè¯æ è®°ãæå ³æ´å¤ä¿¡æ¯ï¼è¯·åé æ¬åå åé¢çâä¼è¯ç®¡çâã
éªè¯è¾å ¥åæ°éªè¯æ¥èªçªä½åæ®µãæ¥è¯¢å符串ãcookie å HTTP å¤´çææè¾å ¥åæ°ã
System.Text.RegularExpressions.Regexç±»å¯ä»¥è¾ å©å¯¹è¾å ¥åæ°çéªè¯ãä¾å¦ï¼ä»¥ä¸ä»£ç 说æäºå¦ä½ä½¿ç¨è¿ä¸ªç±»éªè¯éè¿æ¥è¯¢åç¬¦ä¸²åæ°ä¼ éçåç§°ãå䏿æ¯å¯ä»¥ç¨äºéªè¯å ¶ä»å½¢å¼çè¾å ¥åæ°ï¼ä¾å¦æ¥èª cookie æè çªä½å段çåæ°ãä¾å¦ï¼è¦éªè¯ cookie åæ°ï¼å¯ä»¥ä½¿ç¨
Request.Cookies代æ¿
Request.QueryStringã
using System.Text.RegularExpressions;
. . .
private void Page_Load(object sender, System.EventArgs e)
{
// Name must contain between 1 and 40 alphanumeric characters
// together with (optionally) special characters '`̫̉ for names such
// as D'Angelo
if (!Regex.IsMatch(Request.QueryString["name"],
@"^[/p{L}/p{Zs}/p{Lu}/p{Ll}]{1,40}$"))
throw new Exception("Invalid name parameter");
// Use individual regular expressions to validate all other
// query string parameters
. . .
}
æå ³ä½¿ç¨æ£å表达å¼åå¦ä½éªè¯è¾å ¥æ°æ®çæ´å¤ä¿¡æ¯ï¼è¯·åé æ¬åå åé¢çâè¾å ¥éªè¯âã
è¿å页é¦
å¼å¸¸ç®¡ç
Web é¡µçæ£ç¡®å¼å¸¸å¤çè½å¤é²æ¢ææçå¼å¸¸è¯¦ç»ä¿¡æ¯æ´é²ç»ç¨æ·ã以䏿¨èå®è·µéç¨äº ASP.NET Web 页忧件ã
⢠| è¿åä¸è¬æ§é误页ç»å®¢æ·ç«¯ ã |
⢠| å®ç°é¡µçº§æè åºç¨ç¨åºçº§é误å¤çç¨åº ã |
æå ³å¼å¸¸ç®¡ççæ´å¤ä¿¡æ¯ï¼è¯·åé åå âæå»ºå®å ¨çç¨åºéâã
è¿åä¸è¬æ§é误页å°å®¢æ·ç«¯å¦æåºç°æªå¤ççå¼å¸¸ï¼ä¹å°±æ¯è¦ä¼ æå°åºç¨ç¨åºè¾¹ççå¼å¸¸ï¼åºè¯¥è¿åä¸è¬æ§é误页ç»ç¨æ·ãè¦å®ç°è¿ä¸ç¹ï¼é ç½® <
customErrors> å ç´ ï¼å¦ä¸æç¤ºï¼
<customErrors mode="On" defaultRedirect="YourErrorPage.htm" />
é误页åºè¯¥å æ¬ä¸ä¸ªåéçä¸è¬æ§éè¯¯æ¶æ¯ï¼å¯è½æéå çä¸äºæ¯æè¯¦ç»ä¿¡æ¯ãçæé误ç页åç§°éè¿
aspxerrorpathæ¥è¯¢åæ°ä¼ éç»é误页ã
æ¨è¿å¯ä»¥ä¸ºä¸åç±»åçé误使ç¨å¤ä¸ªé误页ãä¾å¦ï¼
<customErrors mode="On" defaultRedirect="YourErrorPage.htm">
<error statusCode="404" redirect="YourNotFoundPage.htm"/>
<error statusCode="500" redirect="YourInternalErrorPage.htm"/>
</customErrors>
对äºåç¬çé¡µï¼æ¨å¯ä»¥ä½¿ç¨ä»¥ä¸é¡µçº§å±æ§æä¾ä¸ä¸ªé误页ï¼
<% @ Page ErrorPage="YourErrorPage" %>
å®ç°é¡µçº§æè
åºç¨ç¨åºçº§é误å¤çç¨åº 妿æ¨éè¦å¨é¡µçº§æè·åå¤çæªå¤ççå¼å¸¸ï¼ä¸º
Page_Erroräºä»¶å建å¤çç¨åºï¼ç±»ä¼¼äºä»¥ä¸ä»£ç æç¤ºã
public void Page_Error(object sender,EventArgs e)
{
// Get the source exception details
Exception ex = Server.GetLastError();
// Write the details to the event log for diagnostics
. . .
// Prevent the exception from propagating and generating an
// application level event (Application.Error)
Server.ClearError();
}
妿å¼å¸¸å 许ä»é¡µçå¤çç¨åºä¼ æï¼ææ²¡æé¡µå¤çç¨åºï¼åå°å¼åä¸ä¸ªåºç¨ç¨åºé误äºä»¶ãè¦æè·åºç¨ç¨åºçº§äºä»¶ï¼å¨ Global.asax ä¸å®ç°
Application_Errorï¼å¦ä¸æç¤ºï¼
protected void Application_Error(Object sender, EventArgs e)
{
// Write to the event log.
}
è¿å页é¦
å®¡æ ¸åæ¥å¿è®°å½
Web åºç¨ç¨åºçé»è®¤ ASP.NET è¿ç¨æ è¯è½å¤å°æ°çè®°å½åå°äºä»¶æ¥å¿ï¼ä½æ¯å®å¹¶æ²¡æè¶³å¤çæéå建æ°çäºä»¶æºãè¦è§£å³è¿ä¸ªé®é¢ï¼æä¸¤ç§éæ©ãæ¨å¯ä»¥å建ä¸ä¸ªå®è£ ç¨åºç±»ï¼å®å¨å®è£ æ¶æç®¡çåç¹æçæ åµä¸è°ç¨ï¼æè æ¨ä¹å¯ä»¥å¨
EventLog注å表项ä¸é ç½®æéï¼å 许 ASP.NET è¿ç¨æ è¯ï¼æè 模æçæ è¯ï¼å¨è¿è¡æ¶å建äºä»¶æºã æ¨èçæ¯åä¸ç§æ¹æ³ã
è¦å¨å®è£ æ¶å建ä¸ä¸ªåºç¨ç¨åºäºä»¶æº1. | å¨ Visual Studio .NET è§£å³æ¹æ¡èµæºç®¡çå¨çªå£ä¸å³å»é¡¹ç®ï¼æå Add ï¼ç¶ååå» Add Component ã | ||||
2. | 仿¨¡æ¿å表ä¸éæ© Installer Class ï¼å¹¶æä¾åéçç±»æä»¶åã è¿å°å建æ°çå®è£ ç¨åºç±»ï¼ç¨ RunInstaller(true) 屿§æ¹æ³¨ã | ||||
3. | 以设计è§å¾æ¾ç¤ºæ°çå®è£ ç¨åºç±»ï¼æ¾ç¤ºå·¥å ·ç®±ï¼ç¶ååå»å·¥å ·ç®±ä¸ç Components ãå°ä¸ä¸ª EventLogInstaller ç»ä»¶æå¨å°è®¾è®¡å¨å·¥ä½é¢ã 注 妿 EventLogInstaller 没æåºç°å¨å·¥å ·ç®±ä¸ï¼åå³å»å·¥å ·ç®±ï¼ç¶ååå» Add/Remove Items ãç¶åéæ© EventLogInstaller ï¼æ·»å æ¤ç»ä»¶ç±»åã | ||||
4. | è®¾ç½®ä»¥ä¸ EventLogInstaller 屿§ï¼
| ||||
5. | æå»ºé¡¹ç®ï¼ç¶åå¨å®è£ æ¶å建ä¸ä¸ªå®è£ ç¨åºç±»çå®ä¾ã 妿æ¨ä½¿ç¨ .NET å®è£ åé¨ç½²é¡¹ç®å建 Windows å®è£ ç¨åºæä»¶ (.msi)ï¼å®è£ ç¨åºç±»å®ä¾æ¯èªå¨å建åè°ç¨çã妿æ¨ä½¿ç¨ xcopy æè çæçé¨ç½²ï¼ä½¿ç¨ InstallUtil.exe å®ç¨å·¥å ·å建å®è£ ç¨åºç±»çä¸ä¸ªå®ä¾å¹¶æ§è¡å®ã | ||||
6. | è¦ç¡®è®¤æåçæäºäºä»¶æºï¼å¯ä»¥ä½¿ç¨æ³¨å表ç¼è¾å¨ï¼å¯¼èªå°ï¼ 确认åå¨å¯é¥ï¼èä¸å®å
å«ä¸ä¸ªæåé»è®¤ .NET Framework äºä»¶æ¶æ¯æä»¶ç EventMessageFile å符串å¼ï¼ |
妿æ¨å·²ç»æä¸ä¸ªåºç¨ç¨åºï¼ä¸æ³å建å®è£ ç¨åºç±»ï¼åå¿ é¡»æäº ASP.NET è¿ç¨æ è¯æ£ç¡®ç对äºä»¶æ¥å¿æ³¨å表项çè®¿é®æéãæå ³æ³¨å表项详ç»ä¿¡æ¯å精确çå¿ éè®¿é®æéçä¿¡æ¯ï¼è¯·åé âä¿æ¤ ASP.NET åºç¨ç¨åºçå®å ¨âåå ä¸çâäºä»¶æ¥å¿âã
EventLogPermissionåäºä»¶æ¥å¿ç代ç å¿ é¡»éè¿ä»£ç 访é®å®å ¨çç¥è¢«æäº
EventLogPermissionã妿æ¨ç Web åºç¨ç¨åºé 置为å¨é¨å信任级è¿è¡ï¼è¿å°åºç°é®é¢ãæå ³å¦ä½ä»é¨åä¿¡ä»» Web åºç¨ç¨åºåäºä»¶æ¥å¿çä¿¡æ¯ï¼è¯·åé âå¨ ASP.NET ä¸ä½¿ç¨ä»£ç 访é®å®å ¨âåå ã
è¿å页é¦
å°ç»
æ¬åå çå¼å§ä¸¾åºäºæå»º Web 页忧件æ¶éè¦è§£å³ç主è¦å¨èã许å¤åºç¨ç¨åºçº§æ»å»é½ä¾èµè¾å ¥éªè¯ä¸çæ¼æ´ãå¨è¿ä¸ªåºåéè¦ç¹å«å°å¿ï¼ä»¥ç¡®ä¿æ¨çéªè¯çç¥çåçæ§ï¼èä¸å¯¹æææ¥èªéå¯ä¿¡æ¥æºçæ°æ®é½è¿è¡äºæ£ç¡®çéªè¯ãå¦ä¸ä¸ªå¸¸è§çæ¼æ´æ¯æªè½ä¿æ¤èº«ä»½éªè¯ cookieãæ¬åå çâçªä½èº«ä»½éªè¯âé¨å说æäºå¯ä»¥ç¨æ¥é²æ¢æªææè®¿é®ãä¼è¯å«æå cookie éæ¾æ»å»çææå¯¹çã
è¿å页é¦
å ¶ä»èµæº
æå ³æ´å¤ä¿¡æ¯ï¼è¯·åé ä¸åèµæºï¼
⢠| æå ³å»ºç«å®å ¨ç Machine.config å Web.config é ç½®çä¿¡æ¯ï¼è¯·åé âä¿æ¤ ASP.NET åºç¨ç¨åºåWeb æå¡çå®å ¨âåå ã |
⢠| æå ³æå°å½¢å¼çæ ¸å¯¹è¡¨ï¼è¯·åé æ¬æåä¸âæ ¸å¯¹è¡¨âé¨åä¸çâæ ¸å¯¹è¡¨ï¼ä¿æ¤ ASP.NET çå®å ¨âã |
⢠| æå ³ä¿æ¤å¼å人åå·¥ä½ç«çä¿¡æ¯ï¼è¯·åé æ¬æåçâå¦ä½â¦â¦âé¨åä¸âå¦ä½ä¿æ¤å¼å人åå·¥ä½ç«âã |
⢠| æå ³ ASP.NET ä¸èº«ä»½éªè¯åææçæ´å¤ä¿¡æ¯ï¼è¯·åé â Microsoft patterns & practices 第 I å·ï¼æå»ºå®å ¨ç ASP.NET Web åºç¨ç¨åºï¼èº«ä»½éªè¯ãææåå®å ¨é讯âä¸çâ ASP.NET å®å ¨âé¨åï¼ç½åæ¯ï¼ http://msdn.microsoft.com/library/en-us/dnnetsec/html/SecNetch08.aspã |
⢠| æå ³ä½¿ç¨çªä½èº«ä»½éªè¯çæ¼ç»ï¼è¯·åé âå¦ä½ï¼å¨ SQL Server 2000 ä¸ä½¿ç¨çªä½èº«ä»½éªè¯âåâå¦ä½ï¼å¨ Active Directory ä¸ä½¿ç¨çªä½èº«ä»½éªè¯âï¼å¨â Microsoft patterns & practices å· I ï¼æå»ºå®å ¨ç ASP.NET Web åºç¨ç¨åºï¼èº«ä»½éªè¯ãææåå®å ¨é讯âä¸çâå¦ä½â¦â¦âé¨åï¼ç½åæ¯ï¼http://msdn.microsoft.com/library/en-us/dnnetsec/html/SecNetHT00.aspã |
⢠| æå ³ä½¿ç¨æ£å表达å¼çæ´å¤ä¿¡æ¯ï¼è¯·åé Microsoft ç¥è¯åºæç« 308252ï¼âHow To: Match a Pattern by Using Regular Expressions and Visual C# .NETâã |
⢠| æå ³ ASP.NET ä¸ç¨æ·è¾å ¥éªè¯æ´å¤çä¿¡æ¯ï¼è¯·åé MSDN æç« âASP.NET ä¸çç¨æ·è¾å ¥éªè¯âï¼ç½åæ¯ï¼http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/pdc_userinput.aspã |
⢠| æå ³ ä¿æ¤ cookie 屿§å®å ¨çæ´å¤ä¿¡æ¯ï¼è¯·åé RFC2109ï¼å¨ W3C Web ç«ç¹ä¸ï¼ç½åæ¯ï¼http://www.w3.org/Protocols/rfc2109/rfc2109ã |
⢠| æå ³æ¥èª Open Hack ç«èµçå®å ¨æ³¨æäºé¡¹çæ´å¤ä¿¡æ¯ï¼è¯·åé MSDN æç« âæå»ºåé ç½®æ´å®å ¨ç Web ç«ç¹âï¼ç½åæ¯ï¼ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/openhack.aspã |
转å°åè±æé¡µé¢