Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ǰºó¶Ë·ÖÀëµÄ˼¿¼Óëʵ¼ù£¨Ï£©
 
×÷ÕߣºÒ¶Ð¡îÎ À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ 2015-03-12
  3873  次浏览      27
 

ǰºó¶Ë·ÖÀëģʽϵݲȫ½â¾ö·½°¸

ǰÑÔ

ÔÚǰºó¶Ë·ÖÀëµÄ¿ª·¢Ä£Ê½ÖУ¬´Ó¿ª·¢µÄ½ÇÉ«ºÍÖ°ÄÜÉÏÀ´½²£¬Ò»¸ö×îÃ÷ÏԵı仯¾ÍÊÇ£ºÒÔÍù´«Í³ÖУ¬Ö»¸ºÔðä¯ÀÀÆ÷»·¾³Öпª·¢µÄǰ¶Ëͬѧ£¬Ðè񻃾ÁÔµ½·þÎñ¶Ë²ãÃæ£¬±àд·þÎñ¶Ë´úÂë¡£¶ø°ÚÔÚÃæÇ°µÄÒ»¸ö»ù´¡ÐÔÎÊÌâ¾ÍÊÇÈçºÎ±£ÕÏ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">
&lt;/textarea&gt;&lt;script&gt;alert(&quot;hello!&quot;)&lt;/script&gt;
</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));// {"&lt;script&gt;":"&lt;script&gt;"}
var jsonText ="{\"ÄãºÃ\":\"<script>\"}";
console.log(SecurityUtil.escapeJsonForJsVar(jsonText));//{\"\u4f60\u597d\":\"&lt;script&gt;\"}
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 Ó¦Óó¹µ×ÖÐÐÄ»¯ºó£¬ÊÇ·ñ¿ÉÒÔ¿¼·Ö¼¯Èº²¿Êð£¬ÒÔÌá¸ß·þÎñÆ÷ÀûÓÃÂÊ¡£»òÕߣ¬·¢²¼Óë»Ø¹öµÄ·½Ê½ÊÇ·ñÄܸü¼ÓÁé»î¿É¿Ø¡£µÈµÈϸ½Ú£¬¶¼ÖµµÃÔÙ½øÒ»²½Ñо¿¡£

   
3873 ´Îä¯ÀÀ       27

</script>

Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢


Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ


ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢