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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
CSRFµÄ¹¥»÷Óë·ÀÓù
 
×÷ÕߣºÂÝ Ë¿ ¶¤ À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2015-8-28
  3876  次浏览      27

CSRFÊÇʲô

CSRFÔڰٶȰٿÆÖÐÊÇÕâô˵µÄ£º¡°CSRF£¨Cross-site request forgery¿çÕ¾ÇëÇóαÔ죬Ҳ±»³ÆÎª¡°one click attack¡±»òÕßsession riding£¬Í¨³£ËõдΪCSRF»òÕßXSRF£¬ÊÇÒ»ÖÖ¶ÔÍøÕ¾µÄ¶ñÒâÀûÓ᣾¡¹ÜÌýÆðÀ´Ïñ¿çÕ¾½Å±¾£¨XSS£©£¬µ«ËüÓëXSS·Ç³£²»Í¬£¬²¢ÇÒ¹¥»÷·½Ê½¼¸ºõÏà×ó¡£XSSÀûÓÃÕ¾µãÄÚµÄÐÅÈÎÓû§£¬¶øCSRFÔòͨ¹ýαװÀ´×ÔÊÜÐÅÈÎÓû§µÄÇëÇóÀ´ÀûÓÃÊÜÐÅÈεÄÍøÕ¾¡£ÓëXSS¹¥»÷Ïà±È£¬CSRF¹¥»÷ÍùÍù²»´óÁ÷ÐУ¨Òò´Ë¶ÔÆä½øÐзÀ·¶µÄ×ÊÔ´Ò²Ï൱ϡÉÙ£©ºÍÄÑÒÔ·À·¶£¬ËùÒÔ±»ÈÏΪ±ÈXSS¸ü¾ßΣÏÕÐÔ¡£¡±¡£

CSRF¹¥»÷Ô­Àí

´ÓÉÏͼ¿ÉÒÔ¿´³ö£¬ÒªÍê³ÉÒ»´ÎCSRF¹¥»÷£¬Êܺ¦Õß±ØÐëÒÀ´ÎÍê³É2¸ö²½Öè

1.µÇ¼ÊÜÐÅÈÎÍøÕ¾A£¬²¢ÔÚ±¾µØÉú³ÉCookie¡£

2.ÔÚ²»µÇ³öAµÄÇé¿öÏ£¬·ÃÎÊΣÏÕÍøÕ¾B (Õâ¸ö¹ý³ÌÍê³É¹¥»÷)

CSRF ¾ÙÀý

CSRF ¹¥»÷¿ÉÒÔÔÚÊܺ¦ÕߺÁ²»ÖªÇéµÄÇé¿öÏÂÒÔÊܺ¦ÕßÃûÒåαÔìÇëÇó·¢Ë͸øÊܹ¥»÷Õ¾µã£¬´Ó¶øÔÚ²¢Î´ÊÚȨµÄÇé¿öÏÂÖ´ÐÐÔÚȨÏÞ±£»¤Ö®ÏµIJÙ×÷¡£

±ÈÈç˵£¬Êܺ¦Õß Bob ÔÚÒøÐÐÓÐÒ»±Ê´æ¿î£¬Í¨¹ý¶ÔÒøÐеÄÍøÕ¾·¢ËÍÇëÇó http://bank.example/withdraw?account=bob&amount=1000000&for=bob2¿ÉÒÔʹ Bob °Ñ 1000000 µÄ´æ¿îתµ½ bob2 µÄÕ˺ÅÏ¡£

ͨ³£Çé¿öÏ£¬¸ÃÇëÇó·¢Ë͵½ÍøÕ¾ºó£¬·þÎñÆ÷»áÏÈÑéÖ¤¸ÃÇëÇóÊÇ·ñÀ´×ÔÒ»¸öºÏ·¨µÄ session£¬²¢ÇҸà session µÄÓû§ Bob ÒѾ­³É¹¦µÇ½¡£

ºÚ¿Í Mallory ×Ô¼ºÔÚ¸ÃÒøÐÐÒ²ÓÐÕË»§£¬ËûÖªµÀÉÏÎÄÖÐµÄ URL ¿ÉÒÔ°ÑÇ®½øÐÐתÕʲÙ×÷¡£

Mallory ¿ÉÒÔ×Ô¼º·¢ËÍÒ»¸öÇëÇó¸øÒøÐУºhttp://bank.example/withdraw?account=bob&amount=1000000&for=Mallory¡£µ«ÊÇÕâ¸öÇëÇóÀ´×Ô Mallory ¶ø·Ç Bob£¬Ëû²»ÄÜͨ¹ý°²È«ÈÏÖ¤£¬Òò´Ë¸ÃÇëÇó²»»áÆð×÷Óá£

Õâʱ£¬Mallory Ï뵽ʹÓà CSRF µÄ¹¥»÷·½Ê½£¬ËûÏÈ×Ô¼º×öÒ»¸öÍøÕ¾£¬ÔÚÍøÕ¾ÖзÅÈëÈçÏ´úÂ룺<img src=¡±http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ¡± />£¬²¢ÇÒͨ¹ý¹ã¸æµÈÓÕʹ Bob À´·ÃÎÊËûµÄÍøÕ¾¡£µ± Bob ·ÃÎʸÃÍøÕ¾Ê±£¬ÉÏÊö url ¾Í»á´Ó Bob µÄä¯ÀÀÆ÷·¢ÏòÒøÐУ¬¶øÕâ¸öÇëÇó»á¸½´ø Bob ä¯ÀÀÆ÷ÖÐµÄ cookie Ò»Æð·¢ÏòÒøÐзþÎñÆ÷¡£´ó¶àÊýÇé¿öÏ£¬¸ÃÇëÇó»áʧ°Ü£¬ÒòΪËûÒªÇó Bob µÄÈÏÖ¤ÐÅÏ¢¡£

µ«ÊÇ£¬Èç¹û Bob µ±Ê±Ç¡ÇɸշÃÎÊËûµÄÒøÐк󲻾ã¬ËûµÄä¯ÀÀÆ÷ÓëÒøÐÐÍøÕ¾Ö®¼äµÄ session ÉÐδ¹ýÆÚ£¬ä¯ÀÀÆ÷µÄ cookie Ö®Öк¬ÓÐ Bob µÄÈÏÖ¤ÐÅÏ¢¡£

Õâʱ£¬±¯¾ç·¢ÉúÁË£¬Õâ¸ö url ÇëÇó¾Í»áµÃµ½ÏìÓ¦£¬Ç®½«´Ó Bob µÄÕ˺Å×ªÒÆµ½ Mallory µÄÕ˺ţ¬¶ø Bob µ±Ê±ºÁ²»ÖªÇé¡£µÈÒÔºó Bob ·¢ÏÖÕË»§Ç®ÉÙÁË£¬¼´Ê¹ËûÈ¥ÒøÐвéѯÈÕÖ¾£¬ËûÒ²Ö»ÄÜ·¢ÏÖȷʵÓÐÒ»¸öÀ´×ÔÓÚËû±¾È˵ĺϷ¨ÇëÇó×ªÒÆÁË×ʽð£¬Ã»ÓÐÈκα»¹¥»÷µÄºÛ¼£¡£¶ø Mallory Ôò¿ÉÒÔÄõ½Ç®ºóåÐÒ£·¨Íâ¡£

CSRF ·ÀÓù

¶ÔÓÚWebÓ¦ÓÃÀ´Ëµ¿ÉÒÔÓÐÒÔϼ¸ÖÖ·½°¸£º

1£©ÑéÖ¤ HTTP Referer ×Ö¶Î

¸ù¾Ý HTTP ЭÒ飬ÔÚ HTTP Í·ÖÐÓÐÒ»¸ö×ֶνРReferer£¬Ëü¼Ç¼Á˸à HTTP ÇëÇóµÄÀ´Ô´µØÖ·¡£ÔÚͨ³£Çé¿öÏ£¬·ÃÎÊÒ»¸ö°²È«ÊÜÏÞÒ³ÃæµÄÇëÇóÀ´×ÔÓÚͬһ¸öÍøÕ¾£¬±ÈÈçÐèÒª·ÃÎÊ http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory£¬Óû§±ØÐëÏȵǽ bank.example£¬È»ºóͨ¹ýµã»÷Ò³ÃæÉϵİ´Å¥À´´¥·¢×ªÕËʼþ¡£Õâʱ£¬¸ÃתÕÊÇëÇóµÄ Referer Öµ¾Í»áÊÇתÕ˰´Å¥ËùÔÚµÄÒ³ÃæµÄ URL£¬Í¨³£ÊÇÒÔ bank.example ÓòÃû¿ªÍ·µÄµØÖ·¡£¶øÈç¹ûºÚ¿ÍÒª¶ÔÒøÐÐÍøÕ¾ÊµÊ© CSRF ¹¥»÷£¬ËûÖ»ÄÜÔÚËû×Ô¼ºµÄÍøÕ¾¹¹ÔìÇëÇ󣬵±Óû§Í¨¹ýºÚ¿ÍµÄÍøÕ¾·¢ËÍÇëÇóµ½ÒøÐÐʱ£¬¸ÃÇëÇóµÄ Referer ÊÇÖ¸ÏòºÚ¿Í×Ô¼ºµÄÍøÕ¾¡£Òò´Ë£¬Òª·ÀÓù CSRF ¹¥»÷£¬ÒøÐÐÍøÕ¾Ö»ÐèÒª¶ÔÓÚÿһ¸öתÕËÇëÇóÑéÖ¤Æä Referer Öµ£¬Èç¹ûÊÇÒÔ bank.example ¿ªÍ·µÄÓòÃû£¬Ôò˵Ã÷¸ÃÇëÇóÊÇÀ´×ÔÒøÐÐÍøÕ¾×Ô¼ºµÄÇëÇó£¬ÊǺϷ¨µÄ¡£Èç¹û Referer ÊÇÆäËûÍøÕ¾µÄ»°£¬ÔòÓпÉÄÜÊÇºÚ¿ÍµÄ CSRF ¹¥»÷£¬¾Ü¾ø¸ÃÇëÇó¡£

ÕâÖÖ·½·¨µÄÏÔ¶øÒ×¼ûµÄºÃ´¦¾ÍÊǼòµ¥Ò×ÐУ¬ÍøÕ¾µÄÆÕͨ¿ª·¢ÈËÔ±²»ÐèÒª²ÙÐÄ CSRF µÄ©¶´£¬Ö»ÐèÒªÔÚ×îºó¸øËùÓа²È«Ãô¸ÐµÄÇëÇóͳһÔö¼ÓÒ»¸öÀ¹½ØÆ÷À´¼ì²é Referer µÄÖµ¾Í¿ÉÒÔ¡£ÌرðÊǶÔÓÚµ±Ç°ÏÖÓеÄϵͳ£¬²»ÐèÒª¸Ä±äµ±Ç°ÏµÍ³µÄÈκÎÒÑÓдúÂëºÍÂß¼­£¬Ã»ÓзçÏÕ£¬·Ç³£±ã½Ý¡£

È»¶ø£¬ÕâÖÖ·½·¨²¢·ÇÍòÎÞһʧ¡£Referer µÄÖµÊÇÓÉä¯ÀÀÆ÷ÌṩµÄ£¬ËäÈ» HTTP ЭÒéÉÏÓÐÃ÷È·µÄÒªÇ󣬵«ÊÇÿ¸öä¯ÀÀÆ÷¶ÔÓÚ Referer µÄ¾ßÌåʵÏÖ¿ÉÄÜÓвî±ð£¬²¢²»Äܱ£Ö¤ä¯ÀÀÆ÷×ÔÉíûÓа²È«Â©¶´¡£Ê¹ÓÃÑéÖ¤ Referer ÖµµÄ·½·¨£¬¾ÍÊǰѰ²È«ÐÔ¶¼ÒÀÀµÓÚµÚÈý·½£¨¼´ä¯ÀÀÆ÷£©À´±£ÕÏ£¬´ÓÀíÂÛÉÏÀ´½²£¬ÕâÑù²¢²»°²È«¡£ÊÂʵÉÏ£¬¶ÔÓÚijЩä¯ÀÀÆ÷£¬±ÈÈç IE6 »ò FF2£¬Ä¿Ç°ÒѾ­ÓÐһЩ·½·¨¿ÉÒÔ´Û¸Ä Referer Öµ¡£Èç¹û bank.example ÍøÕ¾Ö§³Ö IE6 ä¯ÀÀÆ÷£¬ºÚ¿ÍÍêÈ«¿ÉÒÔ°ÑÓû§ä¯ÀÀÆ÷µÄ Referer ÖµÉèΪÒÔ bank.example ÓòÃû¿ªÍ·µÄµØÖ·£¬ÕâÑù¾Í¿ÉÒÔͨ¹ýÑéÖ¤£¬´Ó¶ø½øÐÐ CSRF ¹¥»÷¡£

¼´±ãÊÇʹÓÃ×îеÄä¯ÀÀÆ÷£¬ºÚ¿ÍÎÞ·¨´Û¸Ä Referer Öµ£¬ÕâÖÖ·½·¨ÈÔÈ»ÓÐÎÊÌâ¡£ÒòΪ Referer Öµ»á¼Ç¼ÏÂÓû§µÄ·ÃÎÊÀ´Ô´£¬ÓÐЩÓû§ÈÏΪÕâÑù»áÇÖ·¸µ½ËûÃÇ×Ô¼ºµÄÒþ˽Ȩ£¬ÌرðÊÇÓÐЩ×éÖ¯µ£ÐÄ Referer Öµ»á°Ñ×éÖ¯ÄÚÍøÖеÄijЩÐÅϢй¶µ½ÍâÍøÖС£Òò´Ë£¬Óû§×Ô¼º¿ÉÒÔÉèÖÃä¯ÀÀÆ÷ʹÆäÔÚ·¢ËÍÇëÇóʱ²»ÔÙÌṩ Referer¡£µ±ËûÃÇÕý³£·ÃÎÊÒøÐÐÍøÕ¾Ê±£¬ÍøÕ¾»áÒòΪÇëÇóûÓÐ Referer Öµ¶øÈÏΪÊÇ CSRF ¹¥»÷£¬¾Ü¾øºÏ·¨Óû§µÄ·ÃÎÊ¡£

2£©ÔÚÇëÇóµØÖ·ÖÐÌí¼Ó token ²¢ÑéÖ¤

CSRF ¹¥»÷Ö®ËùÒÔÄܹ»³É¹¦£¬ÊÇÒòΪºÚ¿Í¿ÉÒÔÍêȫαÔìÓû§µÄÇëÇ󣬸ÃÇëÇóÖÐËùÓеÄÓû§ÑéÖ¤ÐÅÏ¢¶¼ÊÇ´æÔÚÓÚ cookie ÖУ¬Òò´ËºÚ¿Í¿ÉÒÔÔÚ²»ÖªµÀÕâЩÑéÖ¤ÐÅÏ¢µÄÇé¿öÏÂÖ±½ÓÀûÓÃÓû§×Ô¼ºµÄ cookie À´Í¨¹ý°²È«ÑéÖ¤¡£ÒªµÖÓù CSRF£¬¹Ø¼üÔÚÓÚÔÚÇëÇóÖзÅÈëºÚ¿ÍËù²»ÄÜαÔìµÄÐÅÏ¢£¬²¢ÇÒ¸ÃÐÅÏ¢²»´æÔÚÓÚ cookie Ö®ÖС£¿ÉÒÔÔÚ HTTP ÇëÇóÖÐÒÔ²ÎÊýµÄÐÎʽ¼ÓÈëÒ»¸öËæ»ú²úÉúµÄ token£¬²¢ÔÚ·þÎñÆ÷¶Ë½¨Á¢Ò»¸öÀ¹½ØÆ÷À´ÑéÖ¤Õâ¸ö token£¬Èç¹ûÇëÇóÖÐûÓÐ token »òÕß token ÄÚÈݲ»ÕýÈ·£¬ÔòÈÏΪ¿ÉÄÜÊÇ CSRF ¹¥»÷¶ø¾Ü¾ø¸ÃÇëÇó¡£

ÕâÖÖ·½·¨Òª±È¼ì²é Referer Òª°²È«Ò»Ð©£¬token ¿ÉÒÔÔÚÓû§µÇ½ºó²úÉú²¢·ÅÓÚ session Ö®ÖУ¬È»ºóÔÚÿ´ÎÇëÇóʱ°Ñ token ´Ó session ÖÐÄóö£¬ÓëÇëÇóÖÐµÄ token ½øÐбȶԣ¬µ«ÕâÖÖ·½·¨µÄÄѵãÔÚÓÚÈçºÎ°Ñ token ÒÔ²ÎÊýµÄÐÎʽ¼ÓÈëÇëÇó¡£¶ÔÓÚ GET ÇëÇó£¬token ½«¸½ÔÚÇëÇóµØÖ·Ö®ºó£¬ÕâÑù URL ¾Í±ä³É http://url?csrftoken=tokenvalue¡£ ¶ø¶ÔÓÚ POST ÇëÇóÀ´Ëµ£¬ÒªÔÚ form µÄ×îºó¼ÓÉÏ <input type=¡±hidden¡± name=¡±csrftoken¡± value=¡±tokenvalue¡±/>£¬ÕâÑù¾Í°Ñ token ÒÔ²ÎÊýµÄÐÎʽ¼ÓÈëÇëÇóÁË¡£µ«ÊÇ£¬ÔÚÒ»¸öÍøÕ¾ÖУ¬¿ÉÒÔ½ÓÊÜÇëÇóµÄµØ·½·Ç³£¶à£¬Òª¶ÔÓÚÿһ¸öÇëÇó¶¼¼ÓÉÏ token ÊǺÜÂé·³µÄ£¬²¢ÇÒºÜÈÝÒשµô£¬Í¨³£Ê¹Óõķ½·¨¾ÍÊÇÔÚÿ´ÎÒ³Ãæ¼ÓÔØÊ±£¬Ê¹Óà javascript ±éÀúÕû¸ö dom Ê÷£¬¶ÔÓÚ dom ÖÐËùÓÐµÄ a ºÍ form ±êÇ©ºó¼ÓÈë token¡£ÕâÑù¿ÉÒÔ½â¾ö´ó²¿·ÖµÄÇëÇ󣬵«ÊǶÔÓÚÔÚÒ³Ãæ¼ÓÔØÖ®ºó¶¯Ì¬Éú³ÉµÄ html ´úÂ룬ÕâÖÖ·½·¨¾ÍûÓÐ×÷Ó㬻¹ÐèÒª³ÌÐòÔ±ÔÚ±àÂëʱÊÖ¶¯Ìí¼Ó token¡£

¸Ã·½·¨»¹ÓÐÒ»¸öȱµãÊÇÄÑÒÔ±£Ö¤ token ±¾ÉíµÄ°²È«¡£ÌرðÊÇÔÚһЩÂÛ̳֮ÀàÖ§³ÖÓû§×Ô¼º·¢±íÄÚÈݵÄÍøÕ¾£¬ºÚ¿Í¿ÉÒÔÔÚÉÏÃæ·¢²¼×Ô¼º¸öÈËÍøÕ¾µÄµØÖ·¡£ÓÉÓÚϵͳҲ»áÔÚÕâ¸öµØÖ·ºóÃæ¼ÓÉÏ token£¬ºÚ¿Í¿ÉÒÔÔÚ×Ô¼ºµÄÍøÕ¾Éϵõ½Õâ¸ö token£¬²¢ÂíÉϾͿÉÒÔ·¢¶¯ CSRF ¹¥»÷¡£ÎªÁ˱ÜÃâÕâÒ»µã£¬ÏµÍ³¿ÉÒÔÔÚÌí¼Ó token µÄʱºòÔö¼ÓÒ»¸öÅжϣ¬Èç¹ûÕâ¸öÁ´½ÓÊÇÁ´µ½×Ô¼º±¾Õ¾µÄ£¬¾ÍÔÚºóÃæÌí¼Ó token£¬Èç¹ûÊÇͨÏòÍâÍøÔò²»¼Ó¡£²»¹ý£¬¼´Ê¹Õâ¸ö csrftoken ²»ÒÔ²ÎÊýµÄÐÎʽ¸½¼ÓÔÚÇëÇóÖ®ÖУ¬ºÚ¿ÍµÄÍøÕ¾Ò²Í¬Ñù¿ÉÒÔͨ¹ý Referer À´µÃµ½Õâ¸ö token ÖµÒÔ·¢¶¯ CSRF ¹¥»÷¡£ÕâÒ²ÊÇһЩÓû§Ï²»¶ÊÖ¶¯¹Ø±Õä¯ÀÀÆ÷ Referer ¹¦ÄܵÄÔ­Òò¡£

3£©ÔÚ HTTP Í·ÖÐ×Ô¶¨ÒåÊôÐÔ²¢ÑéÖ¤

ÕâÖÖ·½·¨Ò²ÊÇʹÓà token ²¢½øÐÐÑéÖ¤£¬ºÍÉÏÒ»ÖÖ·½·¨²»Í¬µÄÊÇ£¬ÕâÀï²¢²»ÊÇ°Ñ token ÒÔ²ÎÊýµÄÐÎʽÖÃÓÚ HTTP ÇëÇóÖ®ÖУ¬¶øÊǰÑËü·Åµ½ HTTP Í·ÖÐ×Ô¶¨ÒåµÄÊôÐÔÀͨ¹ý XMLHttpRequest Õâ¸öÀ࣬¿ÉÒÔÒ»´ÎÐÔ¸øËùÓиÃÀàÇëÇó¼ÓÉÏ csrftoken Õâ¸ö HTTP Í·ÊôÐÔ£¬²¢°Ñ token Öµ·ÅÈëÆäÖС£ÕâÑù½â¾öÁËÉÏÖÖ·½·¨ÔÚÇëÇóÖмÓÈë token µÄ²»±ã£¬Í¬Ê±£¬Í¨¹ý XMLHttpRequest ÇëÇóµÄµØÖ·²»»á±»¼Ç¼µ½ä¯ÀÀÆ÷µÄµØÖ·À¸£¬Ò²²»Óõ£ÐÄ token »á͸¹ý Referer й¶µ½ÆäËûÍøÕ¾ÖÐÈ¥¡£

È»¶øÕâÖÖ·½·¨µÄ¾ÖÏÞÐԷdz£´ó¡£XMLHttpRequest ÇëÇóͨ³£ÓÃÓÚ Ajax ·½·¨ÖжÔÓÚÒ³Ãæ¾Ö²¿µÄÒ첽ˢУ¬²¢·ÇËùÓеÄÇëÇó¶¼ÊʺÏÓÃÕâ¸öÀàÀ´·¢Æð£¬¶øÇÒͨ¹ý¸ÃÀàÇëÇóµÃµ½µÄÒ³Ãæ²»Äܱ»ä¯ÀÀÆ÷Ëù¼Ç¼Ï£¬´Ó¶ø½øÐÐǰ½ø£¬ºóÍË£¬Ë¢Ð£¬ÊղصȲÙ×÷£¬¸øÓû§´øÀ´²»±ã¡£ÁíÍ⣬¶ÔÓÚûÓнøÐÐ CSRF ·À»¤µÄÒÅÁôϵͳÀ´Ëµ£¬Òª²ÉÓÃÕâÖÖ·½·¨À´½øÐзÀ»¤£¬Òª°ÑËùÓÐÇëÇ󶼸ÄΪ XMLHttpRequest ÇëÇó£¬ÕâÑù¼¸ºõÊÇÒªÖØÐ´Õû¸öÍøÕ¾£¬Õâ´ú¼ÛÎÞÒÉÊDz»ÄܽÓÊܵġ£

TomcatÖеÄCsrfPreventionFilter

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.catalina.filters;

import java.io.IOException;
import java.io.Serializable;
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;

/**
* Provides basic CSRF protection for a web application. The filter assumes
* that:
* <ul>
* <li>The filter is mapped to /*</li>
* <li>{@link HttpServletResponse#encodeRedirectURL(String)} and
* {@link HttpServletResponse#encodeURL(String)} are used to encode all URLs
* returned to the client
* </ul>
*/
public class CsrfPreventionFilter extends FilterBase {

private static final Log log =
LogFactory.getLog(CsrfPreventionFilter.class);

private String randomClass = SecureRandom.class.getName();

private Random randomSource;

private final Set<String> entryPoints = new HashSet<String>();

private int nonceCacheSize = 5;

@Override
protected Log getLogger() {
return log;
}

/**
* Entry points are URLs that will not be tested for the presence of a valid
* nonce. They are used to provide a way to navigate back to a protected
* application after navigating away from it. Entry points will be limited
* to HTTP GET requests and should not trigger any security sensitive
* actions.
*
* @param entryPoints Comma separated list of URLs to be configured as
* entry points.
*/
public void setEntryPoints(String entryPoints) {
String values[] = entryPoints.split(",");
for (String value : values) {
this.entryPoints.add(value.trim());
}
}

/**
* Sets the number of previously issued nonces that will be cached on a LRU
* basis to support parallel requests, limited use of the refresh and back
* in the browser and similar behaviors that may result in the submission
* of a previous nonce rather than the current one. If not set, the default
* value of 5 will be used.
*
* @param nonceCacheSize The number of nonces to cache
*/
public void setNonceCacheSize(int nonceCacheSize) {
this.nonceCacheSize = nonceCacheSize;
}

/**
* Specify the class to use to generate the nonces. Must be in instance of
* {@link Random}.
*
* @param randomClass The name of the class to use
*/
public void setRandomClass(String randomClass) {
this.randomClass = randomClass;
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Set the parameters
super.init(filterConfig);

try {
Class<?> clazz = Class.forName(randomClass);
randomSource = (Random) clazz.newInstance();
} catch (ClassNotFoundException e) {
ServletException se = new ServletException(sm.getString(
"csrfPrevention.invalidRandomClass", randomClass), e);
throw se;
} catch (InstantiationException e) {
ServletException se = new ServletException(sm.getString(
"csrfPrevention.invalidRandomClass", randomClass), e);
throw se;
} catch (IllegalAccessException e) {
ServletException se = new ServletException(sm.getString(
"csrfPrevention.invalidRandomClass", randomClass), e);
throw se;
}
}


public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

ServletResponse wResponse = null;

if (request instanceof HttpServletRequest &&
response instanceof HttpServletResponse) {

HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;

boolean skipNonceCheck = false;

if (Constants.METHOD_GET.equals(req.getMethod())) {
String path = req.getServletPath();
if (req.getPathInfo() != null) {
path = path + req.getPathInfo();
}

if (entryPoints.contains(path)) {
skipNonceCheck = true;
}
}

HttpSession session = req.getSession(false);

@SuppressWarnings("unchecked")
LruCache<String> nonceCache = (session == null) ? null
: (LruCache<String>) session.getAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡// ¶ÔÇëÇó½øÐÐÑéÖ¤
if (!skipNonceCheck) {
String previousNonce =
req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);

if (nonceCache == null || previousNonce == null ||
!nonceCache.contains(previousNonce)) {
res.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
}

if (nonceCache == null) {
nonceCache = new LruCache<String>(nonceCacheSize);
if (session == null) {
session = req.getSession(true);
}
session.setAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME, nonceCache);
}
// ΪÏÂÒ»´ÎÇëÇó£¬Éú³ÉÒ»¸öËæ»úÊý·ÅÔÚURLÖÐ
String newNonce = generateNonce();
// ͬʱ½«Ëæ»úÊý´æ´¢ÔÚsessionÖÐ
nonceCache.add(newNonce);

wResponse = new CsrfResponseWrapper(res, newNonce);
} else {
wResponse = response;
}

chain.doFilter(request, wResponse);
}


@Override
protected boolean isConfigProblemFatal() {
return true;
}


/**
* Generate a once time token (nonce) for authenticating subsequent
* requests. This will also add the token to the session. The nonce
* generation is a simplified version of ManagerBase.generateSessionId().
*
*/
protected String generateNonce() {
byte random[] = new byte[16];

// Render the result as a String of hexadecimal digits
StringBuilder buffer = new StringBuilder();

randomSource.nextBytes(random);

for (int j = 0; j < random.length; j++) {
byte b1 = (byte) ((random[j] & 0xf0) >> 4);
byte b2 = (byte) (random[j] & 0x0f);
if (b1 < 10)
buffer.append((char) ('0' + b1));
else
buffer.append((char) ('A' + (b1 - 10)));
if (b2 < 10)
buffer.append((char) ('0' + b2));
else
buffer.append((char) ('A' + (b2 - 10)));
}

return buffer.toString();
}

protected static class CsrfResponseWrapper
extends HttpServletResponseWrapper {

private String nonce;

public CsrfResponseWrapper(HttpServletResponse response, String nonce) {
super(response);
this.nonce = nonce;
}

@Override
@Deprecated
public String encodeRedirectUrl(String url) {
return encodeRedirectURL(url);
}

@Override
public String encodeRedirectURL(String url) {
return addNonce(super.encodeRedirectURL(url));
}

@Override
@Deprecated
public String encodeUrl(String url) {
return encodeURL(url);
}

@Override
public String encodeURL(String url) {
return addNonce(super.encodeURL(url));
}

/**
* Return the specified URL with the nonce added to the query string.
*
* @param url URL to be modified
* @param nonce The nonce to add
*/
private String addNonce(String url) {

if ((url == null) || (nonce == null))
return (url);

String path = url;
String query = "";
String anchor = "";
int pound = path.indexOf('#');
if (pound >= 0) {
anchor = path.substring(pound);
path = path.substring(0, pound);
}
int question = path.indexOf('?');
if (question >= 0) {
query = path.substring(question);
path = path.substring(0, question);
}
StringBuilder sb = new StringBuilder(path);
if (query.length() >0) {
sb.append(query);
sb.append('&');
} else {
sb.append('?');
}
sb.append(Constants.CSRF_NONCE_REQUEST_PARAM);
sb.append('=');
sb.append(nonce);
sb.append(anchor);
return (sb.toString());
}
}

protected static class LruCache<T> implements Serializable {

private static final long serialVersionUID = 1L;

// Although the internal implementation uses a Map, this cache
// implementation is only concerned with the keys.
private final Map<T,T> cache;

public LruCache(final int cacheSize) {
cache = new LinkedHashMap<T,T>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(Map.Entry<T,T> eldest) {
if (size() > cacheSize) {
return true;
}
return false;
}
};
}

public void add(T key) {
synchronized (cache) {
cache.put(key, null);
}
}

public boolean contains(T key) {
synchronized (cache) {
return cache.containsKey(key);
}
}
}
}

CSRFÊÇWebÓ¦ÓóÌÐòµÄÒ»ÖÖ³£¼û©¶´£¬Æä¹¥»÷ÌØÐÔÊÇΣº¦ÐԴ󵫷dz£Òþ±Î£¬ÓÈÆäÊÇÔÚ´óÁ¿Web 2.0¼¼ÊõµÄÓ¦Óñ³¾°Ï£¬¹¥»÷ÕßÍêÈ«¿ÉÒÔÔÚÓû§ºÁÎÞ²ì¾õµÄÇé¿öÏ·¢ÆðCSRF¹¥»÷¡£±¾ÎĽ«¶ÔÆä»ù±¾ÌØÐÔ¡¢¹¥»÷Ô­Àí¡¢¹¥»÷·ÖÀà¡¢¼ì²â·½·¨¼°·À·¶ÊÖ¶Î×öÒ»¸öϵͳµÄ²ûÊö£¬²¢Áоٹ¥»÷ʵÀý¡£

1 CSRF©¶´¼ò½é

CSRF£¨Cross-Site Request Forgery£¬¿çÕ¾µãαÔìÇëÇó£©ÊÇÒ»ÖÖÍøÂç¹¥»÷·½Ê½£¬¸Ã¹¥»÷¿ÉÒÔÔÚÊܺ¦ÕߺÁ²»ÖªÇéµÄÇé¿öÏÂÒÔÊܺ¦ÕßÃûÒåαÔìÇëÇó·¢Ë͸øÊܹ¥»÷Õ¾µã£¬´Ó¶øÔÚδÊÚȨµÄÇé¿öÏÂÖ´ÐÐÔÚȨÏÞ±£»¤Ö®ÏµIJÙ×÷£¬¾ßÓкܴóµÄΣº¦ÐÔ¡£¾ßÌåÀ´½²£¬¿ÉÒÔÕâÑùÀí½âCSRF¹¥»÷£º¹¥»÷ÕßµÁÓÃÁËÄãµÄÉí·Ý£¬ÒÔÄãµÄÃûÒå·¢ËͶñÒâÇëÇ󣬶ԷþÎñÆ÷À´ËµÕâ¸öÇëÇóÊÇÍêÈ«ºÏ·¨µÄ£¬µ«ÊÇÈ´Íê³ÉÁ˹¥»÷ÕßËùÆÚÍûµÄÒ»¸ö²Ù×÷£¬±ÈÈçÒÔÄãµÄÃûÒå·¢ËÍÓʼþ¡¢·¢ÏûÏ¢£¬µÁÈ¡ÄãµÄÕ˺ţ¬Ìí¼Óϵͳ¹ÜÀíÔ±£¬ÉõÖÁÓÚ¹ºÂòÉÌÆ·¡¢ÐéÄâ»õ±ÒתÕ˵ȡ£

CSRF¹¥»÷·½Ê½²¢²»Îª´ó¼ÒËùÊìÖª£¬Êµ¼ÊÉϺܶàÍøÕ¾¶¼´æÔÚCSRFµÄ°²È«Â©¶´¡£ÔçÔÚ2000Ä꣬CSRFÕâÖÖ¹¥»÷·½Ê½ÒѾ­ÓɹúÍâµÄ°²È«ÈËÔ±Ìá³ö£¬µ«ÔÚ¹úÄÚ£¬Ö±µ½2006Äê²Å¿ªÊ¼±»¹Ø×¢¡£2008Ä꣬¹úÄÚÍâ¶à¸ö´óÐÍÉçÇøºÍ½»»¥ÍøÕ¾ÏȺ󱬳öCSRF©¶´£¬È磺°Ù¶ÈHI¡¢NYTimes.com£¨Å¦Ô¼Ê±±¨£©¡¢Metafilter£¨Ò»¸ö´óÐ͵ÄBLOGÍøÕ¾£©ºÍYouTubeµÈ¡£µ«Ö±µ½ÏÖÔÚ£¬»¥ÁªÍøÉϵÄÐí¶àÕ¾µãÈԶԴ˺ÁÎÞ·À±¸£¬ÒÔÖÁÓÚ°²È«Òµ½ç³ÆCSRFΪ¡°³Á˯µÄ¾ÞÈË¡±£¬ÆäÍþв³Ì¶ÈÓÉ´Ë¡°ÃÀÓþ¡±±ã¿É¼ûÒ»°ß¡£

2 CSRF¹¥»÷Ô­Àí¼°ÊµÀý

CSRF¹¥»÷Ô­Àí

CSRF¹¥»÷Ô­Àí±È½Ï¼òµ¥£¬Èçͼ1Ëùʾ¡£ÆäÖÐWeb AΪ´æÔÚCSRF©¶´µÄÍøÕ¾£¬Web BΪ¹¥»÷Õß¹¹½¨µÄ¶ñÒâÍøÕ¾£¬User CΪWeb AÍøÕ¾µÄºÏ·¨Óû§¡£

ͼ1 CSRF¹¥»÷Ô­Àí

1. Óû§C´ò¿ªä¯ÀÀÆ÷£¬·ÃÎÊÊÜÐÅÈÎÍøÕ¾A£¬ÊäÈëÓû§ÃûºÍÃÜÂëÇëÇóµÇÂ¼ÍøÕ¾A£»

2.ÔÚÓû§ÐÅϢͨ¹ýÑéÖ¤ºó£¬ÍøÕ¾A²úÉúCookieÐÅÏ¢²¢·µ»Ø¸øä¯ÀÀÆ÷£¬´ËʱÓû§µÇÂ¼ÍøÕ¾A³É¹¦£¬¿ÉÒÔÕý³£·¢ËÍÇëÇóµ½ÍøÕ¾A£»

3. Óû§Î´Í˳öÍøÕ¾A֮ǰ£¬ÔÚͬһä¯ÀÀÆ÷ÖУ¬´ò¿ªÒ»¸öTABÒ³·ÃÎÊÍøÕ¾B£»

4. ÍøÕ¾B½ÓÊÕµ½Óû§ÇëÇóºó£¬·µ»ØÒ»Ð©¹¥»÷ÐÔ´úÂ룬²¢·¢³öÒ»¸öÇëÇóÒªÇó·ÃÎʵÚÈý·½Õ¾µãA£»

5. ä¯ÀÀÆ÷ÔÚ½ÓÊÕµ½ÕâЩ¹¥»÷ÐÔ´úÂëºó£¬¸ù¾ÝÍøÕ¾BµÄÇëÇó£¬ÔÚÓû§²»ÖªÇéµÄÇé¿öÏÂЯ´øCookieÐÅÏ¢£¬ÏòÍøÕ¾A·¢³öÇëÇó¡£ÍøÕ¾A²¢²»ÖªµÀ¸ÃÇëÇóÆäʵÊÇÓÉB·¢ÆðµÄ£¬ËùÒÔ»á¸ù¾ÝÓû§CµÄCookieÐÅÏ¢ÒÔCµÄȨÏÞ´¦Àí¸ÃÇëÇ󣬵¼ÖÂÀ´×ÔÍøÕ¾BµÄ¶ñÒâ´úÂë±»Ö´ÐС£

CSRF¹¥»÷·ÖÀà

CSRF©¶´Ò»°ã·ÖΪվÍâºÍÕ¾ÄÚÁ½ÖÖÀàÐÍ¡£

CSRFÕ¾ÍâÀàÐ͵Ä©¶´±¾ÖÊÉϾÍÊÇ´«Í³ÒâÒåÉϵÄÍⲿÌá½»Êý¾ÝÎÊÌ⡣ͨ³£³ÌÐòÔ±»á¿¼ÂǸøÒ»Ð©ÁôÑÔ»òÕ߯ÀÂÛµÄ±íµ¥¼ÓÉÏˮӡÒÔ·ÀÖ¹SPAMÎÊÌ⣨ÕâÀSPAM¿ÉÒÔ¼òµ¥µÄÀí½âΪÀ¬»øÁôÑÔ¡¢À¬»øÆÀÂÛ£¬»òÕßÊÇ´øÓÐÕ¾ÍâÁ´½ÓµÄ¶ñÒâ»Ø¸´£©£¬µ«ÊÇÓÐʱΪÁËÌá¸ßÓû§µÄÌåÑéÐÔ£¬¿ÉÄÜûÓжÔһЩ²Ù×÷×öÈκÎÏÞÖÆ£¬ËùÒÔ¹¥»÷Õß¿ÉÒÔÊÂÏÈÔ¤²â²¢ÉèÖÃÇëÇóµÄ²ÎÊý£¬ÔÚÕ¾ÍâµÄWebÒ³ÃæÀï±àд½Å±¾Î±ÔìÎļþÇëÇ󣬻òÕߺÍ×Ô¶¯Ìá½»µÄ±íµ¥Ò»ÆðʹÓÃÀ´ÊµÏÖGET¡¢POSTÇëÇ󣬵±Óû§ÔڻỰ״̬ϵã»÷Á´½Ó·ÃÎÊÕ¾ÍâWebÒ³Ãæ£¬¿Í»§¶Ë¾Í±»Ç¿ÆÈ·¢ÆðÇëÇó¡£

CSRFÕ¾ÄÚÀàÐ͵Ä©¶´ÔÚÒ»¶¨³Ì¶ÈÉÏÊÇÓÉÓÚ³ÌÐòÔ±ÀÄÓÃ$_REQUESTÀà±äÁ¿Ôì³ÉµÄ¡£ÔÚһЩÃô¸ÐµÄ²Ù×÷ÖУ¨ÈçÐÞ¸ÄÃÜÂë¡¢Ìí¼ÓÓû§µÈ£©£¬±¾À´ÒªÇóÓû§´Ó±íµ¥Ìá½»·¢ÆðPOSTÇëÇ󴫵ݲÎÊý¸ø³ÌÐò£¬µ«ÊÇÓÉÓÚʹÓÃÁË$_REQUESTµÈ±äÁ¿£¬³ÌÐò³ýÖ§³Ö½ÓÊÕPOSTÇëÇ󴫵ݵIJÎÊýÍâÒ²Ö§³Ö½ÓÊÕGETÇëÇ󴫵ݵIJÎÊý£¬ÕâÑù¾Í»áΪ¹¥»÷ÕßʹÓÃCSRF¹¥»÷´´ÔìÌõ¼þ¡£Ò»°ã¹¥»÷ÕßÖ»Òª°ÑÔ¤²âµÄÇëÇó²ÎÊý·ÅÔÚÕ¾ÄÚÒ»¸öÌù×Ó»òÕßÁôÑÔµÄͼƬÁ´½ÓÀÊܺ¦Õßä¯ÀÀÁËÕâÑùµÄÒ³Ãæ¾Í»á±»Ç¿ÆÈ·¢ÆðÕâЩÇëÇó¡£

CSRF¹¥»÷ʵÀý

ÏÂÃæÒÔAxous 1.1.1 CSRF Add Admin Vulnerability£¨Â©¶´CVE±àºÅ£ºCVE-2012-2629£©ÎªÀý£¬½éÉÜCSRF¹¥»÷¾ßÌåʵʩ¹ý³Ì¡£

AxousÊÇÒ»¿îÍøÉÏÉ̵êÓ¦ÓÃÈí¼þ¡£Axous 1.1.1ÒÔ¼°¸üµÍ°æ±¾ÔÚʵÏÖÉÏ´æÔÚÒ»¸öCSRF©¶´£¬Ô¶³Ì¹¥»÷Õß¿ÉÒÔͨ¹ý¹¹ÔìÌØÖÆµÄÍøÒ³£¬ÓÕʹ¸ÃÈí¼þ¹ÜÀíÔ±·ÃÎÊ£¬³É¹¦ÀûÓôË©¶´µÄ¹¥»÷Õß¿ÉÒÔÌí¼Óϵͳ¹ÜÀíÔ±¡£

ÀûÓôË©¶´Ö÷Òª°üº¬ÒÔÏÂÈý¸ö¹ý³Ì£º

1. ¹¥»÷Õß¹¹Ôì¶ñÒâÍøÒ³¡£ÔÚʵʩ¹¥»÷ǰ£¬¹¥»÷ÕßÐèÒª¹¹ÔìÒ»¸öÓëÕý³£Ìí¼Ó¹ÜÀíÔ±Óû§»ù±¾Ò»ÑùµÄÍøÒ³£¬ÔڸöñÒâÍøÒ³ÖжԱØÒªµÄ²ÎÊýÏî½øÐи³Öµ£¬²¢½«¸ÃÍøÒ³µÄactionÖ¸ÏòÕý³£Ìí¼Ó¹ÜÀíÔ±Óû§Ê±·ÃÎʵÄURL£¬ºËÐÄ´úÂëÈçͼ2Ëùʾ£»

2. ¹¥»÷ÕßÀûÓÃÉç»á¹¤³ÌѧÓÕʹAxousϵͳ¹ÜÀíÔ±·ÃÎÊÆä¹¹ÔìµÄ¶ñÒâÍøÒ³£»

3. Ö´ÐжñÒâ´úÂë¡£µ±ÏµÍ³¹ÜÀíÔ±·ÃÎʶñÒâÍøÒ³Ê±£¬¶ñÒâ´úÂëÔÚ¹ÜÀíÔ±²»ÖªÇéµÄÇé¿öÏÂÒÔϵͳ¹ÜÀíÔ±µÄºÏ·¨È¨ÏÞ±»Ö´ÐУ¬¹¥»÷ÕßαÔìµÄ¹ÜÀíÔ±ÕË»§Ìí¼Ó³É¹¦¡£

ͼ2 CSRF¹¥»÷Ìí¼Ó¹ÜÀíÔ±ºËÐÄ´úÂë

3 CSRF ©¶´¼ì²â

¼ì²âCSRF©¶´ÊÇÒ»Ïî±È½Ï·±ËöµÄ¹¤×÷£¬×î¼òµ¥µÄ·½·¨¾ÍÊÇץȡһ¸öÕý³£ÇëÇóµÄÊý¾Ý°ü£¬È¥µôReferer×ֶκóÔÙÖØÐÂÌá½»£¬Èç¹û¸ÃÌá½»»¹ÓÐЧ£¬ÄÇô»ù±¾ÉÏ¿ÉÒÔÈ·¶¨´æÔÚCSRF©¶´¡£

Ëæ×ŶÔCSRF©¶´Ñо¿µÄ²»¶ÏÉîÈ룬²»¶ÏÓ¿ÏÖ³öһЩרÃÅÕë¶ÔCSRF©¶´½øÐмì²âµÄ¹¤¾ß£¬ÈçCSRFTester£¬CSRF Request BuilderµÈ¡£

ÒÔCSRFTester¹¤¾ßΪÀý£¬CSRF©¶´¼ì²â¹¤¾ßµÄ²âÊÔÔ­ÀíÈçÏ£ºÊ¹ÓÃCSRFTester½øÐвâÊÔʱ£¬Ê×ÏÈÐèҪץȡÎÒÃÇÔÚä¯ÀÀÆ÷ÖзÃÎʹýµÄËùÓÐÁ´½ÓÒÔ¼°ËùÓÐµÄ±íµ¥µÈÐÅÏ¢£¬È»ºóͨ¹ýÔÚCSRFTesterÖÐÐÞ¸ÄÏàÓ¦µÄ±íµ¥µÈÐÅÏ¢£¬ÖØÐÂÌá½»£¬ÕâÏ൱ÓÚÒ»´ÎαÔì¿Í»§¶ËÇëÇó¡£Èç¹ûÐ޸ĺóµÄ²âÊÔÇëÇó³É¹¦±»ÍøÕ¾·þÎñÆ÷½ÓÊÜ£¬Ôò˵Ã÷´æÔÚCSRF©¶´£¬µ±È»´Ë¿î¹¤¾ßÒ²¿ÉÒÔ±»ÓÃÀ´½øÐÐCSRF¹¥»÷¡£

4 CSRF©¶´·ÀÓù

CSRF©¶´·ÀÓùÖ÷Òª¿ÉÒÔ´ÓÈý¸ö²ãÃæ½øÐУ¬¼´·þÎñ¶ËµÄ·ÀÓù¡¢Óû§¶ËµÄ·ÀÓùºÍ°²È«É豸µÄ·ÀÓù¡£

4.1 ·þÎñ¶ËµÄ·ÀÓù

Ŀǰҵ½ç·þÎñÆ÷¶Ë·ÀÓùCSRF¹¥»÷Ö÷ÒªÓÐÈýÖÖ²ßÂÔ£ºÑéÖ¤HTTP Referer×ֶΣ¬ÔÚÇëÇóµØÖ·ÖÐÌí¼Ótoken²¢ÑéÖ¤£¬ÔÚHTTPÍ·ÖÐ×Ô¶¨ÒåÊôÐÔ²¢ÑéÖ¤¡£ÏÂÃæ·Ö±ð¶ÔÕâÈýÖÖ²ßÂÔ½øÐмòÒª½éÉÜ¡£

4.1.1 ÑéÖ¤HTTP Referer×Ö¶Î

¸ù¾ÝHTTPЭÒ飬ÔÚHTTPÍ·ÖÐÓÐÒ»¸ö×ֶνÐReferer£¬Ëü¼Ç¼Á˸ÃHTTPÇëÇóµÄÀ´Ô´µØÖ·¡£ÔÚͨ³£Çé¿öÏ£¬·ÃÎÊÒ»¸ö°²È«ÊÜÏÞÒ³ÃæµÄÇëÇó±ØÐëÀ´×ÔÓÚͬһ¸öÍøÕ¾¡£±ÈÈçÄ³ÒøÐеÄתÕËÊÇͨ¹ýÓû§·ÃÎÊhttp://bank.test/test?page=10&userID=101&money=10000Ò³ÃæÍê³É£¬Óû§±ØÐëÏȵǼbank. test£¬È»ºóͨ¹ýµã»÷Ò³ÃæÉϵİ´Å¥À´´¥·¢×ªÕËʼþ¡£µ±Óû§Ìá½»ÇëÇóʱ£¬¸ÃתÕËÇëÇóµÄRefererÖµ¾Í»áÊÇתÕ˰´Å¥ËùÔÚÒ³ÃæµÄURL£¨±¾ÀýÖУ¬Í¨³£ÊÇÒÔbank. testÓòÃû¿ªÍ·µÄµØÖ·£©¡£¶øÈç¹û¹¥»÷ÕßÒª¶ÔÒøÐÐÍøÕ¾ÊµÊ©CSRF¹¥»÷£¬ËûÖ»ÄÜÔÚ×Ô¼ºµÄÍøÕ¾¹¹ÔìÇëÇ󣬵±Óû§Í¨¹ý¹¥»÷ÕßµÄÍøÕ¾·¢ËÍÇëÇóµ½ÒøÐÐʱ£¬¸ÃÇëÇóµÄRefererÊÇÖ¸Ïò¹¥»÷ÕßµÄÍøÕ¾¡£Òò´Ë£¬Òª·ÀÓùCSRF¹¥»÷£¬ÒøÐÐÍøÕ¾Ö»ÐèÒª¶ÔÓÚÿһ¸öתÕËÇëÇóÑéÖ¤ÆäRefererÖµ£¬Èç¹ûÊÇÒÔbank. test¿ªÍ·µÄÓòÃû£¬Ôò˵Ã÷¸ÃÇëÇóÊÇÀ´×ÔÒøÐÐÍøÕ¾×Ô¼ºµÄÇëÇó£¬ÊǺϷ¨µÄ¡£Èç¹ûRefererÊÇÆäËûÍøÕ¾µÄ»°£¬¾ÍÓпÉÄÜÊÇCSRF¹¥»÷£¬Ôò¾Ü¾ø¸ÃÇëÇó¡£

4.1.2 ÔÚÇëÇóµØÖ·ÖÐÌí¼Ótoken²¢ÑéÖ¤

CSRF¹¥»÷Ö®ËùÒÔÄܹ»³É¹¦£¬ÊÇÒòΪ¹¥»÷Õß¿ÉÒÔαÔìÓû§µÄÇëÇ󣬸ÃÇëÇóÖÐËùÓеÄÓû§ÑéÖ¤ÐÅÏ¢¶¼´æÔÚÓÚCookieÖУ¬Òò´Ë¹¥»÷Õß¿ÉÒÔÔÚ²»ÖªµÀÕâЩÑéÖ¤ÐÅÏ¢µÄÇé¿öÏÂÖ±½ÓÀûÓÃÓû§×Ô¼ºµÄCookieÀ´Í¨¹ý°²È«ÑéÖ¤¡£ÓÉ´Ë¿ÉÖª£¬µÖÓùCSRF¹¥»÷µÄ¹Ø¼üÔÚÓÚ£ºÔÚÇëÇóÖзÅÈë¹¥»÷ÕßËù²»ÄÜαÔìµÄÐÅÏ¢£¬²¢ÇÒ¸ÃÐÅÏ¢²»´æÔÚÓÚCookieÖ®ÖС£¼øÓÚ´Ë£¬ÏµÍ³¿ª·¢Õß¿ÉÒÔÔÚHTTPÇëÇóÖÐÒÔ²ÎÊýµÄÐÎʽ¼ÓÈëÒ»¸öËæ»ú²úÉúµÄtoken£¬²¢ÔÚ·þÎñÆ÷¶Ë½¨Á¢Ò»¸öÀ¹½ØÆ÷À´ÑéÖ¤Õâ¸ötoken£¬Èç¹ûÇëÇóÖÐûÓÐtoken»òÕßtokenÄÚÈݲ»ÕýÈ·£¬ÔòÈÏΪ¿ÉÄÜÊÇCSRF¹¥»÷¶ø¾Ü¾ø¸ÃÇëÇó¡£

4.1.3 ÔÚHTTPÍ·ÖÐ×Ô¶¨ÒåÊôÐÔ²¢ÑéÖ¤

×Ô¶¨ÒåÊôÐԵķ½·¨Ò²ÊÇʹÓÃtoken²¢½øÐÐÑéÖ¤£¬ºÍǰһÖÖ·½·¨²»Í¬µÄÊÇ£¬ÕâÀï²¢²»ÊǰÑtokenÒÔ²ÎÊýµÄÐÎʽÖÃÓÚHTTPÇëÇóÖ®ÖУ¬¶øÊǰÑËü·Åµ½HTTPÍ·ÖÐ×Ô¶¨ÒåµÄÊôÐÔÀͨ¹ýXMLHttpRequestÕâ¸öÀ࣬¿ÉÒÔÒ»´ÎÐÔ¸øËùÓиÃÀàÇëÇó¼ÓÉÏcsrftokenÕâ¸öHTTPÍ·ÊôÐÔ£¬²¢°ÑtokenÖµ·ÅÈëÆäÖС£ÕâÑù½â¾öÁËǰһÖÖ·½·¨ÔÚÇëÇóÖмÓÈëtokenµÄ²»±ã£¬Í¬Ê±£¬Í¨¹ýÕâ¸öÀàÇëÇóµÄµØÖ·²»»á±»¼Ç¼µ½ä¯ÀÀÆ÷µÄµØÖ·À¸£¬Ò²²»Óõ£ÐÄtoken»áͨ¹ýRefererй¶µ½ÆäËûÍøÕ¾¡£

4.2 Óû§¶ËµÄ·ÀÓù

¶ÔÓÚÆÕͨÓû§À´Ëµ£¬¶¼Ñ§Ï°²¢¾ß±¸ÍøÂ簲ȫ֪ʶÒÔ·ÀÓùÍøÂç¹¥»÷ÊDz»ÏÖʵµÄ¡£µ«ÈôÓû§Ñø³ÉÁ¼ºÃµÄÉÏÍøÏ°¹ß£¬ÔòÄܹ»ºÜ´ó³Ì¶ÈÉϼõÉÙCSRF¹¥»÷µÄΣº¦¡£ÀýÈ磬Óû§ÉÏÍøÊ±£¬²»ÒªÇáÒ×µã»÷ÍøÂçÂÛ̳¡¢ÁÄÌìÊÒ¡¢¼´Ê±Í¨Ñ¶¹¤¾ß»òµç×ÓÓʼþÖгöÏÖµÄÁ´½Ó»òÕßͼƬ£»¼°Ê±Í˳ö³¤Ê±¼ä²»Ê¹ÓõÄÒѵǼÕË»§£¬ÓÈÆäÊÇϵͳ¹ÜÀíÔ±£¬Ó¦¾¡Á¿ÔڵdzöϵͳµÄÇé¿öϵã»÷δ֪Á´½ÓºÍͼƬ¡£³ý´ËÖ®Í⣬Óû§»¹ÐèÒªÔÚÁ¬½Ó»¥ÁªÍøµÄ¼ÆËã»úÉϰ²×°ºÏÊʵݲȫ·À»¤Èí¼þ£¬²¢¼°Ê±¸üÐÂÈí¼þ³§ÉÌ·¢²¼µÄÌØÕ÷¿â£¬ÒÔ±£³Ö°²È«Èí¼þ¶Ô×îй¥»÷µÄʵʱ¸ú×Ù¡£

4.3 °²È«É豸µÄ·ÀÓù

ÓÉÓÚ´Ó©¶´µÄ·¢ÏÖµ½²¹¶¡µÄ·¢²¼ÐèÒªÒ»¶¨µÄʱ¼ä£¬¶øÇÒÏ൱±ÈÀýµÄ³§É̶Ô©¶´·´Ó¦²»»ý¼«£¬ÔÙ¼ÓÖ®²¿·Öϵͳ¹ÜÀíÔ±¶Ôϵͳ²¹¶¡µÄ²»¹»ÖØÊÓ£¬ÕâЩ¶¼¸øÁ˹¥»÷Õ߿ɳËÖ®»ú¡£¼øÓÚÉÏÊö¸÷ÖÖÇé¿ö£¬Óû§¿ÉÒÔ½èÖúµÚÈý·½µÄרҵ°²È«É豸¼ÓÇ¿¶ÔCSRF©¶´µÄ·ÀÓù¡£

CSRF¹¥»÷µÄ±¾ÖÊÊǹ¥»÷ÕßαÔìÁ˺Ϸ¨µÄÉí·Ý£¬¶Ôϵͳ½øÐзÃÎÊ¡£Èç¹ûÄܹ»Ê¶±ð³ö·ÃÎÊÕßµÄαÔìÉí·Ý£¬Ò²¾ÍÄÜʶ±ðCSRF¹¥»÷¡£Ñо¿·¢ÏÖ£¬ÓÐЩ³§É̵ݲȫ²úÆ·ÄÜ»ùÓÚÓ²¼þ²ãÃæ¶ÔHTTPÍ·²¿µÄReferer×Ö¶ÎÄÚÈݽøÐмì²éÀ´¿ìËÙ׼ȷµÄʶ±ðCSRF¹¥»÷¡£Í¼3չʾÁËÕâÖÖ·ÀÓù·½Ê½µÄ¼òͼ¡£Ä¿Ç°H3C¹«Ë¾µÄIPS²úÆ·²ÉÓÃÁËÌØÊâ¼¼Êõ£¬Ö§³Ö¶Ô²¿·Ö³£ÓÃϵͳµÄCSRF©¶´¹¥»÷½øÐмì²âºÍ×è¶Ï¡£

ͼ3 °²È«É豸´«Í³·ÀÓù·½Ê½

5 ½áÊøÓï

CSRF¹¥»÷×÷ΪһÖÖ´æÔÚÒѾõĹ¥»÷·½Ê½£¬ÔÚ´óÁ¿µÄÉÌÒµÍøÕ¾É϶¼¿ÉÒÔÕÒ³ö¡£¶Ô¹ã´óϵͳά»¤ÕßÀ´ËµÐèÒªÉîÈëÀí½âCSRF¹¥»÷£¬²¢Öƶ¨×îÊʺϵ±Ç°ÏµÍ³µÄ·ÀÓù·½°¸£¬ÔÚ²»Ëðº¦Ó¦ÓóÌÐòÐÔÄܵÄǰÌáÏ£¬Ìá¸ßϵͳ°²È«ÐÔ£»¶ø¶Ô¼´½«¿ª·¢µÄÍøÂçÓ¦ÓÃϵͳÀ´Ëµ£¬Éî¿ÌÀí½âCSRFµÄΣº¦ÐÔ£¬ÔÚÉè¼Æ½×¶Î¾Í¿¼Âǵ½¶ÔCSRFµÄ·À·¶½«»áÈ¡µÃʰ빦±¶µÄЧ¹û¡£

   
3876 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

iOSÓ¦Óð²È«¿ª·¢£¬Äã²»ÖªµÀµÄÄÇЩÊÂÊõ
Web°²È«Ö®SQL×¢Èë¹¥»÷
ÒÆ¶¯APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
´ÓGoogle±¸·Ý»¥ÁªÍø¿´¡°Êý¾Ý°²È«¡±
 
Ïà¹ØÎĵµ

web°²È«Éè¼ÆÓë·À»¤
»¥ÁªÍøº£Á¿ÄÚÈݰ²È«´¦Àí¼¼Êõ
ºÚ¿Í¹¥»÷Óë·À·¶¼¼Êõ
WEBºÚºÐ°²È«¼ì²â
 
Ïà¹Ø¿Î³Ì

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

iOSÓ¦Óð²È«¿ª·¢
Web°²È«Ö®SQL×¢Èë¹¥»÷
APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
³õ̽PHPµÄSQL×¢Èë¹¥»÷µÄ¼¼Êõ
´ÓGoogle±¸·Ý¿´¡°Êý¾Ý°²È«¡±

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
×¢²áÐÅÏ¢°²È«×¨ÒµÈËÔ±(CISP)
ÐÅÏ¢°²È«¹ÜÀí
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶

ÖйúÒøÐÐ ÐÅÏ¢°²È«¼¼Êõ¼°Éî¶È·ÀÓù
WebÓ¦Óð²È«¼Ü¹¹¡¢ÈëÇÖ¼ì²âÓë·À»¤
ij²ÆË°ÁìÓòÖªÃûIT·þÎñÉÌ Web°²È«²âÊÔ
ÆÕÈð¿Ë˹ web°²È«Éè¼Æ¡¢²âÊÔÓëÓÅ»¯
±±¾©ºÍÀûʱ ÐÔÄܺͰ²È«ÐÔ²âÊÔ
SUNÖйú¹¤³ÌÑо¿Ôº JSF¿ò¼Ü¡¢°²È«