| ½²½âÁ˹³×Ó³ÌÐòµÄ¹¥·Àʵս£¬²¢ÊµÏÖÁËÒ»Ì×¶Ô¿ò¼ÜÒ³µÄ¼à¿Ø·½°¸£¬½«·À»¤×÷Óõ½ËùÓÐ×ÓÒ³Ãæ¡£
µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇ·À»¤µÄÉî¶ÈÒѾ²î²»¶à£¬µ«¹ã¶È»¹ÓÐËùǷȱ¡£
ÀýÈ磬ÎÒÃǵÄÊôÐÔ¹³×ÓÖ»¿¼ÂÇÁË setAttribute£¬È´ºöÊÓ»¹ÓÐÀàËÆµÄ
setAttributeNode¡£¾¡¹Ü´ÓÀ´²»ÓÃÕâ·½·¨£¬µ«²¢²»ÒâζÈ˼Ҳ»ÄÜʹÓá£
ÀýÈ磬´´½¨ÔªËØÍ¨³£¶¼ÊÇ createElement£¬ÊÂʵÉÏ createElementNS
ͬÑùÒ²¿ÉÒÔ¡£ÉõÖÁ»¹¿ÉÒÔÀûÓÃÏֳɵÄÔªËØ cloneNode£¬Ò²ÄܴﵽĿµÄ¡£Òò´Ë£¬ÕâЩ¶¼ÊDZßÔµ·½·¨¶¼ÊÇÖµµÃ¿¼Âǵġ£
ÏÂÃæÎÒÃǶÔ֮ǰÌÖÂÛ¹ýµÄ¼à¿Øµã£¬½øÐÐÖðÒ»ÉóºË¡£
ÄÚÁªÊ¼þÖ´ÐÐ eval
ÔÚµÚһƪÎÄÕ½áβ̸µ½£¬ÔÚÖ´Ðлص÷µÄʱºò£¬×îºÃÄÜ¼à¿Ø eval£¬setTimeout('...')
ÕâЩÄܹ»½âÎö´úÂëµÄº¯Êý£¬ÒÔ·ÀÖ¹Ö´Ðд¢´æÔÚÆäËûµØ·½µÄ XSS ´úÂë¡£
ÏÈÀ´ÁоÙÏÂÕâÀຯÊý£º
eval ¡¡¡¡setTimeout(String) / setInterval(String) ¡¡¡¡Function ¡¡¡¡execScript / setImmediate(String) |
ÊÂʵÉÏ£¬ÀûÓÃÉÏһƪµÄ¹³×Ó¼¼Êõ£¬ÍêÈ«¿ÉÒÔ°ÑËüÃǶ¼¼à¿ØÆðÀ´¡£µ«ÏÖʵ²¢Ã»ÓÐÎÒÃÇÏëÏóµÄÄÇÑù¼òµ¥¡£
eval ÖØÐ´ÓÐÎÊÌâÂð
eval ²»¾ÍÊǸöº¯Êý£¬ÎªÊ²Ã´²»¿ÉÒÔÖØÐ´£¿
var raw_fn = window.eval; ¡¡¡¡window.eval = function(exp) { ¡¡¡¡alert('Ö´ÐÐeval: ' + exp); ¡¡¡¡return raw_fn.apply(this, arguments); ¡¡¡¡}; ¡¡¡¡console.log(eval('1+1')); |
ÍêȫûÎÊÌâ°¡¡£ÄÇÊÇÒòΪ´úÂëÌ«¼òµ¥ÁË£¬ÏÂÃæÕâ¸ö Demo ¾Í¿ÉÒÔ¿´³öɽկ°æ
eval µÄȱÏÝ£º
(function() { ¡¡¡¡eval('var a=1'); ¡¡¡¡})(); ¡¡¡¡alert(typeof a); ¡¡¡¡Run |
°´Àí˵Ӧ¸Ã undefined ²Å¶Ô£¬½á¹ûÈ´ÊÇ number¡£¾Ö²¿±äÁ¿¶¼Åܵ½È«¾ÖÉÏÀ´ÁË¡£ÕâÊÇʲôÇé¿ö£¿ÊÂʵÉÏ£¬eval
²¢²»ÊÇÕæÕýÒâÒåµÄº¯Êý£¬¶øÊÇÒ»¸ö¹Ø¼ü×Ö£¡ÏëÁ˽âÏêÇéÇë´ÁÕâÀï¡£
Function ÖØÐ´ÓÐÒâÒåÂð
Function ÊÇÒ»¸öÈ«¾Ö±äÁ¿£¬ÖØÐ´ window.Function
ÀíÂÛÉÏÍêÈ«¿ÉÐаɡ£
var raw_fn = window.Function; ¡¡¡¡window.Function = function() { ¡¡¡¡alert('µ÷ÓÃFunction'); ¡¡¡¡return raw_fn.apply(this, arguments); ¡¡¡¡}; ¡¡¡¡var add = Function('a', 'b', 'return a+b'); ¡¡¡¡console.log( add(1, 2) ); |
ÖØÐ´È·Êµ¿ÉÐС£µ«ÏÖʵȴÊDz»¿°Ò»»÷µÄ£ºÒòΪËùÓк¯Êý¶¼ÊÇ Function
ÀàµÄʵÀý£¬ËùÒÔ·ÃÎÊÈκÎÒ»¸öº¯ÊýµÄ constructor ¼´¿ÉµÃµ½ÔʼµÄ Function¡£
ÀýÈç alert.constructor£¬¾Í¿ÉÒÔÈÆ¹ýÎÒÃǵĹ³×Ó¡£ÉõÖÁ¿ÉÒÔÓÃÄäÃûº¯Êý£º
¡¡(function(){}).constructor |
ËùÒÔ£¬Function ÊÇÓÀÔ¶¹³²»×¡µÄ¡£
¶îÍâµÄÖ´Ðз½·¨
¾ÍËã²»ÓÃÕâÀຯÊý£¬ÈÔÓÐÏ൱¶àµÄ°ì·¨Ö´ÐÐ×Ö·û´®£¬ÀýÈ磺
´´½¨½Å±¾£¬innerHTML = ´úÂë
´´½¨½Å±¾£¬Â·¾¶ = data:´úÂë
´´½¨¿ò¼Ü£¬Â·¾¶ = javascript:´úÂë
......
¿´À´£¬ÏëÍêÈ«°ÑÀàËÆ eval µÄÐÐΪ¼à¿ØÆðÀ´£¬ÊDz»ÏÖʵµÄ¡£²»¹ý×÷ΪԤ¾¯£¬ÎÒÃÇÖ»¼à¿Ø
eval£¬setTimeout/Interval Ò²¾Í×ã¹»ÁË¡£
¿ÉÒÉÄ£¿éÀ¹½Ø
µÚ¶þƪ̸ÁËÕ¾ÍâÄ£¿éµÄÀ¹½Ø¡£Ö®ËùÒÔ³ÆÖ®¡ºÄ£¿é¡»¶ø²»ÊÇ¡º½Å±¾¡»£¬²¢·ÇÖ»Óнű¾ÔªËزž߱¸Ö´ÐÐÄÜÁ¦¡£¿ò¼ÜÒ³¡¢²å¼þ¶¼ÊÇ¿ÉÒÔÔËÐдúÂëµÄ¡£
¿ÉÖ´ÐÐÔªËØ
ÎÒÃÇÁоÙÏ£¬ÄÜÖ´ÐÐÔ¶³ÌÄ£¿éµÄÔªËØ£º
½Å±¾ ¡¡¡¡<script src="..." /> ¡¡¡¡¿ò¼Ü ¡¡¡¡<iframe src="..."> ¡¡¡¡<frame src="..."> ¡¡¡¡²å¼þ£¨Flash£© ¡¡¡¡<embed src="..."> ¡¡¡¡<object data="..."> ¡¡¡¡<object><param name="moive|src" value="..."></object> ¡¡¡¡²å¼þ£¨ÆäËû£© ¡¡¡¡<applet codebase="..."> |
ÕâÐ©ÔªËØµÄ·¾¶ÊôÐÔ£¬¶¼Ó¦¸Ã×÷ΪÅŲéµÄ¶ÔÏó¡£
²»¹ý£¬ÓÐÕâô¸öÔªËØµÄ´æÔÚ£¬¿ÉÄܵ¼ÖÂÎÒÃǵÄ·¾¶¼ì²âʧЧ£¬Ëü¾ÍÊÇ£º
ËüÄÜÖØ¶¨ÒåÒ³ÃæµÄÏà¶Ô·¾¶£¬ÏÔÈ»ÊDz»ÈݺöÊӵġ£
ÊÂʵÉÏ£¬³ýÁËʹÓÃÔªËØÀ´Ö´ÐÐÕ¾ÍâÄ£¿é£¬»¹¿ÉÒÔʹÓÃÍøÂçͨÐÅ£¬»ñµÃÕ¾ÍâµÄ½Å±¾´úÂ룬ȻºóÔÙµ÷ÓÃ
eval Ö´ÐУº
AJAX
ĿǰÖ÷Á÷ä¯ÀÀÆ÷¶¼Ö§³Ö¿çÓòÇëÇó£¬Ö»Òª·þÎñ¶ËÔÊÐí¾Í¿ÉÒÔ¡£Òò´Ë£¬ÎÒÃÇÐè¼à¿Ø
XMLHttpRequest::open ·½·¨¡£Èç¹ûÇëÇóµÄÊÇÕ¾ÍâµØÖ·£¬¾ÍµÃ×ö²ßÂÔÆ¥Åä¡£²»Í¨¹ýÔò·ÅÆúÏòÉϵ÷Ó㬻òÕßÅ׳öÒ»¸öÒì³££¬»òÕ߸ø
XHR ²úÉúÒ»¸ö 400 ״̬¡£
WebSocket
WebSocket ºÍ XHR ÀàËÆ£¬Ò²ÄÜͨ¹ý¹³×ӵķ½·¨½øÐÐ¼à¿Ø¡£
²»¹ý£¬ÖµµÃ×¢ÒâµÄÊÇ£¬WebSocket ²¢·ÇÊǸöº¯Êý£¬¶øÊÇÒ»¸öÀà¡£Òò´Ë£¬ÔÚ·µ»ØÊµÀýµÄʱºò£¬±ðÍüÁ˽«
constructor ¸Ä³É×Ô¼ºµÄ¹³×Ó£¬·ñÔò¾Í»áй¶Ôʼ½Ó¿Ú£º
var raw_class = window.WebSocket; ¡¡¡¡window.WebSocket = function WebSocket(url, arg) { ¡¡¡¡alert('WebSocket ÇëÇó£º' + url); ¡¡¡¡var ins = new raw_class(url, arg); ¡¡¡¡// ÇÐ¼Ç ¡¡¡¡ins.constructor = WebSocket; ¡¡¡¡return ins; ¡¡¡¡}; ¡¡¡¡var ws = new WebSocket('ws://127.0.0.1:1000'); |
ÁíÍ⣬ÒòΪËüÊÇÒ»¸öÀ࣬ËùÒÔ²»ÒªºöÂÔÁ˾²Ì¬·½·¨»òÊôÐÔ£º
WebSocket.CONNECTING ¡¡¡¡WebSocket.OPEN ¡¡¡¡... |
Òò´Ë£¬»¹Ð轫ËüÃÇ¿½±´µ½¹³×ÓÉÏ¡£
¿ò¼ÜÒ³ÏûÏ¢
HTML5 ¸³ÓèÁË¿ò¼ÜÒ³¿çÓòͨÐŵÄÄÜÁ¦¡£Èç¹ûûÓÐΪ¿ò¼ÜÔªËØ½¨Á¢°×Ãûµ¥µÄ»°£¬¹¥»÷Õß¿ÉÒÔǶÈë×Ô¼ºµÄ¿ò¼ÜÒ³Ãæ£¬È»ºó½«
XSS ´úÂë postMessage ¸øÖ÷Ò³Ãæ£¬Í¨¹ý eval Ö´ÐС£
²»¹ýΪÁ˰²È«¿¼ÂÇ£¬HTML5 ÔÚÏûϢʼþÀï±£´æÁËÀ´Ô´µØÖ·£¬ÒÔʶ±ðÏûÏ¢ÊÇÄĸöÒ³Ãæ·¢³öµÄ¡£
ÒòΪÊǸöʼþ£¬ÎÒÃÇ¿ÉÒÔʹÓõÚһƪÎÄÕÂÀïÌáµ½µÄ·½·¨£¬¶ÔÆä½øÐв¶»ñ¡£Ã¿µ±ÓÐÏûÏ¢ÊÕµ½Ê±£¬¿ÉÒÔ¸ù¾Ý²ßÂÔ£¬¾ö¶¨ÊÇ·ñ×èÖ¹¸ÃʼþµÄ´«µÝ¡£
// ÎÒÃǵķÀÓùϵͳ (function() { window.addEventListener('message', function(e) { if (confirm('·¢ÏÖÀ´×Ô[' + e.origin + ']µÄÏûÏ¢£º\n\n' + e.data + '\n\nÊÇ·ñÀ¹½Ø£¿')) { e.stopImmediatePropagation(); } }, true); })(); window.addEventListener('message', function(e) { alert('ÊÕµ½:' + e.data) }) postMessage('hello', '*'); Run |

µ±È»£¬Èç¹ûÅäÖÃÁË¿ò¼ÜÒ³µÄ°×Ãûµ¥£¬¾ÍÄÜÍêÈ«±ÜÃâÕâ»ØÊÂÁË¡£ËùÒÔÕâÏî·ÀÓù¿ÉÒÔÑ¡ÔñÐԵĿªÆô¡£
ʼþÔ´
HTML5 ÐÂÔöÁËÒ»¸ö½Ð EventSource µÄ½Ó¿Ú¡£²»¹ýÆäÓ÷¨Óë
WebSocket ·Ç³£ÏàËÆ£¬Òò´Ë¿ÉÒÔʹÓÃÀàËÆµÄ¹³×Ó½øÐзÀÓù¡£
µ½´Ë£¬ÎÒÃÇÁоÙÁ˸÷ÖÖÄÜÖ´ÐÐÔ¶³ÌÄ£¿éµÄ·½Ê½¡£ÊÂʵÉÏ£¬¶ÔÆä·ÀÓù²¢²»ÄÑ£¬ÄѵÄÊÇÊÕ¼¯ÕâЩ¼à¿Øµã£¬×öµ½µÎË®²»Â©¡£
API ¹³×Ó
¶ÔÓÚ¶¯Ì¬´´½¨µÄ¿ÉÖ´ÐÐÄ£¿é£¬ÎÒÃÇͨ¹ýÊôÐÔ¹³×Ó£¬À´¼à¿ØÆäÔ¶³Ì·¾¶¡£
´´½¨ÔªËصķ½·¨
ÕâÒ»½ÚÊÇÕë¶Ô Chrome µÄ£¬ÒòΪËü²»Ö§³ÖÔÉú·ÃÎÊÆ÷¡£
createElement / createElementNS ÎÞÖÐÉúÓÐ
cloneNode ¿Ë¡ÏÖÓÐ
innerHTML / outerHTML ¹¤³§´´½¨
ǰÁ½ÖÖ£¬Í¨¹ý¹³×Ó³ÌÐòºÜÈÝÒ×ʵÏÖ¡£
µÚÈýÖÖ£¬ÒòΪ inner/outerHTML ÊÇÔªËØµÄ property£¬¶ø·Ç
attribute¡£ÓÉÓÚ Chrome ÊÇÎÞ·¨»ñÈ¡ÔÉú·ÃÎÊÆ÷µÄ£¬ËùÒÔʹÓù³×ӻᵼÖÂÎÞ·¨µ÷ÓÃÉϼ¶½Ó¿Ú¡£
ÔÙÕߣ¬inner/outerHTML ´«½øÀ´µÄÊÇ×Ö·û´®¡£±êÇ©ºÍÊôÐÔÓãÁú»ìÔÓ£¬½âÎö×Ö·û´®¿Ï¶¨ÊDz»¿¿Æ×µÄ¡£ËùÒÔ»¹µÃÏȵ÷ÓÃÔÉú
innerHTML ÅúÁ¿¹¹½¨³ö½Úµã£¬È»ºóÔÙɨÃèÆäÖеÄÔªËØ¡£¶øÕâ¸ö¹ý³ÌÖУ¬½Úµã¹ÒÔØÊ¼þÒѾ´¥·¢ÁË¡£
ËùÒÔ£¬ÎÞÐ迼ÂǵÚÈýÖÖÇé¿ö¡£
Äã¿ÉÄÜ»áÓÐÒÉÎÊ£¬¼ÈÈ»Óýڵã¹ÒÔØÊ¼þ¶¼Äܸ㶨£¬ÎªÊ²Ã´»¹ÒªÇ°ÃæµÄ¹³×Ó£¿Æäʵ£¬ÔÚµÚ¶þƪÎÄÕÂ
ÀïÒѾÏêϸÌÖÂÛÁË£¬¶¯Ì¬´´½¨µÄ½Å±¾Ã»·¨±»Ê¼þÀ¹½Ø£¬ËùÒÔ²ÅÓù³×Ó¡£
¶øÍ¨¹ý innerHTML ²úÉúµÄ½Å±¾£¬ÊDz»»áÖ´Ðеģ¡Õâ¸ö´ó¼Ò¶¼Ìý˵¹ý°É¡£
ÐÞ¸ÄÊôÐԵķÃÎÊÆ÷
ͨ¹ýÔÐÍÁ´µÄ·ÃÎÊÆ÷¹³×Ó£¬¿ÉÒÔÖ±½Ó¼à¿ØÌض¨ÔªËصÄÌØ¶¨ property£¬ÍêÈ«²»Ó°ÏìËûÈË£¬ËùÒÔЧÂʷdz£¸ß¡£¸Õ²ÅÁоÙÁË¿ÉÒÔÖ´ÐÐÔ¶³ÌÄ£¿éµÄÔªËØ£¬ÕâÐ©ÔªËØµÄ·¾¶ÊôÐÔ£¬¶¼µÃ½øÐÐÖØÐ´·ÃÎÊÆ÷¡£
µ±È» Chrome ¿ÉÒÔºöÂÔÕâ½Ú¡£
ÐÞ¸ÄÊôÐԵķ½·¨
¿ªÍ·Ò²Ìáµ½ÁË£¬³ýÁË setAttribute Í⣬ʹÓà setAttributeNode
Ò²ÄÜÉèÖÃÊôÐÔ£¬ÉõÖÁ»¹ÓÐ setAttributeNS °æ±¾µÄ¡£
ÓÉÓÚ setAttribute ÊǸö¾³£µ÷Óõķ½·¨£¬Òò´Ë¹³×Ó³ÌÐò±ØÐë×ö×ã¹»µÄÓÅ»¯£¬½«¶îÍâµÄ¼ì²âÏûºÄ½µµ½×îµÍ¡£
ÐÂÒ³Ãæ»·¾³
³ýÁËʹÓÃ×î¼òµ¥µÄ¿ò¼Ü£¬Æäʵ»¹ÓÐÆäËû¿ÉÒÔ»ñµÃÐÂÒ³ÃæµÄ;¾¶¡£
µ¯´°
ͨ¹ýµ¯´°Ò²ÄÜ»ñµÃÐÂÒ³Ãæ»·¾³£¬´ó¼Ò¶¼ÖªµÀ¡£µ«ÊÇ´°¿Ú¹Ø±Õ£¬Ò²ËæÖ®Ïú»ÙÁË£¬ÄѵÀ»¹ÄÜʹÓÃÂ𣿲»·Á²âÊÔһϣº
<style> .aa { color: red }</style> <button id="btn">POPUP</button> <script> btn.onclick = function() { var win = window.open(); var raw_fn = win.Element.prototype.setAttribute; win.close(); setTimeout(function() { console.log(raw_fn); raw_fn.call(btn, 'class', 'aa'); }, 1000); }; </script> Run |
¾¡¹Ü»áÓÐ˲¼äµÄÉÁ¶¯£¬µ«´Óд°¿ÚÀï»ñÈ¡µÄ±äÁ¿È·Êµ±»±£ÁôÏÂÀ´ÁË£¬²¢ÇÒÒÀÈ»Æð×÷Óá£ÒòΪÎÒÃÇÒýÓÃ×ÅËü£¬ËùÒÔ¼´Ê¹´°¿Ú¹Ø±Õ£¬ÈÔÈ»²»»á¶ÔÆäÄÚ´æ»ØÊյġ£
ÏÖʵÖУ¬¿ÉÒ԰ѵã»÷ʼþ°óÔÚ document ÉÏ£¬ÕâÑùÓû§Ëæ±ãµãÄÄÀï¶¼ÄÜ´¥·¢£¬ÒÔ´Ë»ñµÃ´¿¾»µÄ»·¾³¡£
Òò´Ë£¬ÎÒÃÇ»¹µÃ°Ñµ¯´°º¯Êý£¬Ò²Í¨¹ý¹³×Ó±£»¤ÆðÀ´¡£
³ýÁË×î³£ÓÃµÄ window.open£¬Æäʵ»¹ÓУº
showModalDialog ¡¡¡¡showModelessDialog ¡¡¡¡opener |
Èç¹ûµ±Ç°ÍøÒ³ÊÇ´ÓÆäËûÒ³Ãæµã»÷´ò¿ªµÄ£¬ÎÞÂÛÊǵ¯´°»¹Êdz¬Á´½Ó£¬window.opener
¶¼¼Ç¼×ÅÀ´Ô´Ò³µÄ»·¾³¡£
Èç¹ûÊÇÀ´Ô´Ò³ºÍ×Ô¼ºÓÖÊÇͬԴվµã£¬ÉõÖÁ»¹ÄÜ·ÃÎʵ½À´Ô´Ò³ÀïÃæµÄ±äÁ¿¡£
ÕâÖÖÇé¿öÏ൱³£¼û¡£ÀýÈç´ÓÌû×ÓÁбíÒ³£¬µã¿ªÒ»¸öÌû×ÓÏêÇéÒ³£¬ÄÇôÏêÇéÒ³ÊÇÍêÈ«¿ÉÒÔ²Ù¿ØÁбíÒ³µÄ¡£
Òª½â¾öÕâ¸öÎÊÌâÒ²²»ÄÑ£¬Ö±½Ó¸ø window.opener ×¢Èë·À»¤³ÌÐò²»¾Í¿ÉÒÔÁË£¬¾ÍÏñ¶Ô´ýгöÏֵĿò¼ÜÒ³ÄÇÑù¡£
µ«ÊÇ£¬window.opener ¿ÉÄÜÒ²ÓÐ×Ô¼ºµÄ opener£¬Ò»²ã²ãµÝ¹éÉÏÈ¥»òÐíÓкܶࡣÿ¸öÒ³ÃæÒ²ÐíÓÖÓÐ×Ô¼ºµÄ¿ò¼ÜÒ³£¬Òò´Ë·À»¤
window.opener ¿ÉÄÜ»áÖ´Ðзdz£¶àµÄ´úÂë¡£Èç¹ûÔÚ³õʼ»¯Ê±¾Í½øÐУ¬»òÐí»áÓÐÐÔÄÜÎÊÌâ¡£
ÊÂʵÉÏ£¬Õâ¸öÀäÃŵÄÊôÐÔ¼¸ºõ²»ÔõôÓõ½¡£ËùÒÔ²»Èç×ö¸öÑÓʱ²ßÂÔ£ºÖ»ÓеÚÒ»´Î·ÃÎÊ
opener µÄʱºò£¬²Å¶ÔÆä½øÐзÀ»¤¡£
ÎÒÃǽ« window.opener ½øÐÐÖØÐ´£¬°ÑËü±ä³ÉÒ»¸ö getter
·ÃÎÊÆ÷£º
var raw_opener = window.opener; var scanned; window.__defineGetter__('opener', function() { if (!scanned) { installHook(raw_opener); scanned = true; } return raw_opener; }); |
ÕâÑù£¬Ö»Òª²»·ÃÎÊ opener£¬¾Í²»»á´¥·¢¶ÔËüµÄ·À»¤£¬×öµ½ÕæÕý°´ÐèÖ´ÐС£
ºó¼Ç
¹ØÓÚ·À»¤¼à¿Øµã£¬Ò²Ã»ÓÐÒ»¸öÍêÕûµÄ´ð°¸£¬ÄÜÏëµ½¶àÉÙËã¶àÉÙ£¬ÒÔºó¿ÉÒÔÂýÂý²¹³ä¡£
µ«ÊÇ£¬×°ÁËÄÇô¶àµÄ¹³×Ó¼°Ê¼þ£¬¶ÔÒ³ÃæµÄÐÔÄÜÓ°ÏìÓжà´óÄØ£¿
ËùÒÔ£¬ÎÒÃÇ»¹µÃ¿ª·¢Ò»¸ö²âÊÔ¿ØÖÆÌ¨£¬À´¸ú×ÙÕâÌ×ϵͳ¡£¿´¿´¼à¿ØÈ«¿ªÊ±£¬»á¶ÔÒ³Ãæ²úÉú¶à´óÓ°Ïì¡£
|