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

Android避坑指南,發(fā)現(xiàn)了一個極度不安全的操作

新聞 Android
最近發(fā)現(xiàn)微信多了個專輯功能,可以把一系列的原創(chuàng)文章聚合,剛好我每周都會遇到很多同學(xué)問我各種各樣的問題,部分問題還是比較有意義的,我會在周末詳細的寫demo驗證,簡單擴展一下寫成文章分享給大家。

 最近發(fā)現(xiàn)微信多了個專輯功能,可以把一系列的原創(chuàng)文章聚合,剛好我每周都會遇到很多同學(xué)問我各種各樣的問題,部分問題還是比較有意義的,我會在周末詳細的寫demo驗證,簡單擴展一下寫成文章分享給大家。

1. 先看一個問題

來一起看一段代碼:

  1. public class Student  { 
  2.     private Student() { 
  3.         throw new IllegalArgumentException("can not create."); 
  4.     } 
  5.     public String name; 
  6.  

我們?nèi)绾瓮ㄟ^Java代碼創(chuàng)建一個Student對象?

我們先想下通過Java創(chuàng)建對象大概有哪些方式:

  1. new Student() // 私有

  2. 反射調(diào)用構(gòu)造方法 //throw ex

  3. 反序列化 // 需要實現(xiàn)相關(guān)序列化接口

  4. clone // 需要實現(xiàn)clone相關(guān)接口

  5. ...

好了,已經(jīng)超出我的知識點范疇了。

不免心中嘀咕:

這題目太偏了,毫無意義,而且文章標(biāo)題是 Android 避坑指南,看起來毫無關(guān)系

是的,確實很偏,跳過這個問題,我們往下看,看看是怎么在Android開發(fā)過程中遇到的,而且看完后,這個問題就迎刃而解了。

2. 問題的來源

上周一個群有個小伙伴,遇到了一個Kotlin寫的Bean,在做Gson將字符串轉(zhuǎn)化成具體的Bean對象時,發(fā)生了一個不符合預(yù)期的問題。

因為是他們項目的代碼,我就不貼了,我寫了個類似的小例子來替代。

對于Java Bean,kotlin可以用data class,網(wǎng)上也有很多博客表示:

在 Kotlin 中,不需要自己動手去寫一個 JavaBean,可以直接使用 DataClass,使用 DataClass 編譯器會默默地幫我們生成一些函數(shù)。

我們先寫個Bean:

  1. data class Person(var name: String, var age: Int) { 
  2.  
  3.  

這個Bean是用于接收服務(wù)器數(shù)據(jù),通過Gson轉(zhuǎn)化為對象的。

簡化一下代碼為:

  1. val gson = Gson() 
  2. val person = gson.fromJson<Person>("{\"age\":\"12\"}", Person::class.java) 

我們傳遞了一個json字符串,但是沒有包含key為name的值,并且注意:

在Person中name的類型是String,也就是說是不允許name=null的

那么上面的代碼,我運行起來結(jié)果是什么呢?

  1. 報錯,畢竟沒有傳name的值;

  2. 不報錯,name 默認值為"";

  3. 不報錯,name=null;

感覺1最合理,也符合Kotlin的空安全檢查。

驗證一下,修改一下代碼,看一下輸出:

  1. val gson = Gson() 
  2. val person = gson.fromJson<Person>("{\"age\":\"12\"}", Person::class.java) 
  3. println(person.name ) 

輸出結(jié)果:

  1. null 

是不是有些奇怪, 感覺意外繞過了Kotlin的空類型檢查。

所以那位出問題的同學(xué),在這里之后數(shù)據(jù)就出了問題,導(dǎo)致一直排查困難。

我們再改一下代碼:

  1. data class Person(var name: String, var age: Int): People(){ 

我們讓Person繼承自People類:

  1. public class People { 
  2.  
  3.     public People(){ 
  4.         System.out.println("people cons"); 
  5.     } 
  6.  

在People類的構(gòu)造方法中打印日志。

我們都清楚,正常情況下,一般構(gòu)造子類對象,必然會先執(zhí)行父類的構(gòu)造方法。

運行一下:

沒有執(zhí)行父類構(gòu)造方法,但對象構(gòu)造出來了

這里可以猜到, Person對象的構(gòu)建,并不是常規(guī)的構(gòu)建對象,沒有走構(gòu)造方法。

那么它是怎么做到的呢?

只能去Gson的源碼中去找答案了。

找到其怎么做的,其實就相當(dāng)于解答了我們文首的問題。

3. 追查原因

Gson這樣構(gòu)造出一個對象,但是沒有走父類構(gòu)造這種,如果真是的這樣,那么是極其危險的。

會讓程序完全不符合運行預(yù)期,少了一些必要邏輯。

所以我們提前說一下,大家不用太驚慌,并不是Gson很容易出現(xiàn)這樣的情況,而是恰好上例的寫法碰上了,我們一會會說清楚。

首先我們把Person這個kotlin的類,轉(zhuǎn)成Java,避免背后藏了一些東西:

  1. # 反編譯之后的顯示 
  2. public final class Person extends People { 
  3.    @NotNull 
  4.    private String name; 
  5.    private int age; 
  6.  
  7.    @NotNull 
  8.    public final String getName() { 
  9.       return this.name; 
  10.    } 
  11.  
  12.    public final void setName(@NotNull String var1) { 
  13.       Intrinsics.checkParameterIsNotNull(var1, "<set-?>"); 
  14.       this.name = var1; 
  15.    } 
  16.  
  17.    public final int getAge() { 
  18.       return this.age; 
  19.    } 
  20.  
  21.    public final void setAge(int var1) { 
  22.       this.age = var1; 
  23.    } 
  24.  
  25.    public Person(@NotNull String name, int age) { 
  26.       Intrinsics.checkParameterIsNotNull(name, "name"); 
  27.       super(); 
  28.       this.name = name; 
  29.       this.age = age; 
  30.    } 
  31.  
  32.    // 省略了一些方法。 

可以看到Person有一個包含兩參的構(gòu)造方法,并且這個構(gòu)造方法中有name的空安全檢查。

也就是說,正常通過這個構(gòu)造方法構(gòu)建一個Person對象,是不會出現(xiàn)空安全問題的。

那么只能去看看Gson的源碼了:

Gson的邏輯,一般都是根據(jù)讀取到的類型,然后找對應(yīng)的TypeAdapter去處理,本例為Person對象,所以會最終走到`ReflectiveTypeAdapterFactory.create`然后返回一個TypeAdapter。

我們看一眼其內(nèi)部代碼:

  1. # ReflectiveTypeAdapterFactory.create 
  2. @Override  
  3. public <T> TypeAdapter<T> create(Gson gson, final TypeToken<T> type) { 
  4.     Class<? super T> raw = type.getRawType(); 
  5.  
  6.     if (!Object.class.isAssignableFrom(raw)) { 
  7.       return null// it's a primitive! 
  8.     } 
  9.  
  10.     ObjectConstructor<T> constructor = constructorConstructor.get(type); 
  11.     return new Adapter<T>(constructor, getBoundFields(gson, type, raw)); 

重點看constructor這個對象的賦值,它一眼就知道跟構(gòu)造對象相關(guān)。

  1. # ConstructorConstructor.get 
  2. public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) { 
  3.     final Type type = typeToken.getType(); 
  4.     final Class<? super T> rawType = typeToken.getRawType(); 
  5.  
  6.     // ...省略一些緩存容器相關(guān)代碼 
  7.  
  8.     ObjectConstructor<T> defaultConstructor = newDefaultConstructor(rawType); 
  9.     if (defaultConstructor != null) { 
  10.       return defaultConstructor; 
  11.     } 
  12.  
  13.     ObjectConstructor<T> defaultImplementation = newDefaultImplementationConstructor(type, rawType); 
  14.     if (defaultImplementation != null) { 
  15.       return defaultImplementation; 
  16.     } 
  17.  
  18.     // finally try unsafe 
  19.     return newUnsafeAllocator(type, rawType); 
  20.   } 

可以看到該方法的返回值有3個流程:

  1. newDefaultConstructor

  2. newDefaultImplementationConstructor

  3. newUnsafeAllocator 

我們先看第一個newDefaultConstructor

  1. private <T> ObjectConstructor<T> newDefaultConstructor(Class<? super T> rawType) { 
  2.     try { 
  3.       final Constructor<? super T> constructor = rawType.getDeclaredConstructor(); 
  4.       if (!constructor.isAccessible()) { 
  5.         constructor.setAccessible(true); 
  6.       } 
  7.       return new ObjectConstructor<T>() { 
  8.         @SuppressWarnings("unchecked"// T is the same raw type as is requested 
  9.         @Override public T construct() { 
  10.             Object[] args = null
  11.             return (T) constructor.newInstance(args); 
  12.  
  13.             // 省略了一些異常處理 
  14.       }; 
  15.     } catch (NoSuchMethodException e) { 
  16.       return null
  17.     } 
  18.   } 

可以看到,很簡單,嘗試獲取了無參的構(gòu)造函數(shù),如果能夠找到,則通過newInstance反射的方式構(gòu)建對象。

追隨到我們的Person的代碼,其實該類中只有一個兩參的構(gòu)造函數(shù),并沒有無參構(gòu)造,從而會命中NoSuchMethodException,返回null。

返回null會走newDefaultImplementationConstructor,這個方法里面都是一些集合類相關(guān)對象的邏輯,直接跳過。

那么,最后只能走: newUnsafeAllocator 方法了。

從命名上面就能看出來,這是個不安全的操作。

newUnsafeAllocator最終是怎么不安全的構(gòu)建出一個對象呢?

往下看,最終執(zhí)行的是:

  1. public static UnsafeAllocator create() { 
  2. // try JVM 
  3. // public class Unsafe { 
  4. //   public Object allocateInstance(Class<?> type); 
  5. // } 
  6. try { 
  7.   Class<?> unsafeClass = Class.forName("sun.misc.Unsafe"); 
  8.   Field f = unsafeClass.getDeclaredField("theUnsafe"); 
  9.   f.setAccessible(true); 
  10.   final Object unsafe = f.get(null); 
  11.   final Method allocateInstance = unsafeClass.getMethod("allocateInstance", Class.class); 
  12.   return new UnsafeAllocator() { 
  13.     @Override 
  14.     @SuppressWarnings("unchecked"
  15.     public <T> T newInstance(Class<T> c) throws Exception { 
  16.       assertInstantiable(c); 
  17.       return (T) allocateInstance.invoke(unsafe, c); 
  18.     } 
  19.   }; 
  20. catch (Exception ignored) { 
  21.  
  22. // try dalvikvm, post-gingerbread use ObjectStreamClass 
  23. // try dalvikvm, pre-gingerbread , ObjectInputStream 
  24.  

可以看到Gson在沒有找到無參的構(gòu)造方法后,通過 sun.misc.Unsafe 構(gòu)造了一個對象。

注意:Unsafe該類并不是所有的Android 版本中都包含,不過目前新版本都包含,所以Gson這個方法中有3段邏輯都是用來生成對象的,你可以認為3重保險,針對不同平臺。本文測試設(shè)備:Android 29模擬器

我們這里暫時只討論sun.misc.Unsafe,其他的其實一個意思。

`sun.misc.Unsafe`何許API?

Unsafe是位于sun.misc包下的一個類,主要提供一些用于執(zhí)行低級別、不安全操作的方法,如直接訪問系統(tǒng)內(nèi)存資源、自主管理內(nèi)存資源等,這些方法在提升Java運行效率、增強Java語言底層資源操作能力方面起到了很大的作用。但由于Unsafe類使Java語言擁有了類似C語言指針一樣操作內(nèi)存空間的能力,這無疑也增加了程序發(fā)生相關(guān)指針問題的風(fēng)險。在程序中過度、不正確使用Unsafe類會使得程序出錯的概率變大,使得Java這種安全的語言變得不再“安全”,因此對Unsafe的使用一定要慎重。

https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html

具體可以參考美團的這篇文章。

好了,到這里就真相大白了。

原因是我們Person沒有提供默認的構(gòu)造方法,Gson在沒有找到默認構(gòu)造方法時,它就直接通過Unsafe的方法,繞過了構(gòu)造方法,直接構(gòu)建了一個對象。

到這里,我們收獲了:

  1. Gson是如何構(gòu)建對象的?

  2. 我們在寫需要Gson轉(zhuǎn)化為對象的類的時候,一定要記得有默認的構(gòu)造方法,否則雖然不報錯,但是很不安全!

  3. 我們了解到了還有這種Unsafe黑科技的方式構(gòu)造對象。

4. 回到文章開始的問題

Java中咋么構(gòu)造一個下面的Student對象呢?

  1. public class Student  { 
  2.     private Student() { 
  3.         throw new IllegalArgumentException("can not create."); 
  4.     } 
  5.     public String name; 

我們模仿Gson的代碼,編寫如下:

  1. try { 
  2.     val unsafeClass = Class.forName("sun.misc.Unsafe"
  3.     val f = unsafeClass.getDeclaredField("theUnsafe"
  4.     f.isAccessible = true 
  5.     val unsafe = f.get(null
  6.     val allocateInstance = unsafeClass.getMethod("allocateInstance", Class::class.java) 
  7.     val student = allocateInstance.invoke(unsafe, Student::class.java) 
  8.     (student as Student).apply { 
  9.         name = "zhy" 
  10.     } 
  11.     println(student.name) 
  12. catch (ignored: Exception) { 
  13.     ignored.printStackTrace() 

輸出:

  1. shy 

成功構(gòu)建。

5. 

Unsafe 一點用沒有?

看到這里,大家可能最大的收獲就是了解Gson構(gòu)建對象流程,以及以后寫B(tài)ean的時候會注意提供默認的無參構(gòu)造方法,尤其在使用Kotlin  `data class `的時候。

那么剛才我們所說的Unsafe方法在Android上就沒有其他實際用處嗎?

這個類,提供了類似C語言指針一樣操作內(nèi)存空間的能力。

大家都知道在Android P上面,Google限制了app對hidden API的訪問。

但是,Google不能限制自己對hidden API訪問對吧,所以它自己的相關(guān)類,是允許訪問hidden API的。

那么Google是如何區(qū)分是我們app調(diào)用,還是它自己調(diào)用呢?

其中有一個辦法就是通過ClassLoader,系統(tǒng)認為如果ClassLoader為BootStrapClassLoader則就認為是系統(tǒng)類,則放行。

那么,我們突破P訪問限制,其中一個思路就是,搞一個類,把它的ClassLoader換成BootStrapClassLoader,從而可以反射任何hidden api。

怎么換呢?

只要把這個類的classLoader成員變量設(shè)置為null就可以了。

參考代碼:

  1. private void testJavaPojie() { 
  2.     try { 
  3.       Class reflectionHelperClz = Class.forName("com.example.support_p.ReflectionHelper"); 
  4.       Class classClz = Class.class
  5.       Field classLoaderField = classClz.getDeclaredField("classLoader"); 
  6.       classLoaderField.setAccessible(true); 
  7.       classLoaderField.set(reflectionHelperClz, null); 
  8.     } catch (Exception e) { 
  9.           e.printStackTrace(); 
  10.     } 
  11. 來自:https://juejin.im/post/5ba0f3f7e51d450e6f2e39e0

但是這樣有個問題,上面的代碼用到了反射修改一個類的classLoader成員,假設(shè)google有一天把反射設(shè)置classLoader也完全限制掉,就不行了。

那么怎么辦?原理還是換ClassLoader,但是我們不走Java反射的方式了,而是用Unsafe:

參考代碼:

  1. @Keep 
  2. public class ReflectWrapper { 
  3.  
  4.     //just for finding the java.lang.Class classLoader field's offset 
  5.     @Keep 
  6.     private Object classLoaderOffsetHelper; 
  7.  
  8.     static { 
  9.         try { 
  10.             Class<?> VersionClass = Class.forName("android.os.Build$VERSION"); 
  11.             Field sdkIntField = VersionClass.getDeclaredField("SDK_INT"); 
  12.             sdkIntField.setAccessible(true); 
  13.             int sdkInt = sdkIntField.getInt(null); 
  14.             if (sdkInt >= 28) { 
  15.                 Field classLoader = ReflectWrapper.class.getDeclaredField("classLoaderOffsetHelper"); 
  16.                 long classLoaderOffset = UnSafeWrapper.getUnSafe().objectFieldOffset(classLoader); 
  17.                 if (UnSafeWrapper.getUnSafe().getObject(ReflectWrapper.class, classLoaderOffset) instanceof ClassLoader) { 
  18.                     Object originalClassLoader = UnSafeWrapper.getUnSafe().getAndSetObject(ReflectWrapper.class, classLoaderOffset, null); 
  19.                 } else { 
  20.                     throw new RuntimeException("not support"); 
  21.                 } 
  22.             } 
  23.         } catch (Exception e) { 
  24.             throw new RuntimeException(e); 
  25.         } 
  26.     } 
  27. 來自作者區(qū)長:一種純 Java 層繞過 Android P 私有函數(shù)調(diào)用限制的方式,一文。 

Unsafe賦予了我們操作內(nèi)存的能力,也就能完成一些平時只能依賴C++完成的代碼。

好了,從一位朋友遇到的問題,由此引發(fā)了一整篇文章的討論,希望你能有所收獲。

責(zé)任編輯:張燕妮 來源: 鴻洋
相關(guān)推薦

2014-04-09 09:37:29

2021-06-02 08:00:57

WebAsyncTas項目異步

2021-10-29 11:45:26

Python代碼Python 3.

2025-05-19 10:04:48

2015-07-01 14:48:51

2015-05-27 13:19:23

2023-02-26 01:02:22

2021-04-22 07:47:47

JavaJDKMYSQL

2021-01-26 11:16:12

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-11-30 09:18:51

JavaMyBatisMQ

2021-12-29 19:20:41

數(shù)據(jù)GitHub服務(wù)器

2024-12-09 08:25:47

Springsave方法

2018-01-20 20:46:33

2024-05-20 08:25:55

2023-06-01 19:24:16

2011-11-28 09:20:38

2015-10-16 10:03:36

安卓設(shè)備安全終端安全

2019-01-14 11:10:43

機器學(xué)習(xí)人工智能計算機

2016-12-09 09:00:32

大數(shù)據(jù)風(fēng)控金融

2020-06-12 11:03:22

Python開發(fā)工具
點贊
收藏

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

亚洲专区视频| 丰满诱人av在线播放| 日韩国产在线观看| 日韩在线观看你懂的| 日日夜夜精品视频免费观看| 国产丝袜精品丝袜| 国产日韩三级在线| 99久久精品免费看国产四区| 国产精品自拍99| 99久久99久久精品国产片桃花| 欧美一区二区黄| 成人一级片网站| 超碰人人在线| 久久久久久夜精品精品免费| 成人免费网站在线| 亚洲黄色三级视频| 夜间精品视频| 尤物yw午夜国产精品视频明星| 久久久福利影院| 天堂√中文最新版在线| 亚洲美女免费视频| 日韩欧美99| 国产91免费看| 黄色小说综合网站| 日韩免费av在线| 国产精品99re| 欧美激情成人在线| 最近中文字幕2019免费| 国产在线观看无码免费视频| 日韩国产91| 在线一区二区三区| 日本一道本久久| 色av手机在线| 综合欧美一区二区三区| 五月婷婷一区| 可以在线观看的av网站| 99久久精品国产一区| 亚洲自拍小视频免费观看| 中文字幕 自拍偷拍| 亚洲在线成人| 韩国19禁主播vip福利视频| 乱老熟女一区二区三区| 精品国产一级毛片| 亚洲天堂av女优| 少妇真人直播免费视频| 久草精品视频| 精品1区2区在线观看| 欧美激情国内自拍| 色综合久久久| 欧美日韩国产一级片| 婷婷免费在线观看| 国产福利91精品一区二区| 在线观看免费亚洲| 日韩一区二区三区不卡视频| 涩涩涩在线视频| 欧美日韩在线视频一区二区| 欧美日韩性生活片| 2021天堂中文幕一二区在线观| 亚洲主播在线播放| 无码 制服 丝袜 国产 另类| 高清电影在线免费观看| 午夜精品视频在线观看| a√天堂在线观看| 91av亚洲| 欧美日韩中文精品| 九九热精品国产| 九九99久久精品在免费线bt| 日韩视频免费直播| 岛国av免费观看| 欧美有码在线| 亚洲偷熟乱区亚洲香蕉av| 青娱乐国产视频| 国产精品成人一区二区不卡| 久久成人av网站| 国产亚洲精品久久久久久无几年桃| 影音先锋日韩资源| 欧美专区日韩视频| 中文字幕无线码一区| 九色|91porny| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 久久精品女同亚洲女同13| 国产成人精品福利| 亚洲欧美日韩精品久久| 欧美一区二区三区粗大| 羞羞答答成人影院www| 欧美日韩第一页| av资源免费观看| 男男成人高潮片免费网站| 成人观看高清在线观看免费| www.激情五月.com| 91蝌蚪porny成人天涯| 日韩女优中文字幕| 新版中文在线官网| 欧美视频裸体精品| 成人不卡免费视频| 国产成人精品福利| 色偷偷偷亚洲综合网另类| 国产性生活网站| 久久精品国语| 91亚洲人电影| 欧洲一级在线观看| 亚洲特级片在线| 成人黄色av片| 成人乱码手机视频| 日韩精品视频免费在线观看| 肉色超薄丝袜脚交69xx图片| 亚洲国产专区校园欧美| 国产精品美女久久| 亚洲免费不卡视频| 国产精品三级av在线播放| 国产高清www| 美女色狠狠久久| 亚洲成人国产精品| 国产精品1区2区3区4区| 亚洲乱码视频| 国产在线视频91| 女人偷人在线视频| 亚洲综合视频在线| 在线看的黄色网址| 图片婷婷一区| 久久久久久久久国产| 中文字幕一区二区久久人妻| 成人91在线观看| 欧美日韩一级在线| 日本精品网站| 亚洲精品一区二三区不卡| 一区二区三区四区五区| 久久黄色影院| 久草一区二区| 欧美日韩色网| 6080午夜不卡| 欧美成人另类视频| 久久精品午夜| 久久久久天天天天| 操喷在线视频| 日韩精品一区二区三区视频| 激情高潮到大叫狂喷水| 日本欧美一区二区三区乱码| 久久精品国产精品国产精品污| 神马午夜伦理不卡| 欧美精品久久99| 粉嫩精品久久99综合一区| 国产一区二区三区久久久久久久久| 亚洲精品欧美一区二区三区| 午夜精品一区| 欧美区视频在线观看| av网站免费在线播放| 亚洲理伦在线| 久久青青草原| 香蕉伊大人中文在线观看| 亚洲成人久久一区| 日韩黄色在线视频| 懂色av一区二区三区免费看| 丰满人妻一区二区三区53号 | 欧美区亚洲区| 91手机在线视频| 在线电影福利片| 日韩欧美精品在线视频| 欧美精品久久久久性色| 国产成人精品免费一区二区| 轻点好疼好大好爽视频| 日本一区二区三区电影免费观看| 久久久精品亚洲| 国产永久免费视频| 亚洲人成伊人成综合网小说| 91香蕉视频导航| 999久久久91| 91午夜在线播放| 香蕉久久aⅴ一区二区三区| 精品久久久久久久人人人人传媒| 国产精品.www| 久久久久久夜精品精品免费| www.涩涩涩| 99精品视频在线| 成人情视频高清免费观看电影| 92久久精品| 亚洲女人被黑人巨大进入| 免费一级a毛片| 国产精品久久久久永久免费观看 | 欧美日韩综合在线观看| 26uuu亚洲| 精品999在线| 中文字幕亚洲精品乱码| 国产美女精品在线观看| 亚洲wwww| 久久伊人精品视频| 婷婷在线免费观看| 欧洲一区二区三区免费视频| 中文字幕资源站| 成人一二三区视频| 国产精品乱码久久久久| 欧美一区亚洲| 欧美午夜免费| 日本免费一区二区视频| 5566成人精品视频免费| 3d成人动漫在线| 精品国产露脸精彩对白| 中文字幕天堂在线| 亚洲高清不卡在线| 五月天婷婷丁香网| 成人午夜短视频| 欧美午夜aaaaaa免费视频| 欧美福利视频| 日本免费高清一区二区| 视频精品一区| 国产大片精品免费永久看nba| jizz性欧美10| 在线成人免费网站| 免费观看黄一级视频| 欧美精选一区二区| 中文字幕第15页| 亚洲精品高清视频在线观看| 成人性生交大免费看| 国产成人亚洲综合a∨猫咪| 成年人视频在线免费| 黑丝一区二区三区| 亚洲欧美影院| 蜜桃a∨噜噜一区二区三区| 亚洲综合中文字幕在线| gogo亚洲高清大胆美女人体| 欧美激情按摩在线| 麻豆视频在线免费观看| 亚洲人成在线电影| 欧美一级视频免费| 欧美一区二区三区喷汁尤物| 在线免费观看国产精品| 亚洲一区二区三区不卡国产欧美| 国产性猛交xx乱| 91免费看片在线观看| 深夜视频在线观看| 国模大尺度一区二区三区| 丁香婷婷激情网| 先锋影音久久| a级黄色一级片| 欧美午夜一区二区福利视频| 亚洲精品8mav| 欧美色图一区| 日本一区高清在线视频| 亚洲免费观看高清完整版在线观| 懂色av一区二区三区在线播放| **国产精品| 国产中文欧美精品| 激情小说亚洲| 国产免费一区二区三区在线观看| 欧美成a人片在线观看久| 欧美亚洲国产日韩2020| 性感女国产在线| 69久久夜色精品国产7777| 女同一区二区免费aⅴ| 欧美精品生活片| 日本一本在线免费福利| 欧美国产日韩一区| 高清电影在线免费观看| 久久人人爽人人爽人人片av高请 | 日韩一卡二卡在线| 亚洲大胆美女视频| 三级视频在线看| 日韩激情在线视频| 狠狠狠综合7777久夜色撩人 | 中文字幕成人动漫| 国产亚洲一本大道中文在线| 色欲AV无码精品一区二区久久| 国产片一区二区三区| 黄色片网站免费| 中文字幕亚洲一区二区va在线| 亚洲国产精品一区二区久久hs| 亚洲视频小说图片| 青青草国产在线观看| 亚洲一级二级三级| 日产精品久久久| 日本国产一区二区| 一级α片免费看刺激高潮视频| 欧美日高清视频| 亚洲av永久纯肉无码精品动漫| 精品国产百合女同互慰| 无码精品人妻一区二区三区影院| 亚洲免费视频一区二区| 最新电影电视剧在线观看免费观看| 久久久精品一区| 九色91在线| 日产日韩在线亚洲欧美| 精品三级在线| 爱情岛论坛亚洲入口| 日韩大胆成人| 亚洲一卡二卡区| 韩国一区二区三区在线观看| 一本大道熟女人妻中文字幕在线| 日韩精品成人一区二区三区| 欧美精品 - 色网| av电影天堂一区二区在线观看| 中文字幕一二三四区| 中文字幕日本不卡| 国产午夜小视频| 欧美性高清videossexo| 精品人妻一区二区三区换脸明星| 亚洲美女精品成人在线视频| 黄网站在线免费看| 5278欧美一区二区三区| 亚洲精品伦理| 精品久久久久久中文字幕动漫| 日本欧美肥老太交大片| av在线播放天堂| 免费观看在线综合| 亚洲av成人精品一区二区三区| 国产精品久久久久久久久久久免费看| 久久午夜无码鲁丝片午夜精品| 欧美影院一区二区| 日本免费不卡视频| 美女黄色丝袜一区| 向日葵视频成人app网址| 国产精品精品软件视频| 99久久影视| 又色又爽又高潮免费视频国产| 成人免费高清在线| 男人与禽猛交狂配| 欧美在线观看一区二区| 五月婷婷免费视频| 草民午夜欧美限制a级福利片| 欧美大片免费观看网址| 国产亚洲欧美一区二区| 91精品99| 欧美日韩一区二区三区69堂| www成人在线观看| 免费一级全黄少妇性色生活片| 欧美在线观看视频一区二区| 性感美女一级片| 欧美极品第一页| 综合中文字幕| 中文字幕色呦呦| 久久99久久久久| 夫妇交换中文字幕| 狠狠做深爱婷婷久久综合一区| 亚洲精品911| 欧美成人精品在线| 国产精品一区二区美女视频免费看 | 精品中文字幕在线2019| 色8久久久久| 亚洲人成网站在线播放2019| 玖玖在线精品| 亚洲精品视频久久久| 婷婷夜色潮精品综合在线| 男人天堂av网| 久久久久久久久亚洲| 午夜视频一区二区在线观看| 99中文字幕在线观看| 国内不卡的二区三区中文字幕| 午夜激情福利电影| 欧美日韩高清一区二区| 思思99re6国产在线播放| 国产精品一区二区三区在线播放| 欧美日韩伦理| 美女少妇一区二区| 亚洲欧洲国产专区| 国产一区二区三区成人| 久久视频在线观看免费| 亚洲一区av| 9色视频在线观看| 成人在线视频首页| 中文字幕激情小说| 亚洲人成电影网站| 成人看片在线观看| 亚洲欧洲日夜超级视频| 久久成人免费电影| 少妇影院在线观看| 亚洲二区中文字幕| 玛雅亚洲电影| 亚洲精品一区二区三区樱花| 美女脱光内衣内裤视频久久影院| 成人18视频免费69| 日韩欧美高清一区| 黄频免费在线观看| 色综合久久av| 激情久久久久久久久久久久久久久久| 久久久久99精品成人片试看| 欧美成人video| 亚洲电影观看| 亚洲国产一区在线| 国产精品一级片| 日本中文在线播放| 深夜精品寂寞黄网站在线观看| 激情综合五月| 日韩欧美亚洲天堂| 国产精品美女久久久久久久久久久| www.色播.com| 欧美一级视频免费在线观看| 欧美日韩中字| 亚洲美女精品视频| 欧美性生活大片免费观看网址| 日本视频在线| 国产偷久久久精品专区| 久久激情五月激情| 色播视频在线播放| 一区二区在线视频播放| 亚洲视频精选| 91蝌蚪视频在线观看| 亚洲资源中文字幕| 98在线视频| 精品在线视频一区二区三区| 乱一区二区av| 在线观看亚洲欧美|