精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

在线观看日韩一区二区| 日本人亚洲人jjzzjjz| gogo高清午夜人体在线| 91色porny在线视频| 国产精品美女无圣光视频| 欧美日韩生活片| 国产激情综合| 粉嫩av一区二区三区免费野| 色一情一乱一伦一区二区三欧美 | 欧美性jizz18性欧美| 色婷婷精品国产一区二区三区| a在线观看免费| 性娇小13――14欧美| 久久激情视频久久| 北岛玲一区二区| 成人污污www网站免费丝瓜| 亚洲成年人影院| 一区二区精品免费视频| 图片区 小说区 区 亚洲五月| 美国三级日本三级久久99| 国内免费精品永久在线视频| 一本一本久久a久久| 美女av一区| 日韩一区二区三区电影| 黄色三级视频在线| 中文字幕资源网在线观看免费| 亚洲人精品一区| 日本电影一区二区三区| a级片在线播放| 日韩精品久久久久久| 久久久久久尹人网香蕉| 91高清免费看| 欧美疯狂party性派对| 亚洲开心激情网| 97中文字幕在线观看| 精品视频在线一区| 欧美日韩国产首页在线观看| 日韩黄色片视频| 99爱在线视频| 亚洲综合成人在线视频| 一道本在线观看视频| yw在线观看| www一区二区| 精品综合久久久| 欧美一级淫片免费视频魅影视频| 国产成人精品一区二区三区四区 | 中文字幕中文在线| 成人网ww555视频免费看| 日韩欧美中文字幕在线观看| 欧美国产日韩激情| 污污网站在线看| 亚洲色图一区二区三区| eeuss中文| 国产激情小视频在线| 中文字幕一区二区在线观看| 亚洲精品日韩在线观看| 99免在线观看免费视频高清| 国产色综合一区| 欧美在线3区| 福利片在线观看| 国产午夜精品久久久久久久 | 国产视频一区在线观看一区免费| 久久99久国产精品黄毛片入口| 成人性生活毛片| 欧美日一区二区三区在线观看国产免| 欧美成年人在线观看| 免费中文字幕在线| 亚洲东热激情| 欧美亚洲激情视频| 久久久久女人精品毛片九一| 久久综合激情| 国产精品一区二区电影| 国产又黄又粗又硬| 国产二区国产一区在线观看| 粉嫩高清一区二区三区精品视频| 狠狠人妻久久久久久综合麻豆| 波多野结衣91| 欧美一区1区三区3区公司| av午夜在线| 日韩理论片网站| 菠萝蜜视频在线观看入口| 超碰资源在线| 欧美性一级生活| 国产999免费视频| 国产精品22p| 亚洲日韩第一页| 免费在线观看a级片| 一本久道久久综合狠狠爱| 日韩av黄色在线观看| 91久久精品国产91性色69 | 国产精品区免费视频| 免费在线视频一级不卡| 国产精品国产自产拍高清av王其| 老司机午夜网站| 精品众筹模特私拍视频| 色综合久久久久网| 日本特黄在线观看| 亚洲另类春色校园小说| 不卡av日日日| 日本高清不卡码| 国产一区二区三区精品欧美日韩一区二区三区| 国产精品成人观看视频免费| 国产亚洲依依| 亚洲一区二区三区自拍| 黄色一级二级三级| 日本亚洲视频| 亚洲午夜av久久乱码| 久久综合激情网| 蜜臀久久99精品久久久画质超高清 | 五月天婷婷导航| 国产麻豆一精品一av一免费| 快播亚洲色图| 欧美6一10sex性hd| 精品视频一区三区九区| 亚洲制服丝袜在线播放| 亚洲精品2区| 国产精品v日韩精品| 午夜小视频免费| 一区二区三区四区蜜桃| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 国产suv精品一区二区四区视频| 中文字幕亚洲欧美一区二区三区| 日韩一区二区视频在线| 国产成人av福利| 欧美h视频在线观看| 日韩精品一区二区三区| 亚洲第一色中文字幕| 中文字幕电影av| 免费成人av资源网| 天堂一区二区三区 | 伊人久久婷婷| 7777精品久久久大香线蕉小说| 中文字幕在线视频区| 欧美日韩在线视频一区| 在线播放av网址| 亚洲国产精品成人| 国产色视频一区| 91xxx在线观看| 欧美在线免费播放| mm131丰满少妇人体欣赏图| 亚洲综合国产激情另类一区| 国产精品久久久久久久久久直播 | 希岛爱理av一区二区三区| 国产精品久久久久久一区二区| 天堂v视频永久在线播放| 亚洲国产裸拍裸体视频在线观看乱了 | 97se狠狠狠综合亚洲狠狠| 久久手机在线视频| 911亚洲精品| 韩国日本不卡在线| 五月婷婷深深爱| 偷拍日韩校园综合在线| 国产又黄又粗又猛又爽的视频 | 国产精品白嫩美女在线观看 | 7777免费精品视频| 手机看片国产1024| 欧美日韩国产黄| 国产熟妇久久777777| 午夜影院日韩| 日本日本精品二区免费| 日韩一区二区三区免费| 中文字幕久热精品在线视频| 中文字幕 自拍偷拍| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 亚洲一区久久| 欧美在线激情| 亚洲图片小说区| 欧美多人爱爱视频网站| 黄频网站在线观看| 精品国产老师黑色丝袜高跟鞋| 亚洲天堂成人av| 青青草国产成人av片免费| 夜夜爽99久久国产综合精品女不卡| 四虎国产精品免费久久| 欧美大片在线影院| 丝袜+亚洲+另类+欧美+变态| 91福利区一区二区三区| 国产精品久久久免费看| 成人在线视频一区| 不卡影院一区二区| 99久久婷婷这里只有精品| 丁香婷婷久久久综合精品国产| 1234区中文字幕在线观看| 亚洲欧美日韩国产精品| 国产精品美女一区| 五月天激情小说综合| 男人舔女人下部高潮全视频| 精品系列免费在线观看| 日本福利视频一区| 精品久久影院| av日韩中文字幕| 男人皇宫亚洲男人2020| 久久精品亚洲精品| 日韩在线免费看| 欧美高清www午色夜在线视频| 福利一区二区三区四区| 欧美国产综合一区二区| 9.1在线观看免费| 蜜臀av国产精品久久久久| 国产亚洲黄色片| 国产精品不卡| 久久久久久久久久码影片| 高清精品久久| 日韩免费精品视频| caoprom在线| 久久精品国产成人精品| 外国精品视频在线观看| 欧美一二三区在线| 啪啪小视频网站| 天天色图综合网| 一区二区视频免费看| 欧美韩日一区二区三区四区| 欧美 变态 另类 人妖| 国产原创一区二区| 国产精品人人爽人人爽| 国产精品毛片| 日韩成人手机在线| 99久久综合狠狠综合久久aⅴ| 久久久99爱| 4438全国亚洲精品观看视频| 国产在线精品自拍| 日韩中文视频| 日本人成精品视频在线| 超碰在线视屏| 久久久久久亚洲精品不卡| 97影院秋霞午夜在线观看| 在线午夜精品自拍| 可以免费看污视频的网站在线| 亚洲成人动漫在线播放| 国产肥老妇视频| 欧美福利一区二区| 亚洲香蕉在线视频| 欧洲人成人精品| 亚洲不卡在线视频| 欧美性猛交xxxx乱大交极品| 日韩黄色三级视频| 午夜精品在线视频一区| 国产在线一二区| 亚洲在线一区二区三区| 精品人妻在线播放| 亚洲影视在线观看| 精品无码人妻一区二区三| 亚洲男人天堂av| 欧美日韩激情在线观看| 亚洲欧美一区二区三区国产精品 | 韩日欧美一区| www.激情网| 极品中文字幕一区| 国产一区二区三区小说| 亚洲成人资源| 国产极品粉嫩福利姬萌白酱| 99热这里只有精品8| 老太脱裤子让老头玩xxxxx| 99国产精品| www.浪潮av.com| 日韩精品电影一区亚洲| mm1313亚洲国产精品无码试看| 日韩精品成人一区二区三区| 9l视频白拍9色9l视频| 蜜臀av性久久久久蜜臀aⅴ| 91日韩精品视频| 国模大尺度一区二区三区| 6080国产精品| 成人深夜在线观看| 国产精品无码网站| 欧美经典三级视频一区二区三区| 成人在线观看免费高清| 亚洲欧美色一区| 久久久久久久福利| 精品欧美国产一区二区三区| 亚洲av无码精品一区二区| 欧美日韩激情在线| 亚洲AV无码一区二区三区性 | 国产精品二区在线观看| 秋霞综合在线视频| 日本一区二区三区免费观看| 久久精品国内一区二区三区水蜜桃| 女人色极品影院| 午夜一区不卡| 视频区 图片区 小说区| 不卡欧美aaaaa| 性欧美一区二区| 亚洲精品水蜜桃| 国产又大又粗又爽| 欧美精选一区二区| 天天操天天干天天舔| 在线观看欧美日韩国产| 色yeye免费人成网站在线观看| 欧美在线激情视频| 亚洲香蕉久久| 国产在线欧美日韩| 99成人超碰| 久久黄色片视频| 激情久久久久久久久久久久久久久久| 成人啪啪18免费游戏链接| 国产视频911| 日韩精品一区二区在线播放 | 婷婷综合在线| 久久久噜噜噜www成人网| 精油按摩中文字幕久久| 西西大胆午夜视频| 亚洲欧美欧美一区二区三区| 无码人妻久久一区二区三区| 日韩欧美一级二级三级久久久| 国产在线观看精品一区| 欧美精品电影在线| 亚洲免费看片| 欧美一区二区三区四区五区六区| 欧美黄在线观看| 成人免费在线观看视频网站| 99精品久久免费看蜜臀剧情介绍| 日本黄色片免费观看| 91成人免费电影| 五月天婷婷视频| 久久久久久久久久久网站| 亚洲综合资源| 欧美日韩成人一区二区三区| 亚洲调教视频在线观看| 国产美女18xxxx免费视频| 国产欧美视频一区二区| 在线精品免费视| 日韩黄在线观看| 丁香花视频在线观看| 91丝袜美腿美女视频网站| 欧美在线电影| 日韩av资源在线| 91污片在线观看| xxxxxx国产| 精品久久久久久久久久久院品网| 国产盗摄在线观看| 国产一区二区在线播放| 成人在线视频免费观看| 激情内射人妻1区2区3区| 91麻豆产精品久久久久久| 欧美黑人一级片| 日韩欧美久久久| 少妇av在线| 成人片在线免费看| 国内精品美女在线观看| 国产日韩视频一区| 亚洲午夜免费电影| 乱色精品无码一区二区国产盗| 欧美高清视频在线观看| 我要色综合中文字幕| 成人在线免费高清视频| 国产精品一区免费在线观看| av女优在线播放| 国产麻豆一精品一av一免费| www.av成人| 日韩三级视频在线看| 污视频网站在线免费| 波多野结衣一区二区三区在线观看| 自拍欧美日韩| 一区二区三区人妻| 亚洲制服丝袜av| 天天干天天干天天干| 4438全国成人免费| 亚洲人成亚洲精品| 不卡av免费在线| 国产精品日产欧美久久久久| 一区二区国产欧美| 欧美成人精品一区二区三区| 一区二区三区四区精品视频| 欧美激情视频免费看| 99麻豆久久久国产精品免费优播| 亚洲精品国产精品乱码| 亚洲欧洲日本专区| 色综合久久久| 国产曰肥老太婆无遮挡| 91免费国产在线| 中日精品一色哟哟| 美女国内精品自产拍在线播放| 7m精品国产导航在线| 国产成人亚洲精品无码h在线| 国产精品欧美精品| 内射后入在线观看一区| 日韩免费观看视频| 欧美在线国产| 亚洲av无码一区二区三区观看| 欧美三级电影网| 青草影视电视剧免费播放在线观看| 久久精品人成| 精品一区二区免费看| 久久亚洲成人av| 一区二区三区视频观看| 欧州一区二区三区| 欧美日韩在线不卡视频| 亚洲欧美日韩系列| 欧美成人免费| 91久久精品国产91久久性色tv| 国产伦理一区| 一区二区视频免费看| 亚洲欧美日韩一区二区在线| 精品久久免费| 国产欧美高清在线| 亚洲综合免费观看高清在线观看| 高清国产福利在线观看| 国产乱码一区| 国产综合色在线| 91视频在线视频|