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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓƵ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
CSRF¹¥»÷µÄÓ¦¶ÔÖ®µÀ
 
×÷Õߣºcyjay5un À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2015-8-25
  1889  次浏览      19

CSRF£¨Cross Site Request Forgery, ¿çÕ¾ÓòÇëÇóαÔ죩ÊÇÒ»ÖÖÍøÂçµÄ¹¥»÷·½Ê½£¬¸Ã¹¥»÷¿ÉÒÔÔÚÊܺ¦ÕߺÁ²»ÖªÇéµÄÇé¿öÏÂÒÔÊܺ¦ÕßÃûÒåαÔìÇëÇó·¢Ë͸øÊܹ¥»÷Õ¾µã£¬´Ó¶øÔÚ²¢Î´ÊÚȨµÄÇé¿öÏÂÖ´ÐÐÔÚȨÏÞ±£ »¤Ö®ÏµIJÙ×÷£¬ÓкܴóµÄΣº¦ÐÔ¡£È»¶ø£¬¸Ã¹¥»÷·½Ê½²¢²»Îª´ó¼ÒËùÊìÖª£¬ºÜ¶àÍøÕ¾¶¼ÓÐ CSRF µÄ°²È«Â©¶´¡£±¾ÎÄÊ×ÏȽéÉÜ CSRF µÄ»ù±¾Ô­ÀíÓëÆäΣº¦ÐÔ£¬È»ºó¾ÍÄ¿Ç°³£Óõļ¸ÖÖ·ÀÓù·½·¨½øÐзÖÎö£¬±È½ÏÆäÓÅÁÓ¡£×îºó£¬±¾ÎĽ«ÒÔʵÀýչʾÈçºÎÔÚÍøÕ¾ÖзÀÓù CSRF µÄ¹¥»÷£¬²¢·ÖÏíһЩ¿ª·¢¹ý³ÌÖеÄ×î¼Ñʵ¼ù¡£

CSRF ±³¾°Óë½éÉÜ

CSRF£¨Cross Site Request Forgery, ¿çÕ¾ÓòÇëÇóαÔ죩ÊÇÒ»ÖÖÍøÂçµÄ¹¥»÷·½Ê½£¬ËüÔÚ 2007 ÄêÔø±»ÁÐΪ»¥ÁªÍø 20 ´ó°²È«Òþ»¼Ö®Ò»¡£ÆäËû°²È«Òþ»¼£¬±ÈÈç SQL ½Å±¾×¢È룬¿çÕ¾Óò½Å±¾¹¥»÷µÈÔÚ½üÄêÀ´ÒѾ­Öð½¥ÎªÖÚÈËÊìÖª£¬ºÜ¶àÍøÕ¾Ò²¶¼Õë¶ÔËûÃǽøÐÐÁË·ÀÓù¡£È»¶ø£¬¶ÔÓÚ´ó¶àÊýÈËÀ´Ëµ£¬CSRF È´ÒÀÈ»ÊÇÒ»¸öÄ°ÉúµÄ¸ÅÄî¡£¼´±ãÊÇ´óÃû¶¦¶¦µÄ Gmail, ÔÚ 2007 Äêµ×Ò²´æÔÚ×Å CSRF ©¶´£¬´Ó¶ø±»ºÚ¿Í¹¥»÷¶øʹ Gmail µÄÓû§Ôì³É¾Þ´óµÄËðʧ¡£

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 µÄ¹¥»÷·½Ê½£¬ËûÏÈ×Ô¼º×öÒ»¸öÍøÕ¾£¬ÔÚÍøÕ¾ÖзÅÈëÈçÏ´úÂ룺 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 ¹¥»÷µÄ¶ÔÏó

ÔÚÌÖÂÛÈçºÎµÖÓù CSRF ֮ǰ£¬ÏÈÒªÃ÷È· CSRF ¹¥»÷µÄ¶ÔÏó£¬Ò²¾ÍÊÇÒª±£»¤µÄ¶ÔÏó¡£´ÓÒÔÉϵÄÀý×Ó¿ÉÖª£¬CSRF ¹¥»÷ÊǺڿͽèÖúÊܺ¦ÕßµÄ cookie Æ­È¡·þÎñÆ÷µÄÐÅÈΣ¬µ«ÊǺڿͲ¢²»ÄÜÄõ½ cookie£¬Ò²¿´²»µ½ cookie µÄÄÚÈÝ¡£ÁíÍ⣬¶ÔÓÚ·þÎñÆ÷·µ»ØµÄ½á¹û£¬ÓÉÓÚä¯ÀÀÆ÷ͬԴ²ßÂÔµÄÏÞÖÆ£¬ºÚ¿ÍÒ²ÎÞ·¨½øÐнâÎö¡£Òò´Ë£¬ºÚ¿ÍÎÞ·¨´Ó·µ»ØµÄ½á¹ûÖеõ½Èκζ«Î÷£¬ËûËùÄÜ×öµÄ¾ÍÊǸø·þÎñ Æ÷·¢ËÍÇëÇó£¬ÒÔÖ´ÐÐÇëÇóÖÐËùÃèÊöµÄÃüÁÔÚ·þÎñÆ÷¶ËÖ±½Ó¸Ä±äÊý¾ÝµÄÖµ£¬¶ø·ÇÇÔÈ¡·þÎñÆ÷ÖеÄÊý¾Ý¡£ËùÒÔ£¬ÎÒÃÇÒª±£»¤µÄ¶ÔÏóÊÇÄÇЩ¿ÉÒÔÖ±½Ó²úÉúÊý¾Ý¸Ä±äµÄ·þ Îñ£¬¶ø¶ÔÓÚ¶ÁÈ¡Êý¾ÝµÄ·þÎñ£¬Ôò²»ÐèÒª½øÐÐ CSRF µÄ±£»¤¡£±ÈÈçÒøÐÐϵͳÖÐתÕ˵ÄÇëÇó»áÖ±½Ó¸Ä±äÕË»§µÄ½ð¶î£¬»áÔâµ½ CSRF ¹¥»÷£¬ÐèÒª±£»¤¡£¶ø²éѯÓà¶îÊǶԽð¶îµÄ¶ÁÈ¡²Ù×÷£¬²»»á¸Ä±äÊý¾Ý£¬CSRF ¹¥»÷ÎÞ·¨½âÎö·þÎñÆ÷·µ»ØµÄ½á¹û£¬ÎÞÐè±£»¤¡£

µ±Ç°·ÀÓù CSRF µÄ¼¸ÖÖ²ßÂÔ

ÔÚÒµ½çÄ¿Ç°·ÀÓù CSRF ¹¥»÷Ö÷ÒªÓÐÈýÖÖ²ßÂÔ£ºÑéÖ¤ HTTP Referer ×ֶΣ»ÔÚÇëÇóµØÖ·ÖÐÌí¼Ó token ²¢ÑéÖ¤£»ÔÚ HTTP Í·ÖÐ×Ô¶¨ÒåÊôÐÔ²¢ÑéÖ¤¡£ÏÂÃæ¾Í·Ö±ð¶ÔÕâÈýÖÖ²ßÂÔ½øÐÐÏêϸ½éÉÜ¡£

ÑéÖ¤ 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 ¹¥»÷£¬¾Ü¾øºÏ·¨Óû§µÄ·ÃÎÊ¡£

ÔÚÇëÇóµØÖ·ÖÐÌí¼Ó 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 ¹¦ÄܵÄÔ­Òò¡£

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

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

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

Java ´úÂëʾÀý

ÏÂÎĽ«ÒÔ Java ΪÀý£¬¶ÔÉÏÊöÈýÖÖ·½·¨·Ö±ðÓôúÂë½øÐÐʾÀý¡£ÎÞÂÛʹÓúÎÖÖ·½·¨£¬ÔÚ·þÎñÆ÷¶ËµÄÀ¹½ØÆ÷±Ø²»¿ÉÉÙ£¬Ëü½«¸ºÔð¼ì²éµ½À´µÄÇëÇóÊÇ·ñ·ûºÏÒªÇó£¬È»ºóÊÓ½á¹û¶ø¾ö¶¨ÊÇ·ñ¼Ì ÐøÇëÇó»òÕ߶ªÆú¡£ÔÚ Java ÖУ¬À¹½ØÆ÷ÊÇÓÉ Filter À´ÊµÏֵġ£ÎÒÃÇ¿ÉÒÔ±àдһ¸ö Filter£¬²¢ÔÚ web.xml ÖжÔÆä½øÐÐÅäÖã¬Ê¹Æä¶ÔÓÚ·ÃÎÊËùÓÐÐèÒª CSRF ±£»¤µÄ×ÊÔ´µÄÇëÇó½øÐÐÀ¹½Ø¡£

ÔÚ filter ÖжÔÇëÇóµÄ Referer ÑéÖ¤´úÂëÈçÏÂ

Çåµ¥ 1. ÔÚ Filter ÖÐÑéÖ¤ Referer

// ´Ó HTTP Í·ÖÐÈ¡µÃ Referer Öµ
2 String referer=request.getHeader("Referer");
3 // ÅÐ¶Ï Referer ÊÇ·ñÒÔ bank.example ¿ªÍ·
4 if((referer!=null) &&(referer.trim().startsWith(¡°bank.example¡±))){
5 chain.doFilter(request, response);
6 }else{
7 request.getRequestDispatcher(¡°error.jsp¡±).forward(request,response);
8 }

ÒÔÉÏ´úÂëÏÈÈ¡µÃ Referer Öµ£¬È»ºó½øÐÐÅжϣ¬µ±Æä·Ç¿Õ²¢ÒÔ bank.example ¿ªÍ·Ê±£¬Ôò¼ÌÐøÇëÇ󣬷ñÔòµÄ»°¿ÉÄÜÊÇ CSRF ¹¥»÷£¬×ªµ½ error.jsp Ò³Ãæ¡£

Èç¹ûÒª½øÒ»²½ÑéÖ¤ÇëÇóÖÐµÄ token Öµ£¬´úÂëÈçÏÂ

Çåµ¥ 2. ÔÚ filter ÖÐÑéÖ¤ÇëÇóÖÐµÄ token

HttpServletRequest req = (HttpServletRequest)request; 
2 HttpSession s = req.getSession();
3
4 // ´Ó session Öеõ½ csrftoken ÊôÐÔ
5 String sToken = (String)s.getAttribute(¡°csrftoken¡±);
6 if(sToken == null){
7
8 // ²úÉúÐ嵀 token ·ÅÈë session ÖÐ
9 sToken = generateToken();
10 s.setAttribute(¡°csrftoken¡±,sToken);
11 chain.doFilter(request, response);
12 } else{
13
14 // ´Ó HTTP Í·ÖÐÈ¡µÃ csrftoken
15 String xhrToken = req.getHeader(¡°csrftoken¡±);
16
17 // ´ÓÇëÇó²ÎÊýÖÐÈ¡µÃ csrftoken
18 String pToken = req.getParameter(¡°csrftoken¡±);
19 if(sToken != null && xhrToken != null && sToken.equals(xhrToken)){
20 chain.doFilter(request, response);
21 }else if(sToken != null && pToken != null && sToken.equals(pToken)){
22 chain.doFilter(request, response);
23 }else{
24 request.getRequestDispatcher(¡°error.jsp¡±).forward(request,response);
25 }
26 }

Ê×ÏÈÅÐ¶Ï session ÖÐÓÐûÓÐ csrftoken£¬Èç¹ûûÓУ¬ÔòÈÏΪÊǵÚÒ»´Î·ÃÎÊ£¬session ÊÇн¨Á¢µÄ£¬ÕâʱÉú³ÉÒ»¸öÐ嵀 token£¬·ÅÓÚ session Ö®ÖУ¬²¢¼ÌÐøÖ´ÐÐÇëÇó¡£Èç¹û session ÖÐÒѾ­ÓÐ csrftoken£¬Ôò˵Ã÷Óû§ÒѾ­Óë·þÎñÆ÷Ö®¼ä½¨Á¢ÁËÒ»¸ö»îÔ¾µÄ session£¬ÕâʱҪ¿´Õâ¸öÇëÇóÖÐÓÐûÓÐͬʱ¸½´øÕâ¸ö token£¬ÓÉÓÚÇëÇó¿ÉÄÜÀ´×ÔÓÚ³£¹æµÄ·ÃÎÊ»òÊÇ XMLHttpRequest Òì²½·ÃÎÊ£¬ÎÒÃÇ·Ö±ð³¢ÊÔ´ÓÇëÇóÖлñÈ¡ csrftoken ²ÎÊýÒÔ¼°´Ó HTTP Í·ÖлñÈ¡ csrftoken ×Ô¶¨ÒåÊôÐÔ²¢Óë session ÖеÄÖµ½øÐбȽϣ¬Ö»ÒªÓÐÒ»¸öµØ·½´øÓÐÓÐЧ token£¬¾ÍÅж¨ÇëÇóºÏ·¨£¬¿ÉÒÔ¼ÌÐøÖ´ÐУ¬·ñÔò¾Íתµ½´íÎóÒ³Ãæ¡£Éú³É token ÓкܶàÖÖ·½·¨£¬ÈκεÄËæ»úËã·¨¶¼¿ÉÒÔʹÓã¬Java µÄ UUID ÀàÒ²ÊÇÒ»¸ö²»´íµÄÑ¡Ôñ¡£

³ýÁËÔÚ·þÎñÆ÷¶ËÀûÓà filter À´ÑéÖ¤ token µÄÖµÒÔÍ⣬ÎÒÃÇ»¹ÐèÒªÔÚ¿Í»§¶Ë¸øÿ¸öÇëÇ󸽼ÓÉÏÕâ¸ö token£¬ÕâÊÇÀûÓà js À´¸ø html ÖеÄÁ´½ÓºÍ±íµ¥ÇëÇóµØÖ·¸½¼Ó csrftoken ´úÂ룬ÆäÖÐÒѶ¨Òå token Ϊȫ¾Ö±äÁ¿£¬ÆäÖµ¿ÉÒÔ´Ó session Öеõ½¡£

Çåµ¥ 3. ÔÚ¿Í»§¶Ë¶ÔÓÚÇëÇó¸½¼Ó token

function appendToken(){ 
2 updateForms();
3 updateTags();
4 }
5
6 function updateForms() {
7 // µÃµ½Ò³ÃæÖÐËùÓÐµÄ form ÔªËØ
8 var forms = document.getElementsByTagName('form');
9 for(i=0; i<forms.length; i++) {
10 var url = forms[i].action;
11
12 // Èç¹ûÕâ¸ö form µÄ action ֵΪ¿Õ£¬Ôò²»¸½¼Ó csrftoken
13 if(url == null || url == "" ) continue;
14
15 // ¶¯Ì¬Éú³É input ÔªËØ£¬¼ÓÈëµ½ form Ö®ºó
16 var e = document.createElement("input");
17 e.name = "csrftoken";
18 e.value = token;
19 e.type="hidden";
20 forms[i].appendChild(e);
21 }
22 }
23
24 function updateTags() {
25 var all = document.getElementsByTagName('a');
26 var len = all.length;
27
28 // ±éÀúËùÓÐ a ÔªËØ
29 for(var i=0; i<len; i++) {
30 var e = all[i];
31 updateTag(e, 'href', token);
32 }
33 }
34
35 function updateTag(element, attr, token) {
36 var location = element.getAttribute(attr);
37 if(location != null && location != '' '' ) {
38 var fragmentIndex = location.indexOf('#');
39 var fragment = null;
40 if(fragmentIndex != -1){
41
42 //url Öк¬ÓÐÖ»Ï൱ҳµÄê±ê¼Ç
43 fragment = location.substring(fragmentIndex);
44 location = location.substring(0,fragmentIndex);
45 }
46
47 var index = location.indexOf('?');
48
49 if(index != -1) {
50 //url ÖÐÒѺ¬ÓÐÆäËû²ÎÊý
51 location = location + '&csrftoken=' + token;
52 } else {
53 //url ÖÐûÓÐÆäËû²ÎÊý
54 location = location + '?csrftoken=' + token;
55 }
56 if(fragment != null){
57 location += fragment;
58 }
59
60 element.setAttribute(attr, location);
61 }
62 }

ÔÚ¿Í»§¶Ë html ÖУ¬Ö÷ÒªÊÇÓÐÁ½¸öµØ·½ÐèÒª¼ÓÉÏ token£¬Ò»¸öÊÇ±íµ¥ form£¬ÁíÒ»¸ö¾ÍÊÇÁ´½Ó a¡£Õâ¶Î´úÂëÊ×ÏȱéÀúËùÓÐµÄ form£¬ÔÚ form ×îºóÌí¼ÓÒ»Òþ²Ø×ֶΣ¬°Ñ csrftoken ·ÅÈëÆäÖС£È»ºó£¬´úÂë±éÀúËùÓеÄÁ´½Ó±ê¼Ç a£¬ÔÚÆä href ÊôÐÔÖмÓÈë csrftoken ²ÎÊý¡£×¢Òâ¶ÔÓÚ a.href À´Ëµ£¬¿ÉÄܸÃÊôÐÔÒѾ­ÓвÎÊý£¬»òÕßÓÐê±ê¼Ç¡£Òò´ËÐèÒª·ÖÇé¿öÌÖÂÛ£¬ÒÔ²»Í¬µÄ¸ñʽ°Ñ csrftoken ¼ÓÈëÆäÖС£

Èç¹ûÄãµÄÍøվʹÓà XMLHttpRequest£¬ÄÇô»¹ÐèÒªÔÚ HTTP Í·ÖÐ×Ô¶¨Òå csrftoken ÊôÐÔ£¬ÀûÓà dojo.xhr ¸ø XMLHttpRequest ¼ÓÉÏ×Ô¶¨ÒåÊôÐÔ´úÂëÈçÏ£º

Çåµ¥ 4. ÔÚ HTTP Í·ÖÐ×Ô¶¨ÒåÊôÐÔ

var plainXhr = dojo.xhr; 
2
3 // ÖØд dojo.xhr ·½·¨
4 dojo.xhr = function(method,args,hasBody) {
5 // È·±£ header ¶ÔÏó´æÔÚ
6 args.headers = args.header || {};
7
8 tokenValue = '<%=request.getSession(false).getAttribute("csrftoken")%>';
9 var token = dojo.getObject("tokenValue");
10
11 // °Ñ csrftoken ÊôÐԷŵ½Í·ÖÐ
12 args.headers["csrftoken"] = (token) ? token : " ";
13 return plainXhr(method,args,hasBody);
14 };

ÕâÀï¸ÄдÁË dojo.xhr µÄ·½·¨£¬Ê×ÏÈÈ·±£ dojo.xhr ÖдæÔÚ HTTP Í·£¬È»ºóÔÚ args.headers ÖÐÌí¼Ó csrftoken ×ֶΣ¬²¢°Ñ token Öµ´Ó session ÀïÄóö·ÅÈë×Ö¶ÎÖС£

CSRF ·ÀÓù·½·¨Ñ¡ÔñÖ®µÀ

ͨ¹ýÉÏÎÄÌÖÂÛ¿ÉÖª£¬Ä¿Ç°Òµ½çÓ¦¶Ô CSRF ¹¥»÷ÓÐһЩ¿ËÖÆ·½·¨£¬µ«ÊÇÿÖÖ·½·¨¶¼ÓÐÀû±×£¬Ã»ÓÐÒ»ÖÖ·½·¨ÊÇÍêÃÀµÄ¡£ÈçºÎÑ¡ÔñºÏÊʵķ½·¨·Ç³£ÖØÒª¡£Èç¹ûÍøÕ¾ÊÇÒ»¸öÏÖÓÐϵͳ£¬ÏëÒªÔÚ×î¶Ìʱ¼äÄÚ»ñµÃÒ»¶¨³Ì¶È µÄ CSRF µÄ±£»¤£¬ÄÇôÑéÖ¤ Referer µÄ·½·¨ÊÇ×î·½±ãµÄ£¬ÒªÏëÔö¼Ó°²È«ÐԵĻ°£¬¿ÉÒÔÑ¡Ôñ²»Ö§³ÖµÍ°æ±¾ä¯ÀÀÆ÷£¬±Ï¾¹¾ÍÄ¿Ç°À´Ëµ£¬IE7+, FF3+ ÕâÀà¸ß°æ±¾ä¯ÀÀÆ÷µÄ Referer Öµ»¹ÎÞ·¨±»´Û¸Ä¡£

Èç¹ûϵͳ±ØÐëÖ§³Ö IE6£¬²¢ÇÒÈÔÈ»ÐèÒª¸ß°²È«ÐÔ¡£ÄÇô¾ÍҪʹÓà token À´½øÐÐÑéÖ¤£¬Ôڴ󲿷ÖÇé¿öÏ£¬Ê¹Óà XmlHttpRequest ²¢²»ºÏÊÊ£¬token Ö»ÄÜÒÔ²ÎÊýµÄÐÎʽ·ÅÓÚÇëÇóÖ®ÖУ¬ÈôÄãµÄϵͳ²»Ö§³ÖÓû§×Ô¼º·¢²¼ÐÅÏ¢£¬ÄÇÕâÖ̶ֳȵķÀ»¤ÒѾ­×ã¹»£¬·ñÔòµÄ»°£¬ÄãÈÔÈ»ÄÑÒÔ·À·¶ token ±»ºÚ¿ÍÇÔÈ¡²¢·¢¶¯¹¥»÷¡£ÔÚÕâÖÖÇé¿öÏ£¬ÄãÐèҪСÐĹ滮ÄãÍøÕ¾ÌṩµÄ¸÷ÖÖ·þÎñ£¬´ÓÖмäÕÒ³öÄÇЩÔÊÐíÓû§×Ô¼º·¢²¼ÐÅÏ¢µÄ²¿·Ö£¬°ÑËüÃÇÓëÆäËû·þÎñ·Ö¿ª£¬Ê¹Óò»Í¬ µÄ token ½øÐб£»¤£¬ÕâÑù¿ÉÒÔÓÐЧµÖÓùºÚ¿Í¶ÔÓÚÄã¹Ø¼ü·þÎñµÄ¹¥»÷£¬°ÑΣº¦½µµ½×îµÍ¡£±Ï¾¹£¬É¾³ý±ðÈËÒ»¸öÌû×Ó±ÈÖ±½Ó´Ó±ðÈËÕ˺ÅÖÐת×ß´ó±Ê´æ¿îÑÏÖس̶ÈÒªÇáµÄ¶à¡£

Èç ¹ûÊÇ¿ª·¢Ò»¸öȫеÄϵͳ£¬ÔòµÖÓù CSRF µÄÑ¡ÔñÒª´óµÃ¶à¡£±ÊÕß½¨Òé¶ÔÓÚÖØÒªµÄ·þÎñ£¬¿ÉÒÔ¾¡Á¿Ê¹Óà XMLHttpRequest À´·ÃÎÊ£¬ÕâÑùÔö¼Ó token ÒªÈÝÒ׺ܶࡣÁíÍ⾡Á¿±ÜÃâÔÚ js ´úÂëÖÐʹÓø´ÔÓÂß¼­À´¹¹Ôì³£¹æµÄͬ²½ÇëÇóÀ´·ÃÎÊÐèÒª CSRF ±£»¤µÄ×ÊÔ´£¬±ÈÈç window.location ºÍ document.createElement(¡°a¡±) Ö®À࣬ÕâÑùÒ²¿ÉÒÔ¼õÉÙÔÚ¸½¼Ó token ʱ²úÉúµÄ²»±ØÒªµÄÂé·³¡£

×îºó£¬Òª¼Çס CSRF ²»ÊǺڿÍΨһµÄ¹¥»÷ÊֶΣ¬ÎÞÂÛÄã CSRF ·À·¶ÓжàôÑÏÃÜ£¬Èç¹ûÄãϵͳÓÐÆäËû°²È«Â©¶´£¬±ÈÈç¿çÕ¾Óò½Å±¾¹¥»÷ XSS£¬ÄÇôºÚ¿Í¾Í¿ÉÒÔÈƹýÄãµÄ°²È«·À»¤£¬Õ¹¿ª°üÀ¨ CSRF ÔÚÄڵĸ÷ÖÖ¹¥»÷£¬ÄãµÄ·ÀÏß½«ÈçͬÐéÉè¡£

×ܽáÓëÕ¹Íû

¿É¼û£¬CSRF ÊÇÒ»ÖÖΣº¦·Ç³£´óµÄ¹¥»÷£¬ÓÖºÜÄÑÒÔ·À·¶¡£Ä¿Ç°¼¸ÖÖ·ÀÓù²ßÂÔËäÈ»¿ÉÒԺܴó³Ì¶ÈÉϵÖÓù CSRF µÄ¹¥»÷£¬µ«²¢Ã»ÓÐÒ»ÖÖÍêÃÀµÄ½â¾ö·½°¸¡£Ò»Ð©Ðµķ½°¸ÕýÔÚÑо¿Ö®ÖУ¬±ÈÈç¶ÔÓÚÿ´ÎÇëÇó¶¼Ê¹Óò»Í¬µÄ¶¯Ì¬¿ÚÁ°Ñ Referer ºÍ token ·½°¸½áºÏÆðÀ´£¬ÉõÖÁ³¢ÊÔÐÞ¸Ä HTTP ¹æ·¶£¬µ«ÊÇÕâЩеķ½°¸Éв»³ÉÊ죬ҪÕýʽͶÈëʹÓò¢±»Òµ½ç¹ãΪ½ÓÊÜ»¹ÐèʱÈÕ¡£ÔÚÕâ֮ǰ£¬ÎÒÃÇÖ»Óгä·ÖÖØÊÓ CSRF£¬¸ù¾ÝϵͳµÄʵ¼ÊÇé¿öÑ¡Ôñ×îºÏÊʵIJßÂÔ£¬ÕâÑù²ÅÄÜ°Ñ CSRF µÄΣº¦½µµ½×îµÍ¡£

   
1889 ´Îä¯ÀÀ       19
 
Ïà¹ØÎÄÕÂ

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

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

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶
×îл¼Æ»®
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù 8-23[ÌØ»Ý]
LinuxÄں˱à³Ì¼°É豸Çý¶¯ 8-15[±±¾©]
Python¡¢Êý¾Ý·ÖÎöÓë»úÆ÷ѧϰ 8-23[ÌØ»Ý]
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 8-22[ÏßÉÏ]
QTÓ¦Óÿª·¢ 9-5[±±¾©]

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

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

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