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

淺析JavaScript的沙箱內容

開發 前端
市面上現在流行兩種沙箱模式,一種是使用iframe,還有一種是直接在頁面上使用new Function + eval進行執行. 殊途同歸,主要還是防止一些Hacker們 吃飽了沒事干,收別人錢來 Hack 你的網站. 一般情況, 我們的代碼量有60%業務+40%安全. 剩下的就看天意了.接下來,我們來一步一步分析,如果做到在前端的沙箱.文末 看俺有沒有心情放一個彩蛋吧.

[[171101]]

市面上現在流行兩種沙箱模式,一種是使用iframe,還有一種是直接在頁面上使用new Function + eval進行執行. 殊途同歸,主要還是防止一些Hacker們 吃飽了沒事干,收別人錢來 Hack 你的網站. 一般情況, 我們的代碼量有60%業務+40%安全. 剩下的就看天意了.

接下來,我們來一步一步分析,如果做到在前端的沙箱.文末 看俺有沒有心情放一個彩蛋吧.

直接嵌套

這種方式說起來并不是什么特別好的點子,因為需要花費比較多的精力在安全性上.

eval執行

最簡單的方式,就是使用eval進行代碼的執行

  1. eval('console.log("a simple script");'); 

但,如果你是直接這么使用的話, congraduations... do die...

因為,eval 的特性是如果當前域里面沒有,則會向上遍歷.一直到最頂層的global scope 比如window.以及,他還可以訪問closure內的變量.看demo:

  1. function Auth(username) 
  2.   var password = "trustno1"
  3.   this.eval = function(name) { return eval(name) } // 相當于直接this.name 
  4.  
  5. auth = new Auth("Mulder"
  6. console.log(auth.eval("username")); // will print "Mulder" 
  7. console.log(auth.eval("password")); // will print "trustno1"  

那有沒有什么辦法可以解決eval這個特性呢?

答: 沒有. 除非你不用

ok,那我就不用. 我們這里就可以使用new Function(..args,bodyStr) 來代替eval.

new Function

new Function就是用來,放回一個function obj的. 用法參考:new Function.

所以,上面的代碼,放在new Function中,可以寫為:

  1. new Function('console.log("a simple script");')(); 

這樣做在安全性上和eval沒有多大的差別,不過,他不能訪問closure的變量,即通過this來調用,而且他的性能比eval要好很多. 那有沒有辦法解決global var的辦法呢?

有啊... 只是有點復雜先用with,在用Proxy

with

with這個特性,也算是一個比較雞肋的,他和eval并列為js兩大SB特性. 不說無用, bug還多,安全性就沒誰了... 但是, with的套路總是有人喜歡的.在這里,我們就需要使用到他的特性.因為,在with的scope里面,所有的變量都會先從with定義的Obj上查找一遍.

  1. var a = { 
  2.     c:1 
  3. var c =2; 
  4. with(a){ 
  5.     console.log(c); //等價于c.a 
  6.  

所以,第一步改寫上面的new Function(),將里面變量的獲取途徑控制在自己的手里.

  1. function compileCode (src) {   
  2.   src = 'with (sandbox) {' + src + '}' 
  3.   return new Function('sandbox', src) 
  4.  

這樣,所有的內容多會從sandbox這個str上面獲取,但是找不到的var則又會向上進行搜索. 為了解決這個問題,則需要使用: proxy

proxy

es6 提供的Proxy特性,說起來也是蠻牛逼的. 可以將獲取對象上的所有方式改寫.具體用法可以參考: 超好用的proxy.

這里,我們只要將has給換掉即可. 有的就好,沒有的就返回undefined

  1. function compileCode (src) { 
  2.   src = 'with (sandbox) {' + src + '}' 
  3.   const code = new Function('sandbox', src) 
  4.  
  5.   return function (sandbox) { 
  6.     const sandboxProxy = new Proxy(sandbox, {has}) 
  7.     return code(sandboxProxy) 
  8.   } 
  9.  
  10. // 相當于檢查 獲取的變量是否在里面 like'in' 
  11. function has (target, key) { 
  12.   return true 
  13.  
  14. compileCode('log(name)')(console);  

// 相當于檢查 獲取的變量是否在里面 like: 'in'

  1. Object.keys(Array.prototype[Symbol.unscopables]);  
  2. // ["copyWithin""entries""fill""find""findIndex",  
  3. //  "includes""keys""values" 

這樣的話,就能完美的解決掉 向上查找變量的煩惱了. 另外一些大神,發現在新的ECMA里面,有些方法是不會被with scope 影響的. 這里,主要是通過Symbol.unscopables 這個特性來檢測的.比如:

  1. // 還是加一下吧 
  2. function compileCode (src) {   
  3.   src = 'with (sandbox) {' + src + '}' 
  4.   const code = new Function('sandbox', src) 
  5.  
  6.   return function (sandbox) { 
  7.     const sandboxProxy = new Proxy(sandbox, {has, get}) 
  8.     return code(sandboxProxy) 
  9.   } 
  10.  
  11. function has (target, key) {   
  12.   return true 
  13.  
  14. function get (target, key) {   
  15. // 這樣,訪問Array里面的 like, includes之類的方法,就可以保證安全... 算了,就當我沒說,真的沒啥用... 
  16.   if (key === Symbol.unscopables) return undefined 
  17.   return target[key
  18.  

現在,基本上就可以宣告你的代碼是99.999% 的5位安全數.(反正不是100%就行)

設置緩存

如果上代碼,每次編譯一次code時,都會實例一次Proxy, 這樣做會比較損性能. 所以,我們這里,可以使用closure來進行緩存。 上面生成proxy代碼,改寫為:

  1. function compileCode(src) { 
  2.     src = 'with (sandbox) {' + src + '}' 
  3.     const code = new Function('sandbox', src) 
  4.  
  5.     function has(target, key) { 
  6.         return true 
  7.     } 
  8.  
  9.     function get(target, key) { 
  10.         if (key === Symbol.unscopables) return undefined 
  11.         return target[key
  12.     } 
  13.  
  14.     return (function() { 
  15.         var _sandbox, sandboxProxy; 
  16.         return function(sandbox) { 
  17.             if (sandbox !== _sandbox) { 
  18.                 _sandbox = sandbox; 
  19.                 sandboxProxy = new Proxy(sandbox, { has, get }) 
  20.             } 
  21.             return code(sandboxProxy) 
  22.         } 
  23.     })() 
  24.  

不過上面,這樣的緩存機制有個弊端,就是不能存儲多個proxy. 不過,你可以使用Array來解決,或者更好的使用Map. 這里,我們兩個都不用,用WeakMap來解決這個problem. WeakMap 主要的問題在于,他可以完美的實現,內部變量和外部的內容的統一. WeakMap最大的特點在于,他存儲的值是不會被垃圾回收機制關注的. 說白了, WeakMap引用變量的次數是不會算在引用垃圾回收機制里, 而且, 如果WeakMap存儲的值在外部被垃圾回收裝置回收了,WeakMap里面的值,也會被刪除--同步效果.所以,毫無意外, WeakMap是我們最好的一個tricky. 則,代碼可以寫為:

  1. const sandboxProxies = new WeakMap() 
  2. function compileCode(src) { 
  3.     src = 'with (sandbox) {' + src + '}' 
  4.     const code = new Function('sandbox', src) 
  5.  
  6.     function has(target, key) { 
  7.         return true 
  8.     } 
  9.  
  10.     function get(target, key) { 
  11.         if (key === Symbol.unscopables) return undefined 
  12.         return target[key
  13.     } 
  14.     return function(sandbox) { 
  15.         if (!sandboxProxies.has(sandbox)) { 
  16.             const sandboxProxy = new Proxy(sandbox, { has, get }) 
  17.             sandboxProxies.set(sandbox, sandboxProxy) 
  18.         } 
  19.         return code(sandboxProxies.get(sandbox)) 
  20.     } 
  21.  

差不多了, 如果不嫌寫的丑,可以直接拿去用.(如果出事,純屬巧合,本人概不負責).

接著,我們來看一下,如果使用iframe,來實現代碼的編譯. 這里,Jsfiddle就是使用這種辦法.

iframe 嵌套

最簡單的方式就是,使用sandbox屬性. 該屬性可以說是真正的沙盒... 把sandbox加載iframe里面,那么,你這個iframe基本上就是個標簽而已... 而且支持性也挺棒的,比如IE10.

  1. <iframe sandbox src=”...”></iframe> 

這樣已添加,那么下面的事,你都不可以做了:

1. script腳本不能執行

2. 不能發送ajax請求

3. 不能使用本地存儲,即localStorage,cookie等

4. 不能創建新的彈窗和window, 比如window.open or target="_blank"

5. 不能發送表單

6. 不能加載額外插件比如flash等

7. 不能執行自動播放的tricky. 比如: autofocused, autoplay

看到這里,我也是醉了。 好好的一個iframe,你這樣是不是有點過分了。 不過,你可以放寬一點權限。在sandbox里面進行一些簡單設置

  1. <iframe sandbox=”allow-same-origin” src=”...”></iframe> 

常用的配置項有:

配置 效果
allow-forms 允許進行提交表單
allow-scripts 運行執行腳本
allow-same-origin 允許同域請求,比如ajax,storage
allow-top-navigation 允許iframe能夠主導window.top進行頁面跳轉
allow-popups 允許iframe中彈出新窗口,比如,window.open,target="_blank"
allow-pointer-lock 在iframe中可以鎖定鼠標,主要和鼠標鎖定有關

可以通過在sandbox里,添加允許進行的權限.

  1. <iframe sandbox=”allow-forms allow-same-origin allow-scripts” src=”...”></iframe> 

這樣,就可以保證js腳本的執行,但是禁止iframe里的javascript執行top.location = self.location。 更多詳細的內容,請參考: please call me HR.

接下來,我們來具體講解,如果使用iframe來code evaluation. 里面的原理,還是用到了eval.

iframe 腳本執行

上面說到,我們需要使用eval進行方法的執行,所以,需要在iframe上面添加上, allow-scripts的屬性.(當然,你也可以使用new Function, 這個隨你...)

這里的框架是使用postMessage+eval. 一個用來通信,一個用來執行.

先看代碼:

  1. <!-- frame.html --> 
  2. <!DOCTYPE html> 
  3. <html> 
  4.  <head> 
  5.    <title>Evalbox's Frame</title> 
  6.    <script> 
  7.      window.addEventListener('message'function (e) { 
  8.      // 相當于window.top.currentWindow. 
  9.        var mainWindow = e.source; 
  10.        var result = ''
  11.        try { 
  12.          result = eval(e.data); 
  13.        } catch (e) { 
  14.          result = 'eval() threw an exception.'
  15.        } 
  16.        // e.origin 就是原來window的url 
  17.        mainWindow.postMessage(result, e.origin); 
  18.      }); 
  19.    </script> 
  20.  </head> 
  21. </html>  

這里順便插播一下關于postMessage的相關知識點.

postMessage 講解

postMessage主要做的事情有三個:

1.頁面和其打開的新窗口的數據傳遞

2.多窗口之間消息傳遞

3.頁面與嵌套的iframe消息傳遞

具體的格式為 

  1. otherWindow.postMessage(message, targetOrigin, [transfer]); 

message是傳遞的信息,targetOrigin指定的窗口內容,transfer取值為Boolean 表示是否可以用來對obj進行序列化,相當于JSON.stringify, 不過一般情況下傳obj時,會自己先使用JSON進行seq一遍.

具體說一下targetOrigin.

targetOrigin的寫入格式一般為URI,即, protocol+host. 另外,也可以寫為*. 用來表示 傳到任意的標簽頁中.

另外,就是接受端的參數.接受傳遞的信息,一般是使用window監聽message事件.

  1. window.addEventListener("message", receiveMessage, false); 
  2.  
  3. function receiveMessage(event) 
  4.   var origin = event.origin || event.originalEvent.origin; // For Chrome, the origin property is in the event.originalEvent object. 
  5.   if (origin !== "http://example.org:8080"
  6.     return
  7.  
  8.   // ... 
  9.  

event里面,會帶上3個參數:

  • data: 傳遞過來的數據. e.data
  • origin: 發送信息的URL, 比如: https://example.org
  • source: 發送信息的源頁面的window對象. 我們實際上只能從上面獲取信息.

該API常常用在window和iframe的信息交流當中.

現在,我們回到上面的內容.

  1. <!-- frame.html --> 
  2. <!DOCTYPE html> 
  3. <html> 
  4.  <head> 
  5.    <title>Evalbox's Frame</title> 
  6.    <script> 
  7.      window.addEventListener('message'function (e) { 
  8.      // 相當于window.top.currentWindow. 
  9.        var mainWindow = e.source; 
  10.        var result = ''
  11.        try { 
  12.          result = eval(e.data); 
  13.        } catch (e) { 
  14.          result = 'eval() threw an exception.'
  15.        } 
  16.        // e.origin 就是原來window的url 
  17.        mainWindow.postMessage(result, e.origin); 
  18.      }); 
  19.    </script> 
  20.  </head> 
  21. </html>  

iframe里面,已經做好文檔的監聽,然后,我們現在需要進行內容的發送.直接在index.html寫入:

  1. // html部分 
  2. <textarea id='code'></textarea> 
  3. <button id='safe'>eval() in a sandboxed frame.</button> 
  4. // 設置基本的安全特性 
  5. <iframe sandbox='allow-scripts' 
  6.         id='sandboxed' 
  7.         src='frame.html'></iframe> 
  8.  
  9. // js部分 
  10. function evaluate() { 
  11.   var frame = document.getElementById('sandboxed'); 
  12.   var code = document.getElementById('code').value; 
  13.   frame.contentWindow.postMessage(code, '/'); // 只想同源的標簽頁發送 
  14.  
  15. document.getElementById('safe').addEventListener('click', evaluate); 
  16.  
  17. // 同時設置接受部分 
  18. window.addEventListener('message'
  19.     function (e) { 
  20.       var frame = document.getElementById('sandboxed'); 
  21.       // 進行信息來源的驗證 
  22.       if (e.origin === "null" && e.source === frame.contentWindow) 
  23.         alert('Result: ' + e.data); 
  24.     });  

實際demo可以參考:H5 ROCK

常用的兩種沙箱模式這里差不多講解完了. 開頭說了文末有個彩蛋,這個彩蛋就是使用nodeJS來做一下沙箱. 比如像 牛客網的代碼驗證,就是放在后端去做代碼的沙箱驗證.

彩蛋--nodeJS沙箱

使用nodeJS的沙箱很簡單,就是使用nodeJS提供的VM Module即可.

直接看代碼吧:

  1. const vm = require('vm'); 
  2. const sandbox = { a: 1, b: 1 }; 
  3. const script = new vm.Script('a + b'); 
  4. const context = new vm.createContext(sandbox); 
  5. script.runInContext(context);  

在vm構建出來的sandbox里面,沒有任何可以訪問的全局變量.除了基本的syntax.

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-10-25 10:30:12

JavaScript開發 代碼

2021-07-27 22:56:00

JavaScript編程開發

2021-02-07 22:59:55

JavaScript編程方法鏈

2009-07-24 17:30:37

Javascript閉

2011-03-07 09:41:10

JavaScript

2016-10-19 14:35:20

JavaScript函數式編程

2024-12-23 15:54:51

2011-03-10 14:19:56

JavaScript

2010-09-28 14:12:50

Javascript

2021-04-09 08:51:32

Web WorkerJavaScript微前端

2023-11-12 21:37:56

Feed流

2009-07-15 16:03:26

Swing線程

2016-09-14 21:28:25

JavaScript事件代理委托

2011-03-08 09:15:04

JavaScript

2022-01-17 21:37:24

JavaScriptHTMLCSS

2009-07-14 11:34:42

MyEclipse斷點JavaScript

2009-10-12 10:33:11

Javascript替

2009-09-14 19:21:36

Javascript透

2021-10-19 09:31:19

Javascript 登錄表單前端

2024-12-26 16:13:53

JavaScript開發表單
點贊
收藏

51CTO技術棧公眾號

这里只有精品视频在线| 日本二三区不卡| 成人黄动漫网站免费| 国产在线综合网| 深夜福利久久| 欧美美女一区二区三区| 加勒比成人在线| 国产露出视频在线观看| 国产综合久久久久久鬼色| 久久久久久国产精品美女| japanese中文字幕| 久久一级大片| 欧洲精品中文字幕| 国产精品www在线观看| melody高清在线观看| 成人小视频免费观看| 国产精品久久久久77777| 久久精品视频9| 青青草91久久久久久久久| 亚洲精品在线免费观看视频| 韩国日本美国免费毛片| 福利成人导航| 亚洲欧美激情小说另类| 久久综合九色99| 亚洲av无码片一区二区三区| 日韩不卡一二三区| 69视频在线免费观看| 乱h高h女3p含苞待放| 欧洲三级视频| 日韩av在线高清| 师生出轨h灌满了1v1| 国产成人免费精品| 在线中文字幕一区| 91国视频在线| 超碰激情在线| 亚洲一区在线观看免费观看电影高清| 亚洲激情啪啪| 国产黄色免费在线观看| 99国产精品一区| 国产精品日韩二区| 成人1区2区3区| 国内一区二区视频| 国产精品亚洲片夜色在线| 午夜精品久久久久久久蜜桃| 美女精品在线| 欧美亚洲在线观看| 三级黄色在线视频| 亚洲人成高清| 国内精久久久久久久久久人| 欧美交换国产一区内射| 一区二区三区午夜探花| 久久精品国产精品亚洲| 三上悠亚在线观看视频| 欧美电影《睫毛膏》| 视频在线观看99| 很污很黄的网站| 日韩欧美高清| 精品国模在线视频| 成人免费精品动漫网站| 欧美在线首页| 欧美激情精品久久久久久免费印度| 成人观看免费视频| 欧美亚韩一区| 久久久人成影片一区二区三区| 在线观看美女av| 欧美日韩国产在线一区| 欧美日韩国产999| 国产无码精品在线播放| 亚洲美女黄网| 日韩av片永久免费网站| 国产又粗又猛又黄视频| 麻豆视频观看网址久久| 成人午夜小视频| www.桃色av嫩草.com| 成人免费看视频| 久久精品99久久| 国产二区视频在线观看| 国产精品盗摄一区二区三区| 精品一区二区三区毛片| 超清av在线| 日本久久电影网| 久久精品视频在线观看免费| 国产成人在线中文字幕| 亚洲三级免费看| 亚洲av鲁丝一区二区三区| 亚洲青色在线| 国产精品欧美久久久| 中文字幕一区二区人妻电影| 精品亚洲免费视频| 成人欧美一区二区三区视频| 四虎在线免费观看| 中文字幕在线观看不卡视频| 日b视频免费观看| 精品3atv在线视频| 欧美精选一区二区| 国产一级伦理片| 日韩午夜电影网| 午夜精品一区二区三区在线视频 | 综合久久综合| 91av视频导航| 国产乱码精品一区二区| 成人精品gif动图一区| 日韩亚洲不卡在线| 日韩三级电影视频| 在线看一区二区| 东京热av一区| 婷婷亚洲图片| 日本国产高清不卡| www.五月婷婷| 国产精品蜜臀av| 中文字幕日本最新乱码视频| 精品国产一区二区三区2021| 亚洲人精选亚洲人成在线| 欧美成人精品一区二区免费看片| 日本少妇一区二区| 精品久久久久久乱码天堂| 国产日产一区二区| 在线精品视频一区二区| 国产污在线观看| 欧美永久精品| 成人在线精品视频| 高清av在线| 日韩欧美在线视频免费观看| 中文字幕在线播放一区二区| 久久精品国产www456c0m| 欧美野外猛男的大粗鳮| 亚洲精品综合网| 亚洲三级视频在线观看| 一区二区三区 日韩| 日韩精选在线| 亚洲一区二区三区四区不卡| 免费大片在线观看| 美日韩黄色大片| 欧美大尺度激情区在线播放| 中文字幕人妻一区二区三区视频| 91在线免费播放| 九九爱精品视频| 精品国产18久久久久久洗澡| 久久999免费视频| 国产情侣一区二区| 国产麻豆日韩欧美久久| 久久99精品国产99久久| av免费不卡国产观看| 精品欧美久久久| 久久黄色免费网站| 国产91精品一区二区麻豆网站 | 91高清在线观看视频| 欧美男同性恋视频网站| 萌白酱视频在线| 久久99精品久久只有精品| 神马影院一区二区三区| 日本肉肉一区| 国产一区二区三区精品久久久 | 国产三级av片| 91麻豆精东视频| 六月丁香婷婷激情| 国产成人手机高清在线观看网站| 在线播放日韩精品| 亚洲精品国产无码| 国产精品入口麻豆原神| 日韩欧美亚洲另类| 在线一区电影| 99久久精品免费看国产一区二区三区 | 可以免费看的黄色网址| 99国内精品久久久久| 久久视频在线免费观看| 国产高清第一页| 亚洲国产成人porn| www.88av| 一区二区激情| 久久av免费一区| 成人在线视频免费看| 久久电影一区二区| 亚洲国产精品成人久久蜜臀| 精品国产91久久久久久| japanese中文字幕| 九九国产精品视频| 成人免费性视频| 国内精品久久久久久久影视简单| 国产美女91呻吟求| 成年人视频免费在线播放| 精品亚洲va在线va天堂资源站| 欧美特级黄色片| 一区二区成人在线视频| www在线观看免费视频| 激情欧美一区二区| 国内性生活视频| 99国产**精品****| 国产偷久久久精品专区| 欧美日韩尤物久久| 欧美激情a∨在线视频播放| 理论视频在线| 日韩欧美一二三| 无码人妻精品一区二区三区不卡| 亚洲婷婷国产精品电影人久久| 国产精品久久AV无码| 久久99日本精品| 欧美在线一区视频| 999久久久精品国产| 久久99精品久久久久久秒播放器| 久久av日韩| 91精品国产色综合久久不卡98口| 午夜国产福利在线| 精品视频在线导航| 精品国产九九九| 欧美日韩一级大片网址| xxxxxx国产| 亚洲乱码国产乱码精品精可以看| 亚洲第一页av| 成人午夜视频福利| 免费av不卡在线| 日韩电影网1区2区| 黄色一级片在线看| 围产精品久久久久久久| 欧美日韩精品综合| 久久精品亚洲成在人线av网址| 国产在线a不卡| 韩国成人在线| 欧美亚洲第一页| www.综合| 欧美黑人巨大精品一区二区| 午夜在线免费观看视频| 亚洲男人天堂古典| 日韩在线免费播放| 精品国产99国产精品| av免费观看在线| 欧美日韩国产中文| 欧美日韩在线视频播放| 欧美午夜视频在线观看| 日本少妇激情视频| 一区二区三区免费看视频| 国产一区二区三区在线视频观看| 欧美国产欧美综合| www在线观看免费视频| 91色.com| 成年人免费观看视频网站| 97精品视频在线观看自产线路二| 涩视频在线观看| 国产成人一区在线| 中文字幕avav| 国产精品一区二区在线观看不卡| 亚洲精品第三页| 精品一区二区三区影院在线午夜 | 外国成人毛片| 91精品国产自产在线老师啪| 成人精品国产亚洲| 国产免费一区二区三区香蕉精| 日本精品在线中文字幕| 国产成人精品日本亚洲| 欧美电影h版| 日韩男女性生活视频| 日韩av福利| 国产精品久久77777| 日韩三区免费| 国产欧亚日韩视频| 91视频亚洲| 99久久精品久久久久久ai换脸| 亚洲视频国产| 久久五月天婷婷| 精品一区av| 三年中国中文在线观看免费播放| 在线精品小视频| 国产美女在线一区| 国产亚洲精品v| 中文字幕无码不卡免费视频| 秋霞成人午夜伦在线观看| jizzzz日本| 国产成都精品91一区二区三| 国产女人18毛片水真多18| 91丨porny丨户外露出| 91资源在线播放| 亚洲视频 欧洲视频| 日韩av一二三区| 一本大道久久a久久综合| 亚洲天堂777| 日韩欧美国产电影| 男女污视频在线观看| 最近2019好看的中文字幕免费| 99热国产在线中文| 欧美性在线观看| 婷婷久久免费视频| 国外成人免费视频| 色偷偷综合网| 中文字幕无码精品亚洲资源网久久| 香蕉久久夜色精品国产| 亚洲一二三av| 99视频在线精品| 三级黄色在线观看| 欧美日韩国产一区中文午夜| 中文字幕在线网站| 亚洲第一视频在线观看| 成人欧美亚洲| 午夜精品久久久久久久99热| 色猫猫成人app| 国产乱码精品一区二区三区不卡| 教室别恋欧美无删减版| 肉大捧一出免费观看网站在线播放 | 久久国产这里只有精品| 成人av在线网| 亚洲国产精品一区二区久久hs| 午夜精品爽啪视频| 91精品国产色综合久久不8| 亚洲国模精品私拍| 亚洲s色大片| 日本精品在线视频| 亚洲三级av| 天天综合中文字幕| 美女久久网站| xxxx黄色片| 一区二区三区在线视频观看| 免费视频网站在线观看入口| 欧美精品一区二区在线播放| 激情影院在线观看| 国产精品电影网| 婷婷综合成人| 人人妻人人澡人人爽欧美一区双| 另类小说视频一区二区| 久操视频免费看| 亚洲成人动漫在线观看| 99视频在线观看免费| 尤物精品国产第一福利三区| 中文字幕色婷婷在线视频| 国产福利不卡| 欧美va亚洲va日韩∨a综合色| 天天干天天综合| 日本一二三四高清不卡| 久久精品视频5| 日韩电影大片中文字幕 | 国产ts人妖一区二区三区 | 懂色aⅴ精品一区二区三区| 国产精品毛片久久久久久| 制服丨自拍丨欧美丨动漫丨| 一本色道久久综合狠狠躁的推荐 | 无人区乱码一区二区三区| 日韩av一区二区三区在线| 亚洲最黄网站| 中文字幕第3页| 亚洲一区二区五区| 国产激情无套内精对白视频| www.欧美免费| 亚洲精品成a人ⅴ香蕉片| 亚洲精品成人自拍| 秋霞av亚洲一区二区三| 久久精品—区二区三区舞蹈| 欧美日韩中文字幕在线视频| 日韩在线无毛| 国产成人小视频在线观看| 久久综合影院| 日本熟妇人妻xxxxx| 久久久精品tv| 中文在线字幕av| 日韩资源在线观看| 精品一区二区三区中文字幕视频 | 户外露出一区二区三区| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲欧美久久| 制服 丝袜 综合 日韩 欧美| 欧美图片一区二区三区| 免费大片黄在线观看视频网站| 国产有码一区二区| 国内精品美女在线观看| 国产二级一片内射视频播放| 欧美性少妇18aaaa视频| 成人好色电影| 91欧美精品成人综合在线观看| 欧美日韩国产探花| 国产偷人妻精品一区| 欧美午夜寂寞影院| 国产精品一区二区三区视频网站| 不卡视频一区| 久久精选视频| 99自拍视频在线| 精品国产免费久久| 欧美黑人疯狂性受xxxxx野外| 亚洲成人第一| 国产成人精品免费| 特黄视频免费看| 日韩中文字幕在线观看| 91欧美极品| 亚洲欧美激情网| 亚洲色图视频免费播放| 天天操天天舔天天干| 国产精品一区久久| 国产精品v欧美精品v日本精品动漫| 青青草福利视频| 欧美福利视频导航| 水蜜桃在线视频| 中文字幕不卡每日更新1区2区| 成人精品视频.| 怡春院在线视频| 久久久在线免费观看| 欧美一区三区| 久久性爱视频网站| 欧美日韩电影一区| 国产乱码精品一区二三赶尸艳谈| 亚洲高清123| 99久久久免费精品国产一区二区| 亚洲中文字幕在线一区| 91超碰caoporn97人人| 亚洲午夜精品一区 二区 三区|