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

Spring Security 中 CSRF 防御源碼解析

安全 應用安全
就是生成一個 CsrfToken,這個 Token,本質上就是一個 UUID 字符串,然后將這個 Token 保存到 HttpSession 中,或者保存到 Cookie 中,待請求到來時,從 HttpSession 或者 Cookie 中取出來做校驗。

 上篇文章松哥和大家聊了什么是 CSRF 攻擊,以及 CSRF 攻擊要如何防御。主要和大家聊了 Spring Security 中處理該問題的幾種辦法。

今天松哥來和大家簡單的看一下 Spring Security 中,CSRF 防御源碼。

本文主要從兩個方面來和大家講解:

  • 返回給前端的 _csrf 參數是如何生成的。
  • 前端傳來的 _csrf 參數是如何校驗的。

1.隨機字符串生成

我們先來看一下 Spring Security 中的 csrf 參數是如何生成的。

首先,Spring Security 中提供了一個保存 csrf 參數的規范,就是 CsrfToken:

  1. public interface CsrfToken extends Serializable { 
  2.  String getHeaderName(); 
  3.  String getParameterName(); 
  4.  String getToken(); 
  5.  

這里三個方法都好理解,前兩個是獲取 _csrf 參數的 key,第三個是獲取 _csrf 參數的 value。

CsrfToken 有兩個實現類,如下:

默認情況下使用的是 DefaultCsrfToken,我們來稍微看下 DefaultCsrfToken:

  1. public final class DefaultCsrfToken implements CsrfToken { 
  2.  private final String token; 
  3.  private final String parameterName; 
  4.  private final String headerName; 
  5.  public DefaultCsrfToken(String headerName, String parameterName, String token) { 
  6.   this.headerName = headerName; 
  7.   this.parameterName = parameterName; 
  8.   this.token = token; 
  9.  } 
  10.  public String getHeaderName() { 
  11.   return this.headerName; 
  12.  } 
  13.  public String getParameterName() { 
  14.   return this.parameterName; 
  15.  } 
  16.  public String getToken() { 
  17.   return this.token; 
  18.  } 

這段實現很簡單,幾乎沒有添加額外的方法,就是接口方法的實現。

CsrfToken 相當于就是 _csrf 參數的載體。那么參數是如何生成和保存的呢?這涉及到另外一個類:

  1. public interface CsrfTokenRepository { 
  2.  CsrfToken generateToken(HttpServletRequest request); 
  3.  void saveToken(CsrfToken token, HttpServletRequest request, 
  4.    HttpServletResponse response); 
  5.  CsrfToken loadToken(HttpServletRequest request); 

這里三個方法:

  1. generateToken 方法就是 CsrfToken 的生成過程。
  2. saveToken 方法就是保存 CsrfToken。
  3. loadToken 則是如何加載 CsrfToken。

CsrfTokenRepository 有四個實現類,在上篇文章中,我們用到了其中兩個:HttpSessionCsrfTokenRepository 和 CookieCsrfTokenRepository,其中 HttpSessionCsrfTokenRepository 是默認的方案。

我們先來看下 HttpSessionCsrfTokenRepository 的實現:

  1. public final class HttpSessionCsrfTokenRepository implements CsrfTokenRepository { 
  2.  private static final String DEFAULT_CSRF_PARAMETER_NAME = "_csrf"
  3.  private static final String DEFAULT_CSRF_HEADER_NAME = "X-CSRF-TOKEN"
  4.  private static final String DEFAULT_CSRF_TOKEN_ATTR_NAME = HttpSessionCsrfTokenRepository.class 
  5.    .getName().concat(".CSRF_TOKEN"); 
  6.  private String parameterName = DEFAULT_CSRF_PARAMETER_NAME; 
  7.  private String headerName = DEFAULT_CSRF_HEADER_NAME; 
  8.  private String sessionAttributeName = DEFAULT_CSRF_TOKEN_ATTR_NAME; 
  9.  public void saveToken(CsrfToken token, HttpServletRequest request, 
  10.    HttpServletResponse response) { 
  11.   if (token == null) { 
  12.    HttpSession session = request.getSession(false); 
  13.    if (session != null) { 
  14.     session.removeAttribute(this.sessionAttributeName); 
  15.    } 
  16.   } 
  17.   else { 
  18.    HttpSession session = request.getSession(); 
  19.    session.setAttribute(this.sessionAttributeName, token); 
  20.   } 
  21.  } 
  22.  public CsrfToken loadToken(HttpServletRequest request) { 
  23.   HttpSession session = request.getSession(false); 
  24.   if (session == null) { 
  25.    return null
  26.   } 
  27.   return (CsrfToken) session.getAttribute(this.sessionAttributeName); 
  28.  } 
  29.  public CsrfToken generateToken(HttpServletRequest request) { 
  30.   return new DefaultCsrfToken(this.headerName, this.parameterName, 
  31.     createNewToken()); 
  32.  } 
  33.  private String createNewToken() { 
  34.   return UUID.randomUUID().toString(); 
  35.  } 

這段源碼其實也很好理解:

  1. saveToken 方法將 CsrfToken 保存在 HttpSession 中,將來再從 HttpSession 中取出和前端傳來的參數做比較。
  2. loadToken 方法當然就是從 HttpSession 中讀取 CsrfToken 出來。
  3. generateToken 是生成 CsrfToken 的過程,可以看到,生成的默認載體就是 DefaultCsrfToken,而 CsrfToken 的值則通過 createNewToken 方法生成,是一個 UUID 字符串。
  4. 在構造 DefaultCsrfToken 是還有兩個參數 headerName 和 parameterName,這兩個參數是前端保存參數的 key。

這是默認的方案,適用于前后端不分的開發,具體用法可以參考上篇文章

如果想在前后端分離開發中使用,那就需要 CsrfTokenRepository 的另一個實現類 CookieCsrfTokenRepository ,代碼如下:

  1. public final class CookieCsrfTokenRepository implements CsrfTokenRepository { 
  2.  static final String DEFAULT_CSRF_COOKIE_NAME = "XSRF-TOKEN"
  3.  static final String DEFAULT_CSRF_PARAMETER_NAME = "_csrf"
  4.  static final String DEFAULT_CSRF_HEADER_NAME = "X-XSRF-TOKEN"
  5.  private String parameterName = DEFAULT_CSRF_PARAMETER_NAME; 
  6.  private String headerName = DEFAULT_CSRF_HEADER_NAME; 
  7.  private String cookieName = DEFAULT_CSRF_COOKIE_NAME; 
  8.  private boolean cookieHttpOnly = true
  9.  private String cookiePath; 
  10.  private String cookieDomain; 
  11.  public CookieCsrfTokenRepository() { 
  12.  } 
  13.  @Override 
  14.  public CsrfToken generateToken(HttpServletRequest request) { 
  15.   return new DefaultCsrfToken(this.headerName, this.parameterName, 
  16.     createNewToken()); 
  17.  } 
  18.  @Override 
  19.  public void saveToken(CsrfToken token, HttpServletRequest request, 
  20.    HttpServletResponse response) { 
  21.   String tokenValue = token == null ? "" : token.getToken(); 
  22.   Cookie cookie = new Cookie(this.cookieName, tokenValue); 
  23.   cookie.setSecure(request.isSecure()); 
  24.   if (this.cookiePath != null && !this.cookiePath.isEmpty()) { 
  25.     cookie.setPath(this.cookiePath); 
  26.   } else { 
  27.     cookie.setPath(this.getRequestContext(request)); 
  28.   } 
  29.   if (token == null) { 
  30.    cookie.setMaxAge(0); 
  31.   } 
  32.   else { 
  33.    cookie.setMaxAge(-1); 
  34.   } 
  35.   cookie.setHttpOnly(cookieHttpOnly); 
  36.   if (this.cookieDomain != null && !this.cookieDomain.isEmpty()) { 
  37.    cookie.setDomain(this.cookieDomain); 
  38.   } 
  39.  
  40.   response.addCookie(cookie); 
  41.  } 
  42.  @Override 
  43.  public CsrfToken loadToken(HttpServletRequest request) { 
  44.   Cookie cookie = WebUtils.getCookie(request, this.cookieName); 
  45.   if (cookie == null) { 
  46.    return null
  47.   } 
  48.   String token = cookie.getValue(); 
  49.   if (!StringUtils.hasLength(token)) { 
  50.    return null
  51.   } 
  52.   return new DefaultCsrfToken(this.headerName, this.parameterName, token); 
  53.  } 
  54.  public static CookieCsrfTokenRepository withHttpOnlyFalse() { 
  55.   CookieCsrfTokenRepository result = new CookieCsrfTokenRepository(); 
  56.   result.setCookieHttpOnly(false); 
  57.   return result; 
  58.  } 
  59.  private String createNewToken() { 
  60.   return UUID.randomUUID().toString(); 
  61.  } 

和 HttpSessionCsrfTokenRepository 相比,這里 _csrf 數據保存的時候,都保存到 cookie 中去了,當然讀取的時候,也是從 cookie 中讀取,其他地方則和 HttpSessionCsrfTokenRepository 是一樣的。

OK,這就是我們整個 _csrf 參數生成的過程。

總結一下,就是生成一個 CsrfToken,這個 Token,本質上就是一個 UUID 字符串,然后將這個 Token 保存到 HttpSession 中,或者保存到 Cookie 中,待請求到來時,從 HttpSession 或者 Cookie 中取出來做校驗。

2.參數校驗

那接下來就是校驗了。

校驗主要是通過 CsrfFilter 過濾器來進行,我們來看下核心的 doFilterInternal 方法:

  1. protected void doFilterInternal(HttpServletRequest request, 
  2.   HttpServletResponse response, FilterChain filterChain) 
  3.     throws ServletException, IOException { 
  4.  request.setAttribute(HttpServletResponse.class.getName(), response); 
  5.  CsrfToken csrfToken = this.tokenRepository.loadToken(request); 
  6.  final boolean missingToken = csrfToken == null
  7.  if (missingToken) { 
  8.   csrfToken = this.tokenRepository.generateToken(request); 
  9.   this.tokenRepository.saveToken(csrfToken, request, response); 
  10.  } 
  11.  request.setAttribute(CsrfToken.class.getName(), csrfToken); 
  12.  request.setAttribute(csrfToken.getParameterName(), csrfToken); 
  13.  if (!this.requireCsrfProtectionMatcher.matches(request)) { 
  14.   filterChain.doFilter(request, response); 
  15.   return
  16.  } 
  17.  String actualToken = request.getHeader(csrfToken.getHeaderName()); 
  18.  if (actualToken == null) { 
  19.   actualToken = request.getParameter(csrfToken.getParameterName()); 
  20.  } 
  21.  if (!csrfToken.getToken().equals(actualToken)) { 
  22.   if (this.logger.isDebugEnabled()) { 
  23.    this.logger.debug("Invalid CSRF token found for " 
  24.      + UrlUtils.buildFullRequestUrl(request)); 
  25.   } 
  26.   if (missingToken) { 
  27.    this.accessDeniedHandler.handle(request, response, 
  28.      new MissingCsrfTokenException(actualToken)); 
  29.   } 
  30.   else { 
  31.    this.accessDeniedHandler.handle(request, response, 
  32.      new InvalidCsrfTokenException(csrfToken, actualToken)); 
  33.   } 
  34.   return
  35.  } 
  36.  filterChain.doFilter(request, response); 

這個方法我來稍微解釋下:

  1. 首先調用 tokenRepository.loadToken 方法讀取 CsrfToken 出來,這個 tokenRepository 就是你配置的 CsrfTokenRepository 實例,CsrfToken 存在 HttpSession 中,這里就從 HttpSession 中讀取,CsrfToken 存在 Cookie 中,這里就從 Cookie 中讀取。
  2. 如果調用 tokenRepository.loadToken 方法沒有加載到 CsrfToken,那說明這個請求可能是第一次發起,則調用 tokenRepository.generateToken 方法生成 CsrfToken ,并調用 tokenRepository.saveToken 方法保存 CsrfToken。
  3. 大家注意,這里還調用 request.setAttribute 方法存了一些值進去,這就是默認情況下,我們通過 jsp 或者 thymeleaf 標簽渲染 _csrf 的數據來源。
  4. requireCsrfProtectionMatcher.matches 方法則使用用來判斷哪些請求方法需要做校驗,默認情況下,"GET", "HEAD", "TRACE", "OPTIONS" 方法是不需要校驗的。
  5. 接下來獲取請求中傳遞來的 CSRF 參數,先從請求頭中獲取,獲取不到再從請求參數中獲取。
  6. 獲取到請求傳來的 csrf 參數之后,再和一開始加載到的 csrfToken 做比較,如果不同的話,就拋出異常。

如此之后,就完成了整個校驗工作了。

3.LazyCsrfTokenRepository

前面我們說了 CsrfTokenRepository 有四個實現類,除了我們介紹的兩個之外,還有一個 LazyCsrfTokenRepository,這里松哥也和大家做一個簡單介紹。

在前面的 CsrfFilter 中大家發現,對于常見的 GET 請求實際上是不需要 CSRF 攻擊校驗的,但是,每當 GET 請求到來時,下面這段代碼都會執行:

  1. if (missingToken) { 
  2.  csrfToken = this.tokenRepository.generateToken(request); 
  3.  this.tokenRepository.saveToken(csrfToken, request, response); 

生成 CsrfToken 并保存,但實際上卻沒什么用,因為 GET 請求不需要 CSRF 攻擊校驗。

所以,Spring Security 官方又推出了 LazyCsrfTokenRepository。

LazyCsrfTokenRepository 實際上不能算是一個真正的 CsrfTokenRepository,它是一個代理,可以用來增強 HttpSessionCsrfTokenRepository 或者 CookieCsrfTokenRepository 的功能:

  1. public final class LazyCsrfTokenRepository implements CsrfTokenRepository { 
  2.  @Override 
  3.  public CsrfToken generateToken(HttpServletRequest request) { 
  4.   return wrap(request, this.delegate.generateToken(request)); 
  5.  } 
  6.  @Override 
  7.  public void saveToken(CsrfToken token, HttpServletRequest request, 
  8.    HttpServletResponse response) { 
  9.   if (token == null) { 
  10.    this.delegate.saveToken(token, request, response); 
  11.   } 
  12.  } 
  13.  @Override 
  14.  public CsrfToken loadToken(HttpServletRequest request) { 
  15.   return this.delegate.loadToken(request); 
  16.  } 
  17.  private CsrfToken wrap(HttpServletRequest request, CsrfToken token) { 
  18.   HttpServletResponse response = getResponse(request); 
  19.   return new SaveOnAccessCsrfToken(this.delegate, request, response, token); 
  20.  } 
  21.  private static final class SaveOnAccessCsrfToken implements CsrfToken { 
  22.   private transient CsrfTokenRepository tokenRepository; 
  23.   private transient HttpServletRequest request; 
  24.   private transient HttpServletResponse response; 
  25.  
  26.   private final CsrfToken delegate; 
  27.  
  28.   SaveOnAccessCsrfToken(CsrfTokenRepository tokenRepository, 
  29.     HttpServletRequest request, HttpServletResponse response, 
  30.     CsrfToken delegate) { 
  31.    this.tokenRepository = tokenRepository; 
  32.    this.request = request; 
  33.    this.response = response; 
  34.    this.delegate = delegate; 
  35.   } 
  36.   @Override 
  37.   public String getToken() { 
  38.    saveTokenIfNecessary(); 
  39.    return this.delegate.getToken(); 
  40.   } 
  41.   private void saveTokenIfNecessary() { 
  42.    if (this.tokenRepository == null) { 
  43.     return
  44.    } 
  45.  
  46.    synchronized (this) { 
  47.     if (this.tokenRepository != null) { 
  48.      this.tokenRepository.saveToken(this.delegate, this.request, 
  49.        this.response); 
  50.      this.tokenRepository = null
  51.      this.request = null
  52.      this.response = null
  53.     } 
  54.    } 
  55.   } 
  56.  
  57.  } 

這里,我說三點:

  1. generateToken 方法,該方法用來生成 CsrfToken,默認 CsrfToken 的載體是 DefaultCsrfToken,現在換成了 SaveOnAccessCsrfToken。
  2. SaveOnAccessCsrfToken 和 DefaultCsrfToken 并沒有太大區別,主要是 getToken 方法有區別,在 SaveOnAccessCsrfToken 中,當開發者調用 getToken 想要去獲取 csrfToken 時,才會去對 csrfToken 做保存操作(調用 HttpSessionCsrfTokenRepository 或者 CookieCsrfTokenRepository 的 saveToken 方法)。
  3. LazyCsrfTokenRepository 自己的 saveToken 則做了修改,相當于放棄了 saveToken 的功能,調用該方法并不會做保存操作。

使用了 LazyCsrfTokenRepository 之后,只有在使用 csrfToken 時才會去存儲它,這樣就可以節省存儲空間了。

LazyCsrfTokenRepository 的配置方式也很簡單,在我們使用 Spring Security 時,如果對 csrf 不做任何配置,默認其實就是 LazyCsrfTokenRepository+HttpSessionCsrfTokenRepository 組合。

當然我們也可以自己配置,如下:

  1. @Override 
  2. protected void configure(HttpSecurity http) throws Exception { 
  3.     http.authorizeRequests().anyRequest().authenticated() 
  4.             .and() 
  5.             .formLogin() 
  6.             .loginPage("/login.html"
  7.             .successHandler((req,resp,authentication)->{ 
  8.                 resp.getWriter().write("success"); 
  9.             }) 
  10.             .permitAll() 
  11.             .and() 
  12.             .csrf().csrfTokenRepository(new LazyCsrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())); 

4.小結

今天主要和小伙伴聊了一下 Spring Security 中 csrf 防御的原理。

整體來說,就是兩個思路:

生成 csrfToken 保存在 HttpSession 或者 Cookie 中。

請求到來時,從請求中提取出來 csrfToken,和保存的 csrfToken 做比較,進而判斷出當前請求是否合法。

本文轉載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉載本文請聯系江南一點雨公眾號。

 

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2021-06-03 10:16:12

CSRF攻擊SpringBoot

2022-05-19 11:29:14

計時攻擊SpringSecurity

2021-04-28 06:26:11

Spring Secu功能實現源碼分析

2016-09-30 15:59:41

2021-04-23 07:33:10

SpringSecurity單元

2016-09-21 10:11:19

2021-04-19 07:57:23

Spring 源碼GetBean

2013-05-22 18:32:57

2022-12-07 08:02:43

Spring流程IOC

2020-09-16 08:07:54

權限粒度Spring Secu

2023-11-03 07:58:54

CORSSpring

2022-11-26 00:00:02

2021-08-29 18:36:57

項目

2022-05-05 10:40:36

Spring權限對象

2020-09-02 08:09:10

攻擊防御Shiro

2011-05-16 14:26:28

2020-06-17 08:31:10

權限控制Spring Secu

2021-07-27 10:49:10

SpringSecurity權限

2022-08-17 07:52:31

Spring循環依賴單例池

2017-05-16 10:39:02

點贊
收藏

51CTO技術棧公眾號

青青视频免费在线观看| 国产精品444| 少妇户外露出[11p]| 成人做爰视频www| 亚洲免费观看高清在线观看| 国产一区二区黄色| 在线观看日批视频| 最新亚洲激情| 久久精品中文字幕电影| 性久久久久久久久久久| 欧美大陆国产| 五月激情丁香一区二区三区| 亚洲电影网站| 人妻中文字幕一区| 麻豆freexxxx性91精品| 久久久久久久久电影| 91视频免费在观看| 国产精品jk白丝蜜臀av小说| 在线播放中文一区| 激情综合在线观看| 午夜成年人在线免费视频| 久久九九99视频| 国产精品对白刺激久久久| 中文永久免费观看| 久久国产精品久久久久久电车| 另类视频在线观看| 国产精品久久久视频| 欧美黑人做爰爽爽爽| 日韩欧美国产午夜精品| 做a视频在线观看| 中文字幕日本一区二区| 黄色精品一区二区| 男女激情免费视频| av软件在线观看| 日韩理论在线观看| 性高潮久久久久久久久| 国产精品一区二区婷婷| 91免费视频网址| 国严精品久久久久久亚洲影视| 国产原创中文av| 美女精品自拍一二三四| 热久久这里只有| 久热这里只有精品6| 99精品视频免费| 韩国19禁主播vip福利视频| 欧美精品一级片| 欧美激情1区| 欧美大片在线看| 久久视频免费看| 亚洲视频综合| 久久男人的天堂| 日本在线免费观看| 国产日韩精品视频一区二区三区| 国产+人+亚洲| 欧美日韩乱国产| 久久狠狠一本精品综合网| 日韩av电影手机在线观看| 日本中文字幕第一页| 国产视频亚洲| 国产激情久久久| 欧美高清69hd| 国产一区三区三区| 99在线观看| 日韩专区第一页| 26uuu国产电影一区二区| 精品国产乱码久久久久久郑州公司| 全国男人的天堂网| 久久婷婷久久一区二区三区| 欧美动漫一区二区| av在线资源网| 亚洲人吸女人奶水| 真实国产乱子伦对白视频| 91福利在线尤物| 91精品办公室少妇高潮对白| 亚洲国产高清av| 麻豆视频久久| 日韩电影在线观看中文字幕| 在线不卡av电影| 97精品在线| 欧美精品成人在线| 在线观看亚洲黄色| 国产精品77777| 久久草.com| 精品国产白色丝袜高跟鞋| 亚洲国产精品久久一线不卡| 国产第一页视频| 99精品美女视频在线观看热舞| 精品国产伦一区二区三区免费| 国产三级视频网站| 一区二区在线| 欧亚精品在线观看| 国产美女裸体无遮挡免费视频| 99久久777色| 91手机视频在线| 成入视频在线观看| 在线精品观看国产| 91精品啪在线观看国产| 大胆日韩av| 性金发美女69hd大尺寸| 亚洲天天综合网| av不卡在线观看| 最新不卡av| 亚洲天堂手机| 欧美xxx久久| 丰满的亚洲女人毛茸茸| 日韩视频在线一区二区三区| 91精品视频在线| 天堂成人在线| 一区二区三区四区精品在线视频| 成人在线看视频| 欧美一区一区| 色小说视频一区| 国产精品一区无码| 成人激情文学综合网| av磁力番号网| 精品美女一区| 亚洲午夜激情免费视频| 久草国产精品视频| 国产毛片精品视频| 一本色道久久综合亚洲二区三区| 美女高潮视频在线看| 欧美精品一区二区三区一线天视频 | 欧美亚洲动漫另类| 亚洲第一黄色网址| 狠狠综合久久| 成人黄色片视频网站| 国产在线观看av| 欧美精品自拍偷拍| 2017亚洲天堂| 免费观看日韩电影| 日韩久久在线| 在线一区视频观看| 亚洲图片制服诱惑| 中文字幕精品无| 久久嫩草精品久久久精品| av在线观看地址| h视频久久久| 欧美激情第三页| 成 人 免费 黄 色| 一片黄亚洲嫩模| www男人天堂| 激情综合在线| 肥熟一91porny丨九色丨| 制服丝袜在线播放| 精品国产青草久久久久福利| 久久午夜鲁丝片午夜精品| 国产成人免费在线| youjizz.com在线观看| 哺乳挤奶一区二区三区免费看| 欧美成人免费网| 国产xxxx孕妇| 亚洲国产成人av网| 菠萝菠萝蜜网站| 午夜亚洲一区| 青青影院一区二区三区四区| se69色成人网wwwsex| 综合欧美国产视频二区| 国产又粗又猛视频| 1024亚洲合集| av电影在线播放| 国产精品最新自拍| 热re99久久精品国产99热| 视频一区在线免费看| 日韩中文字幕久久| 国产xxxxxx| 精品久久久一区二区| 一区二区精品免费| 狠狠狠色丁香婷婷综合久久五月| 亚洲av综合色区| 岛国成人av| 日本成人激情视频| 一广人看www在线观看免费视频| 在线成人免费视频| 精品深夜av无码一区二区老年| 99精品视频在线观看免费| 九一精品在线观看| 欧美特黄视频| 欧美亚洲国产免费| 国产精品18| 欧美伊久线香蕉线新在线| 在线观看美女网站大全免费| 日韩欧美色电影| 影音先锋在线国产| 亚洲欧美一区二区三区极速播放 | 亚洲国产aⅴ精品一区二区| 26uuu另类亚洲欧美日本老年| 91精彩视频在线观看| 欧美成人猛片aaaaaaa| 国产一级一级国产| 亚洲一区二区三区四区五区中文| 欧美老熟妇乱大交xxxxx| 国内久久精品视频| 日韩精品一区二区三区久久| 日韩在线视屏| 久久riav| 欧美h版在线观看| 日韩美女免费视频| 欧洲中文在线| xxxxx成人.com| 青青草免费在线| 日韩免费一区二区| 中文字幕在线视频免费| 图片区日韩欧美亚洲| 精品国产精品国产精品| aaa亚洲精品| 欧美国产日韩在线视频| 日产欧产美韩系列久久99| 777av视频| 欧美日本不卡高清| 亚洲一区二区三区四区中文| 外国成人在线视频| 成人91视频| www.成人在线.com| 国产精品入口免费视| 亚洲三级欧美| 性色av一区二区三区在线观看| 成人影欧美片| 久久精品视频在线播放| 国产二区视频在线观看| 亚洲国产女人aaa毛片在线| 精品欧美一区二区精品少妇| 欧美绝品在线观看成人午夜影视| av手机天堂网| 欧美性猛交xxxx富婆| 国产精品自拍视频一区| 亚洲精品国产成人久久av盗摄| 成人午夜免费影院| 国产欧美精品一区二区色综合| 国产夫妻性爱视频| 99久久免费精品高清特色大片| 无码人妻一区二区三区精品视频| 精品一区二区三区在线播放视频| 欧美三级午夜理伦三级富婆| 久久最新视频| 日韩中文字幕免费在线| 视频一区在线视频| 熟女人妇 成熟妇女系列视频| 久久经典综合| 免费大片在线观看| 天堂久久久久va久久久久| 黄色影院一级片| 久久久人人人| 88av.com| 久久99国产精品尤物| 日本中文字幕观看| 国产一区二区三区香蕉| 日本中文字幕在线不卡| 国产成人日日夜夜| 亚洲男女在线观看| 97久久久精品综合88久久| 9.1成人看片| 久久久久99精品一区| 日韩精品电影一区二区三区| 国产精品久久久久一区| 免费在线观看a级片| 亚洲日本韩国一区| 国产无套粉嫩白浆内谢| 精品欧美一区二区三区| 国产一级片av| 欧美久久久一区| 性欧美videos另类hd| 精品国产一区二区三区久久久蜜月| 黑人操亚洲女人| 日韩高清中文字幕| 北条麻妃在线| 欧美成人手机在线| 欧美aa在线| 国产精品亚洲网站| 视频在线一区| 玛丽玛丽电影原版免费观看1977 | 久久一级大片| 国产欧美欧洲| 欧美伦理影院| 日本免费黄色小视频 | 最新中文字幕2018| 国内成人自拍视频| 北岛玲一区二区| 中文字幕免费在线观看视频一区| 国产97免费视频| 精品久久久香蕉免费精品视频| 国产男人搡女人免费视频| 日韩欧美中文一区二区| 三级在线播放| 久久综合免费视频影院| 日韩精品av| 91久久久久久国产精品| 日韩理论电影中文字幕| 亚洲人成网站在线观看播放 | 亚洲视频一区在线观看| 国产成人一区二区三区影院在线| 欧美性一二三区| 囯产精品一品二区三区| 一区二区三区四区视频| 蜜桃传媒在线观看免费进入 | 成人台湾亚洲精品一区二区 | 性久久久久久久久久久| 综合电影一区二区三区 | 久久综合图片| 亚洲精品久久久久久| 欧美精彩视频一区二区三区| 久视频在线观看| 欧美日韩久久不卡| 三级在线观看| 久久久久亚洲精品| 粉嫩av国产一区二区三区| 热re99久久精品国产99热| 精品福利av| 日韩在线一区视频| 国产女主播一区| 精品人妻一区二区三区免费看| 日韩欧美一二三| 永久免费av片在线观看全网站| 1769国产精品| 精品精品国产毛片在线看| 国产免费xxx| 韩国欧美国产一区| 一级免费黄色录像| 91福利国产精品| 嫩草研究院在线| 91地址最新发布| 精品少妇3p| 色欲色香天天天综合网www| 国产美女主播视频一区| 久久视频一区二区三区| 色婷婷综合激情| 你懂的视频在线播放| 欧美性资源免费| 色狠狠久久av综合| 成人一对一视频| caoporen国产精品视频| 91精品国产高潮对白| 欧美成人video| 尤物视频在线看| 91超碰在线电影| 欧美日本不卡高清| 91传媒理伦片在线观看| 亚洲一区二区视频在线观看| 亚洲AV无码精品国产| 久久99国产精品自在自在app| 欧美.com| 国产成人在线小视频| 成人综合在线观看| 欧美日韩中文视频| 亚洲精品国产电影| 伊人久久在线| 日韩电影大全在线观看| 日韩不卡一区二区| 天堂а√在线中文在线鲁大师| 欧美理论电影在线| 最近中文字幕免费mv2018在线| 91天堂在线视频| 欧美午夜一区| 中文字幕天堂av| 欧美性猛交xxxx久久久| 成人亚洲综合天堂| 成人免费在线视频网站| 欧美视频在线观看| 日韩精品一区二区三区高清免费| 欧美日韩在线免费| 黄色av网站在线免费观看| 国产精品免费久久久| 欧美国产精品| 日本丰满少妇裸体自慰| 欧美视频一区二区三区在线观看| 一本一道波多野毛片中文在线| 91亚洲永久免费精品| 在线播放日韩| 日本欧美一区二区三区不卡视频| 欧美精品九九99久久| 伊人电影在线观看| 久久久av水蜜桃| 另类的小说在线视频另类成人小视频在线| 色婷婷粉嫩av| 亚洲国产私拍精品国模在线观看| 最新日韩三级| 亚洲天堂第一区| 26uuu久久综合| 国产欧美一级片| 欧美最近摘花xxxx摘花| 亚洲综合自拍| 少妇按摩一区二区三区| 91精品在线免费| 欧美1级2级| 女人床在线观看| 国产日产精品1区| www.成人在线观看| 国产精品高清在线观看| 国产精品videosex极品| 欧美性猛交xxxx乱| 欧美成人video| 成人综合网站| 国产原创popny丨九色| 国产精品国产三级国产aⅴ无密码| 亚洲精品一区二区三区不卡| 国产精品成av人在线视午夜片| 黄色精品免费| 免费成人美女女在线观看| 亚洲美女又黄又爽在线观看| 精品一区二区三区四区五区 | 欧美日韩激情电影|