精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從一道毫無人性的刁鉆面試題說起

開發(fā) 前端
在 JavaScript 中,你可以不用英文字母與數(shù)字,就執(zhí)行 console.log(1) 嗎?

問題:在 JavaScript 中,你可以不用英文字母與數(shù)字,就執(zhí)行 console.log(1) 嗎?

換句話說,就在于代碼中不能出現(xiàn)任何英文字母(a-zA-Z)與數(shù)字(0-9),除此之外(各種符號)都可以。執(zhí)行式碼之后,會執(zhí)行 console.log(1),然后在控制臺中輸出 1。

如果你想到可以用什么庫或服務(wù)之類的東西做到,別急著說出答案。先自己想一下,看看有沒有辦法自己寫出來。如果能從零開始自己寫出來,就代表你對 js 這個語言以及各種自動類型轉(zhuǎn)換應(yīng)該是很熟悉的。

分析幾個關(guān)鍵點

要能成功執(zhí)行題目所要求的的 console.log(1),必須要完成幾個關(guān)鍵點:

  • 找出執(zhí)行代碼的方法
  • 如何不用字母與數(shù)字得出數(shù)字的方法
  • 如何不用字母與數(shù)字得到字母的方法

只要這三點都解決了,就能達成題目的要求。

先解決第一點:找出執(zhí)行代碼的方法

找出執(zhí)行代碼的方法

直接 console.log 是不可能的,因為就算你用字符串拼出 console,你也沒辦法像 PHP 那樣拿字符串來執(zhí)行函數(shù)。

那 eval 呢?evali 里面可以放字符串,可以是就可以。問題是我們也沒法使用 eval,因為不能用英文字母。

還有什么方法呢?還可以用 function constructor:new Function("console.log(1)") 來執(zhí)行,但問題是我們也不能用 new 這個關(guān)鍵字,所以乍一看也不行,不過不需要 new 也可以,只用 Function("console.log(1)") 就可以創(chuàng)建一個能夠執(zhí)行特定代碼的函數(shù)。

所以接下來的問題就變成了怎樣才能拿到 function constructor,只要能拿到就有機會。

在 JS 中可以用 .Constructor 拿到某個對象的構(gòu)造函數(shù),例如 "".constructor 就會得到:ƒ String() { [native code] },如果你有一個函數(shù),就能拿到 function constructor,像這樣:(()=>{}).constructor,在這個問題中我們不能直接用 .constructor,應(yīng)該用:(()=>{})['constructor']。

如果不支持 ES6 ,不能用箭頭函數(shù)怎么辦,還有辦法得到一個函數(shù)嗎?

有,而且很容易,就是各種內(nèi)置函數(shù),例如說 []['fill']['constructor'],其實就是 [].fill.constructor,或者是 ""['slice']['constructor'],也可以拿到 function constructor,所以這不是個問題,就算沒有箭頭函數(shù)也沒關(guān)系。

一開始我們期望的代碼是這樣:Function('console.log(1)')(),用前面的方法改寫的話,應(yīng)該把前面的 Function 替換成 (()=>{})['constructor'],變成 (()=>{})['constructor']('console.log(1)')()只要想辦法拼湊出這段代碼問題就解決了。現(xiàn)在我們解決了第一個問題:找到執(zhí)行函數(shù)的方法。

如何得到數(shù)字

接下來的數(shù)字就比較簡單了。

這里的關(guān)鍵在與 js 的強制多態(tài),如果你有看過 js 類型轉(zhuǎn)換的文章,或許會記得 {} + [] 可以得出 0 這個數(shù)字。

假設(shè)你不知道這個,我來解釋一下:利用 ! 這個運算符,可以得到 false,例如 1[]或者 !{} 都可以得出 false。然后兩個 false 相加就可得到 0:![] + ![] ,以此類推,既然 ![] 是 false,那前面再加一個 !,!![] 就是 true,所以 ![] + !![] 就等于 false + true,也就是 0 + 1,結(jié)果就是 1。

或者用更簡短的方法,用來 +[] 也可以利用自動類型轉(zhuǎn)換得到 0 這個結(jié)果,那么 +!![] 就是 1。

有了 1 之后,就可以得到所有數(shù)字了,只要一直不斷暴力相加就行了,如果不想這樣做,也可以利用位運算 << >> 或者是乘號,比如說要湊出 8,就是 1 << 3,或者是 2 << 2,要湊出 2 就是(+!![])+(+!![]),所以 (+!![])+(+!![]) << (+!![])+(+!![]) 就是 8,只需要四個 1 就行了,不需要自己加 8 次。

不過現(xiàn)在可以先不考慮長度,只需要考慮能不能湊出來就行了,只要能得出 1 就足夠了。

如何得到字符串

最后就是要想辦法湊出字符串了,或者說要得到 (()=>{})['constructor']('console.log(1)')() 中的每一個字符。

怎樣才能得到字符呢?答案是和數(shù)字一樣,即強制多態(tài)。

上面說過 ![] 可以得到 false,那在后面加一個空字符串:![] + '',不就可以得到 "false" 了嗎?這樣就可以拿到 a, e, f, l, s 這五個字符。例如 (![] + '')[1]就是 a,為了方便紀錄,我們來寫一小段代碼:

  1. const mapping = { 
  2.   a: "(![] + '')[1]", 
  3.   e: "(![] + '')[4]", 
  4.   f: "(![] + '')[0]", 
  5.   l: "(![] + '')[2]", 
  6.   s: "(![] + '')[3]", 

那既然有了false,那么拿到 true 也不是什么難事了,!![] + '' 可以得到 true,現(xiàn)在把代碼改成:

  1. const mapping = { 
  2.   a: "(![] + '')[1]", 
  3.   e: "(![] + '')[4]", 
  4.   f: "(![] + '')[0]", 
  5.   l: "(![] + '')[2]", 
  6.   r: "(!![] + '')[1]", 
  7.   s: "(![] + '')[3]", 
  8.   t: "(!![] + '')[0]", 
  9.   u: "(!![] + '')[2]", 

然后再用同樣的方法,用 ''+{} 可以得到 "[object Object]"(或是你要用神奇的 []+{} 也行),現(xiàn)在代碼可以更新成這樣:

  1. const mapping = { 
  2.   a: "(![] + '')[1]", 
  3.   b: "(''+{})[2]", 
  4.   c: "(''+{})[5]", 
  5.   e: "(![] + '')[4]", 
  6.   f: "(![] + '')[0]", 
  7.   j: "(''+{})[3]", 
  8.   l: "(![] + '')[2]", 
  9.   o: "(''+{})[1]", 
  10.   r: "(!![] + '')[1]", 
  11.   s: "(![] + '')[3]", 
  12.   t: "(!![] + '')[0]", 
  13.   u: "(!![] + '')[2]", 

從數(shù)組或是對象取一個不存在的屬性會返回 undefined,再把 undefined 加上字串,就可以拿到字串的 undefined,就像這樣:[][{}]+'',可以得到 undefined。

拿到之后,我們的轉(zhuǎn)換表就變得更加完整了:

  1. const mapping = { 
  2.   a: "(![] + '')[1]", 
  3.   b: "(''+{})[2]", 
  4.   c: "(''+{})[5]", 
  5.   d: "([][{}]+'')[2]", 
  6.   e: "(![] + '')[4]", 
  7.   f: "(![] + '')[0]", 
  8.   i: "([][{}]+'')[5]", 
  9.   j: "(''+{})[3]", 
  10.   l: "(![] + '')[2]", 
  11.   n: "([][{}]+'')[1]", 
  12.   o: "(''+{})[1]", 
  13.   r: "(!![] + '')[1]", 
  14.   s: "(![] + '')[3]", 
  15.   t: "(!![] + '')[0]", 
  16.   u: "(!![] + '')[2]", 

看一下轉(zhuǎn)換表,再看看我們的目標字符串:(()=>{})['constructor']('console["log"](1)')(),稍微比對一下,就會發(fā)現(xiàn)要湊出 constructor 是沒有問題的,要湊出 console 也是沒問題的,可是就唯獨缺了 log 的 g,目前我們的轉(zhuǎn)換表里面沒有這個字符。

所以還需要從某個地方把 g 拿出來,才能拼湊出我們想要的字符串。或者也可以換個方法,用其他方式拿到字符。

我一開始想到兩個方法,第一個是利用進制轉(zhuǎn)換,把數(shù)字用 toString 轉(zhuǎn)成字符串時可以帶一個參數(shù) radix,代表這個數(shù)字要轉(zhuǎn)換成多少進制,像是 (10).toString(16) 就會得到 a,因為 10 進制的 10 就是 16 進制的 a。

英文字母一共 26 個,數(shù)字有 10 個,所以只要用 (10).toString(36) 就能得到 a,用 (16).toString(36) 就可以得到 g 了,可以用這個方法得到所有的英文字母。可是問題來了, toString 本身也有 g,但現(xiàn)在我們沒有,所以這方法行不通。

另一個方法是用 base64,JS 有兩個內(nèi)置函數(shù):btoa 跟 atob,btoa 是把一個字符串編碼為 base64,例如 btoa('abc') 會得到 YWJj,然后再用 atob('YWJj') 解碼就會得到 abc。

只要想辦法讓 base64 編碼后的結(jié)果有 g 就行了,可以寫代碼去跑,也可以自己慢慢試,幸運的是 btoa(2) 能得到 Mg== 這個字符串。所以 btoa(2)[1] 的結(jié)果就是 g了。

不過下一個問題又來了,怎樣執(zhí)行 btoa?一樣只能通過上面的 function constructor:(()=>{})['constructor']('return btoa(2)[1]')(),這次每一個字符都湊得出來。

可以結(jié)合上面的 mapping,寫一小段簡單的代碼來幫助做轉(zhuǎn)換,目標是把一個字符串轉(zhuǎn)成沒有字符的形式:

  1. const mapping = { 
  2.   a: "(![] + '')[1]", 
  3.   b: "(''+{})[2]", 
  4.   c: "(''+{})[5]", 
  5.   d: "([][{}]+'')[2]", 
  6.   e: "(![] + '')[4]", 
  7.   f: "(![] + '')[0]", 
  8.   i: "([][{}]+'')[5]", 
  9.   j: "(''+{})[3]", 
  10.   l: "(![] + '')[2]", 
  11.   n: "([][{}]+'')[1]", 
  12.   o: "(''+{})[1]", 
  13.   r: "(!![] + '')[1]", 
  14.   s: "(![] + '')[3]", 
  15.   t: "(!![] + '')[0]", 
  16.   u: "(!![] + '')[2]", 
  17.  
  18. const one = '(+!![])' 
  19. const zero = '(+[])' 
  20.  
  21. function transformString(input) { 
  22.   return input.split('').map(char => { 
  23.     // 先假設(shè)數(shù)字只會有個位數(shù),比較好做轉(zhuǎn)換 
  24.     if (/[0-9]/.test(char)) { 
  25.       if (char === '0') return zero 
  26.       return Array(+char).fill().map(_ => one).join('+') 
  27.     } 
  28.     if (/[a-zA-Z]/.test(char)) { 
  29.       return mapping[char] 
  30.     } 
  31.     return `"${char}"` 
  32.   }) 
  33.   // 加上 () 保證執(zhí)行順序 
  34.   .map(char => `(${char})`) 
  35.   .join('+') 
  36.  
  37. const input = 'constructor' 
  38. console.log(transformString(input)) 

輸出是:

  1. ((''+{})[5])+((''+{})[1])+(([][{}]+'')[1])+((![] + '')[3])+((!![] + '')[0])+((!![] + '')[1])+((!![] + '')[2])+((''+{})[5])+((!![] + '')[0])+((''+{})[1])+((!![] + '')[1]) 

可以再寫一個函數(shù)只轉(zhuǎn)換數(shù)字,把數(shù)字去掉:

  1. function transformNumber(input) { 
  2.   return input.split('').map(char => { 
  3.     // 先假設(shè)數(shù)字只會有個位數(shù),比較好做轉(zhuǎn)換 
  4.     if (/[0-9]/.test(char)) { 
  5.       if (char === '0') return zero 
  6.       let newChar = Array(+char).fill().map(_ => one).join('+') 
  7.       return`(${newChar})` 
  8.     } 
  9.     return char 
  10.   }) 
  11.   .join('') 
  12.  
  13. const input = 'constructor' 
  14. console.log(transformNumber(transformString(input))) 

得到的結(jié)果是:

  1. ((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((''+{})[((+!![]))])+(([][{}]+'')[((+!![]))])+((![] + '')[((+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((!![] + '')[((+!![]))])+((!![] + '')[((+!![])+(+!![]))])+((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((''+{})[((+!![]))])+((!![] + '')[((+!![]))]) 

把結(jié)果丟給 console 執(zhí)行,發(fā)現(xiàn)得到的值就是 constructor 沒錯。所以綜合以上代碼,回到剛剛那一段:(()=>{})['constructor']('return btoa(2)[1]')(),要得到轉(zhuǎn)換完的結(jié)果就是:

  1. const con = transformNumber(transformString('constructor')) 
  2. const fn = transformNumber(transformString('return btoa(2)[1]')) 
  3. const result = `(()=>{})[${con}](${fn})()` 
  4. console.log(result) 

結(jié)果很長就不貼了,但確實能得到一個 g。

在繼續(xù)之前,先把代碼改一下,增加一個能直接轉(zhuǎn)換代碼的函數(shù):

  1. function transform(code) { 
  2.   const con = transformNumber(transformString('constructor')) 
  3.   const fn = transformNumber(transformString(code)) 
  4.   const result = `(()=>{})[${con}](${fn})()` 
  5.   return result; 
  6.  
  7. console.log(transform('return btoa(2)[1]')) 

好了,到這里其實已經(jīng)接很近終點了,只有一件事還沒有解決,那就是 btoa 是 WebAPI,瀏覽器才有,node.js 并沒有這個函數(shù),所以想要做得更漂亮,就必須找到其他方式來產(chǎn)生 g 這個字符。

回憶一下一開始所提的,用 function.constructor 可以拿到 function constructor,以此類推,用 ''['constructor'] 可以拿到 string constructor,只要再加上一個字串,就可以拿到 string constructor 的內(nèi)容了!

像是這樣:''['constructor'] + '',得到的結(jié)果是:"function String() { [native code] }",一下子就多了一堆字符串可用,而我們朝思暮想的 g 就是:(''['constructor'] + '')[14]。

由于我們的轉(zhuǎn)換器目前只能支持一位數(shù)的數(shù)字(因為做起來簡單),我們改成:(''['constructor'] + '')[7+7],可以寫成這樣:

  1. mapping['g'] = transform(`return (''['constructor'] + '')[7+7]`) 

整合所有成果

經(jīng)歷過千辛萬苦之后,終于湊出了最麻煩的 g 這個字符,結(jié)合我們剛剛寫好的轉(zhuǎn)換器,就可以順利產(chǎn)生 console.log(1) 去除掉字母與數(shù)字后的版本:

  1. const mapping = { 
  2.   a: "(![] + '')[1]", 
  3.   b: "(''+{})[2]", 
  4.   c: "(''+{})[5]", 
  5.   d: "([][{}]+'')[2]", 
  6.   e: "(![] + '')[4]", 
  7.   f: "(![] + '')[0]", 
  8.   i: "([][{}]+'')[5]", 
  9.   j: "(''+{})[3]", 
  10.   l: "(![] + '')[2]", 
  11.   n: "([][{}]+'')[1]", 
  12.   o: "(''+{})[1]", 
  13.   r: "(!![] + '')[1]", 
  14.   s: "(![] + '')[3]", 
  15.   t: "(!![] + '')[0]", 
  16.   u: "(!![] + '')[2]", 
  17.  
  18. const one = '(+!![])' 
  19. const zero = '(+[])' 
  20.  
  21. function transformString(input) { 
  22.   return input.split('').map(char => { 
  23.     // 先假設(shè)數(shù)字只會有個位數(shù),比較好做轉(zhuǎn)換 
  24.     if (/[0-9]/.test(char)) { 
  25.       if (char === '0') return zero 
  26.       return Array(+char).fill().map(_ => one).join('+') 
  27.     } 
  28.     if (/[a-zA-Z]/.test(char)) { 
  29.       return mapping[char] 
  30.     } 
  31.     return `"${char}"` 
  32.   }) 
  33.   // 加上 () 保證執(zhí)行順序 
  34.   .map(char => `(${char})`) 
  35.   .join('+') 
  36.  
  37. function transformNumber(input) { 
  38.   return input.split('').map(char => { 
  39.     // 先假設(shè)數(shù)字只會有個位數(shù),比較好做轉(zhuǎn)換 
  40.     if (/[0-9]/.test(char)) { 
  41.       if (char === '0') return zero 
  42.       let newChar = Array(+char).fill().map(_ => one).join('+') 
  43.       return`(${newChar})` 
  44.     } 
  45.     return char 
  46.   }) 
  47.   .join('') 
  48.  
  49. function transform(code) { 
  50.   const con = transformNumber(transformString('constructor')) 
  51.   const fn = transformNumber(transformString(code)) 
  52.   const result = `(()=>{})[${con}](${fn})()` 
  53.   return result; 
  54.  
  55. mapping['g'] = transform(`return (''['constructor'] + '')[7+7]`) 
  56. console.log(transform('console.log(1)')) 

最后的代碼:

  1. (()=>{})[((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((''+{})[((+!![]))])+(([][{}]+'')[((+!![]))])+((![] + '')[((+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((!![] + '')[((+!![]))])+((!![] + '')[((+!![])+(+!![]))])+((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((''+{})[((+!![]))])+((!![] + '')[((+!![]))])](((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((''+{})[((+!![]))])+(([][{}]+'')[((+!![]))])+((![] + '')[((+!![])+(+!![])+(+!![]))])+((''+{})[((+!![]))])+((![] + '')[((+!![])+(+!![]))])+((![] + '')[((+!![])+(+!![])+(+!![])+(+!![]))])+(".")+((![] + '')[((+!![])+(+!![]))])+((''+{})[((+!![]))])+((()=>{})[((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((''+{})[((+!![]))])+(([][{}]+'')[((+!![]))])+((![] + '')[((+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((!![] + '')[((+!![]))])+((!![] + '')[((+!![])+(+!![]))])+((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((''+{})[((+!![]))])+((!![] + '')[((+!![]))])](((!![] + '')[((+!![]))])+((![] + '')[((+!![])+(+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((!![] + '')[((+!![])+(+!![]))])+((!![] + '')[((+!![]))])+(([][{}]+'')[((+!![]))])+(" ")+("(")+("'")+("'")+("[")+("'")+((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((''+{})[((+!![]))])+(([][{}]+'')[((+!![]))])+((![] + '')[((+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((!![] + '')[((+!![]))])+((!![] + '')[((+!![])+(+!![]))])+((''+{})[((+!![])+(+!![])+(+!![])+(+!![])+(+!![]))])+((!![] + '')[(+[])])+((''+{})[((+!![]))])+((!![] + '')[((+!![]))])+("'")+("]")+(" ")+("+")+(" ")+("'")+("'")+(")")+("[")+((+!![])+(+!![])+(+!![])+(+!![])+(+!![])+(+!![])+(+!![]))+("+")+((+!![])+(+!![])+(+!![])+(+!![])+(+!![])+(+!![])+(+!![]))+("]"))())+("(")+((+!![]))+((+!![])+(+!![]))+((+!![])+(+!![])+(+!![]))+(")"))() 

用了 1800 個字符,成功寫出了只有:[,],(,),{,},",',+ ,!,=,>這 12 個字符的程序,并且能夠順利執(zhí)行 console.log(1)。

而因為我們已經(jīng)可以順利拿到 String 這幾個字了,所以就可以用之前提過的位轉(zhuǎn)換的方法,得到任意小寫字符,像是這樣:

  1. mapping['S'] = transform(`return (''['constructor'] + '')[9]`) 
  2. mapping['g'] = transform(`return (''['constructor'] + '')[7+7]`) 
  3. console.log(transform('return (35).toString(36)')) // z 

那要怎樣拿到任意大寫字符,或甚至任意字符呢?我也有想到幾種方式。

如果想拿到任意字符,可以通過 String.fromCharCode,或是寫成另一種形式:""['constructor']['fromCharCode'],就可以拿到任意字符。可是在這之前要先想辦法拿到大寫的 C,這個就要再想一下了。

除了這條路,還有另外一條,那就是靠編碼,例如說 '\u0043' 其實給你,看來編碼沒有辦法這樣拼起來(仔細想想發(fā)現(xiàn)滿合理的)。

除了這條路,還有另外一個方法,那就是依靠編碼,例如說 '\u0043' 其實就是大寫的 C,所以我原本以為可以通過這種方法來湊,但試了一下是不行的,像是 console.log("\u0043") 會印出 C 沒錯,但是 console.log(("\u00" + "43")) 就會直接報一個錯誤,看來編碼沒有辦法這樣拼起來。不過仔細想想還是很合理的。

總結(jié)

最后寫出來的那個轉(zhuǎn)換的函數(shù)其實并不完整,沒有辦法執(zhí)行任意代碼碼,沒有繼續(xù)做完是因為 jsfuck

(https://github.com/aemkei/jsfuck) 這個庫已經(jīng)寫得很清楚了,在 README 里面詳細了描述它的轉(zhuǎn)換過程,而且最后只用了 6 個字符而已,真的很佩服。

在它的代碼當中也可以看出是怎樣轉(zhuǎn)換的,大寫 C 的部分是用了一個 String 上名為 italics 的函數(shù),可以產(chǎn)生<i></i>,之后再調(diào)用 escape,就會得到 %3Ci%3E%3C/i%3E,然后就得到大寫 C 了。

有些人可能會說我平時寫 BUG 寫得好好的,搞這些亂七八糟的有什么用,但這樣做的重點并不在于最后的結(jié)果,而是在訓(xùn)練幾個東西:

  • 對于 js 語言的熟悉度,我們用了很多類型轉(zhuǎn)換和內(nèi)置方法來拼湊東西,可能有些是你從來沒聽到過的。
  • 解決問題時縮小范圍的能力,從如何把字符串當作函數(shù)執(zhí)行,再到拼湊出數(shù)字和字符串,一步步的縮小問題,子問題解決之后原問題就解決了

 

責任編輯:趙寧寧 來源: 前端先鋒
相關(guān)推薦

2020-01-02 14:57:32

人工智能社會工程網(wǎng)絡(luò)安全

2024-10-11 17:09:27

2018-04-26 11:23:01

Linuxfork程序

2021-04-13 08:50:21

JS作用域面試題

2011-05-23 11:27:32

面試題面試java

2018-03-06 15:30:47

Java面試題

2009-08-11 10:12:07

C#算法

2023-02-04 18:24:10

SeataJava業(yè)務(wù)

2009-08-11 14:59:57

一道面試題C#算法

2021-05-31 07:55:44

smartRepeatJavaScript函數(shù)

2022-04-08 07:52:17

CSS面試題HTML

2009-08-11 15:09:44

一道面試題C#算法

2017-11-21 12:15:27

數(shù)據(jù)庫面試題SQL

2023-08-01 08:10:46

內(nèi)存緩存

2021-03-16 05:44:26

JVM面試題運行時數(shù)據(jù)

2021-10-28 11:40:58

回文鏈表面試題數(shù)據(jù)結(jié)構(gòu)

2022-02-08 18:09:20

JS引擎解析器

2011-03-02 10:58:16

SQL server入門面試題

2015-09-02 14:09:19

面試題程序設(shè)計

2017-03-10 09:33:16

JavaScript類型
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲无线看天堂av| 天天干在线播放| 高清一区二区三区av| 亚洲天堂av老司机| 国产一区二区三区免费不卡| 欧美成人黄色网| 香蕉精品久久| 91精品福利在线一区二区三区| 97视频在线免费| 国产在线视频网| 国产成人综合在线播放| 国产91精品不卡视频| 999精品在线视频| 青青草原在线亚洲| 日韩一区二区电影| 天天爽天天爽夜夜爽| 羞羞的视频在线看| 国产日韩成人精品| 国产欧美日韩亚洲| 国产巨乳在线观看| 六月丁香综合| 欧美极品xxxx| 日韩免费av一区| 九色成人国产蝌蚪91| 日韩精品在线看片z| 超碰av在线免费观看| 男人天堂亚洲天堂| 中文字幕一区日韩精品欧美| 久久综合入口| 亚洲风情第一页| 麻豆成人在线观看| 欧洲中文字幕国产精品| 免费一级a毛片夜夜看| 成人影视亚洲图片在线| 日韩精品免费综合视频在线播放| 国产精品19p| 国产成人77亚洲精品www| 精品女厕一区二区三区| 欧美中文字幕在线观看视频 | 一区二区三区国| 日韩精品福利| 99久久精品一区二区| 2022国产精品| 国产又粗又大又爽视频| 免费精品视频最新在线| 国产精品久久二区| 国产成人无码专区| 狂野欧美一区| 国产mv久久久| 日本免费精品视频| 日韩高清欧美激情| 国产精品免费视频久久久| 中文字幕精品无| 丝瓜av网站精品一区二区 | 黄色片视频网站| 伊人影院久久| 国产做受高潮69| 国产精品99精品| 国产日本精品| 欧美在线亚洲在线| 美女又爽又黄免费视频| 美女国产精品| 国产精品久久久91| 中文字幕人妻互换av久久| 免费高清视频精品| 国产日韩欧美91| 国产精品视频a| 国产精品一品二品| 成人免费看片网址| 欧美性猛交 xxxx| 99久久精品国产毛片| 久久久久免费网| 欧美大片aaa| 国产精品久久一级| 中文字幕在线亚洲精品| 丝袜中文在线| 精品动漫一区二区三区| 日本www高清视频| 四虎影视精品永久在线观看| 欧美一区二区精品在线| 人妻换人妻a片爽麻豆| 群体交乱之放荡娇妻一区二区 | 成人免费视频| 最新不卡av在线| 99热久久这里只有精品| 在线天堂中文资源最新版| 欧美在线观看你懂的| 亚洲欧美天堂在线| 精品视频自拍| 中文字幕亚洲精品| 欧美成人黄色网| 日韩精品欧美精品| 亚洲va码欧洲m码| 深夜福利免费在线观看| 中文字幕中文字幕中文字幕亚洲无线 | 日韩欧美亚洲天堂| 国产亚洲精彩久久| 在线电影欧美成精品| av在线播放网址| 日韩电影一区| 69国产精品成人在线播放| 少妇无套内谢久久久久| 亚洲AV无码成人精品区明星换面| 欧美无毛视频| 日韩亚洲电影在线| 呦呦视频在线观看| 国产精品99久久| 2020久久国产精品| 国产欧美久久久| 国产91丝袜在线播放| 欧美一区1区三区3区公司| aaa大片在线观看| 在线精品观看国产| 人妻精油按摩bd高清中文字幕| 小说区图片区色综合区| 久久高清视频免费| 99re热视频| 99久久99久久久精品齐齐| 中文字幕一区二区三区乱码| 亚洲午夜天堂| 精品欧美黑人一区二区三区| 国产人与禽zoz0性伦| 久久久久国产精品午夜一区| 91免费观看| 色三级在线观看| 欧美专区日韩专区| 波多野结衣先锋影音| 国产精品a级| 成人做爽爽免费视频| 大胆av不用播放器在线播放| 亚洲观看高清完整版在线观看| 污污视频在线免费| 久久美女视频| 国产精品私拍pans大尺度在线| 香蕉久久国产av一区二区| 一二三四社区欧美黄| 91日韩精品视频| 999久久久免费精品国产| 国产精品福利网站| 九九九伊在人线综合| 欧美视频不卡中文| 亚洲中文字幕无码av| 亚洲激情综合| 国产一区二区三区av在线| 超级碰碰不卡在线视频| 欧美va亚洲va| 国产中文字字幕乱码无限| 国产精品1024久久| 91九色国产ts另类人妖| 麻豆一二三区精品蜜桃| 欧美成人精品一区| www.成人免费视频| 亚洲一区精品在线| 天天躁日日躁狠狠躁av| 极品尤物久久久av免费看| 成人免费视频视频在| 91桃色在线| 日韩毛片中文字幕| 成人精品在线看| 久久久久久**毛片大全| 日本老熟妇毛茸茸| 日韩一区二区在线免费| 国产视频福利一区| 亚洲羞羞网站| 亚洲国产成人一区| 日本黄色一级视频| 国产精品久久久久毛片软件| www.成人黄色| 伊人成人网在线看| 欧美精品二区三区四区免费看视频| 桃花岛成人影院| 精品国产网站地址| av网站免费播放| 亚洲成va人在线观看| 精品人妻少妇嫩草av无码| 久久一区欧美| 中文字幕中文字幕一区三区| 亚洲日本视频在线| 欧美孕妇性xx| 欧美videos极品另类| 日韩欧美色综合| 六月丁香激情综合| 国产精品国产精品国产专区不片 | 国产美女精品一区二区三区| 美女黄色免费看| 国产精品一在线观看| 成人国产精品色哟哟| 久久国产精品黑丝| 亚洲图片欧美午夜| 国产av无码专区亚洲a∨毛片| 午夜影院久久久| 无码人中文字幕| 成人精品免费网站| 在线观看av日韩| 精品1区2区3区4区| 欧洲在线视频一区| 日本免费一区二区视频| 日韩av电影院| 另类视频在线| 中日韩美女免费视频网站在线观看 | 国产91视觉| 99久久亚洲国产日韩美女 | 国产午夜激情视频| 国产精品久久久久永久免费观看| 成年人小视频在线观看| 久久成人免费电影| 亚洲中文字幕无码不卡电影| 女人天堂亚洲aⅴ在线观看| 欧美不卡在线一区二区三区| 欧美日本三级| 国产精品一区久久久| 忘忧草在线日韩www影院| 久久躁狠狠躁夜夜爽| 国产精品影院在线| 亚洲精品久久久久| www.久久伊人| 777奇米四色成人影色区| 五月天综合激情网| 亚洲午夜一区二区三区| 最新av电影网站| 国产视频一区二区三区在线观看| 四虎精品一区二区| 国产一区二区在线视频| av五月天在线| 老牛影视一区二区三区| 男女激情无遮挡| 国产精品a久久久久| 免费看污污视频| 国产精品成人一区二区不卡| 日本在线视频一区| 日韩精品丝袜美腿| 国产欧美日韩综合一区在线观看| 欧美专区一区| 91视频国产精品| 91精品视频一区二区| 国产精品视频免费观看www| 亚洲人成在线网站| 91豆花精品一区| 玖玖在线播放| 欧美性一区二区三区| 98色花堂精品视频在线观看| 欧美激情免费观看| 在线免费观看污| 欧美久久久精品| 91最新在线视频| 欧美大胆在线视频| 中文字幕在线三区| 欧美成年人视频网站| 美女国产在线| 日韩在线小视频| 国产在线激情| 久久99热精品这里久久精品| gogogogo高清视频在线| 久久最新资源网| 日本孕妇大胆孕交无码| 欧美高跟鞋交xxxxhd| 欧美黄色视屏| 97在线视频免费看| 成人影院入口| 国产精品丝袜一区二区三区| 香蕉成人在线| 91久久精品一区二区别| 狠狠一区二区三区| 九九九九九九精品| 久久不见久久见免费视频7| 欧美在线一区二区三区四区| 日韩激情免费| 影音先锋成人资源网站| 一区在线免费| 国产免费视频传媒| 精品在线你懂的| 国产在线不卡av| 国产欧美日韩在线视频| 日韩在线一卡二卡| 亚洲成人自拍网| 欧美一区二区三区久久久| 欧美女孩性生活视频| 亚洲爱情岛论坛永久| 国产午夜精品久久久 | 亚洲少妇第一页| 国产一区二区三区香蕉| www国产视频| 国产欧美日韩三级| 欧美人妻精品一区二区免费看| 精品福利在线看| 在线观看免费中文字幕| 日韩视频在线永久播放| 欧美高清电影在线| 欧美精品中文字幕一区| 欧美aa视频| 97久草视频| 精品国产美女| 国产一区二区三区小说| 日本不卡123| 尤物网站在线观看| 一区免费观看视频| 偷偷操不一样的久久| 欧美一区二区三区在线电影| 五月婷婷六月色| 欧美大尺度激情区在线播放| 韩国三级一区| 国产日韩欧美精品| 国产精品黑丝在线播放| 欧美亚洲另类色图| 国产福利一区二区| 日本xxxxxxxxx18| 亚洲国产欧美日韩另类综合| 亚洲一卡二卡在线| 精品视频—区二区三区免费| 国产最新在线| 国产精品久久97| 亚洲丝袜美腿一区| 欧美这里只有精品| 极品美女销魂一区二区三区免费| 欧美性xxxx图片| 亚洲午夜精品网| jlzzjlzzjlzz亚洲人| 色琪琪综合男人的天堂aⅴ视频| 中文在线资源| 国产亚洲情侣一区二区无| 久久精品久久久| 一级黄色特级片| 国产日韩成人精品| www.国产一区二区| 亚洲精品v天堂中文字幕| 污影院在线观看| 成人网在线免费观看| 日本一本不卡| 青青青在线视频免费观看| 91一区在线观看| 国产精品美女久久久久av爽| 精品国产乱码久久久久久夜甘婷婷| 男人的天堂在线视频免费观看 | 精品视频在线观看免费观看| 午夜一区二区三区| 日韩精品1区2区3区| 国产手机在线观看| 一本色道亚洲精品aⅴ| 天堂中文在线视频| 98精品在线视频| 亚洲欧美日本伦理| 凹凸国产熟女精品视频| 99久久婷婷国产综合精品电影| 久久精品国产亚洲av无码娇色| 欧美不卡一区二区三区| 青春草在线视频| 成人三级视频在线观看一区二区| 欧美精品国产| 日本五十肥熟交尾| 欧美午夜精品久久久久久浪潮| 午夜成人鲁丝片午夜精品| 91精品国产高清久久久久久91| 99re91这里只有精品| 91九色丨porny丨国产jk| 成人av在线看| 日韩精品一区二区亚洲av| 国产一区二区三区久久精品 | 97久久天天综合色天天综合色hd| 91精品福利| 在线中文字日产幕| 亚洲成人综合在线| 精品电影在线| 成人xvideos免费视频| 这里只有精品在线| 亚洲一区二区三区四区av| 偷偷要91色婷婷| 国产精品四虎| 成人激情视频在线| 亚洲午夜一区| 黄色性生活一级片| 在线一区二区三区做爰视频网站| 在线日本中文字幕| 91久久爱成人| 性欧美暴力猛交另类hd| 国产无遮挡在线观看| 日韩欧美在线123| 中国色在线日|韩| 中文字幕日韩精品久久| 成人丝袜18视频在线观看| 麻豆精品久久久久久久99蜜桃| 日日狠狠久久偷偷四色综合免费| 午夜视频在线观看精品中文| 黄色免费视频大全| 国产精品麻豆欧美日韩ww| 国模人体一区二区| 国产成人精品免费久久久久 | 妞干网在线免费视频| ...xxx性欧美| 天堂视频中文在线| 成人激情视频在线观看| 中文欧美日韩| 男女做暖暖视频| 精品香蕉在线观看视频一| www.成人| 99re在线视频免费观看| 亚洲美女视频在线观看| 国内精品在线视频| 99超碰麻豆| 久久精品国产亚洲aⅴ| 日韩污视频在线观看|