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

SpringCloud微服務,如何保證對外接口的安全?

開發 架構
在本文中,我們深入研究了微服務架構中對外開放接口的安全性保障機制。我們著重關注了那些暴露在外網的API接口面臨的兩個關鍵安全問題:篡改和重放。

大家好,我是飄渺。如果你的微服務需要向第三方開放接口,如何確保你提供的接口是安全的呢?

1. 什么是安全接口

通常來說,要將暴露在外網的 API 接口視為安全接口,需要實現防篡改和防重放的功能。

1.1 什么是篡改問題?

由于 HTTP 是一種無狀態協議,服務端無法確定客戶端發送的請求是否合法,也不了解請求中的參數是否正確。以一個充值接口為例:

http://localhost/api/user/recharge?user_id=1001&amount=10

如果非法用戶通過抓包獲取接口參數并修改 user_id 或 amount 的值,就能為任意賬戶添加余額。

1.1.1 如何解決篡改問題?

雖然使用 HTTPS 協議能對傳輸的明文進行加密,但黑客仍可截獲數據包進行重放攻擊。兩種通用解決方案是:

  1. 使用 HTTPS 加密接口數據傳輸,即使被黑客破解,也需要耗費大量時間和精力。
  2. 在接口后臺對請求參數進行簽名驗證,以防止黑客篡改。

簽名的實現過程如下圖所示:

圖片圖片

  • 步驟1:客戶端使用約定好的規則對傳輸的參數進行加密,得到簽名值sign1,并且將簽名值也放入請求的參數中,隨請求發送至服務端。
  • 步驟2:服務端接收到請求后,使用約定好的規則對請求的參數再次進行簽名,得到簽名值 sign2。
  • 步驟3:服務端比對 sign1 和 sign2 的值,若不一致,則認定為被篡改,判定為非法請求。

1.2. 什么是重放問題?

防重放也叫防復用。簡單來說就是我獲取到這個請求的信息之后什么也不改,,直接拿著接口的參數去 重復請求這個充值的接口。此時我的請求是合法的, 因為所有參數都是跟合法請求一模一樣的。重放攻擊會造成兩種后果:

  1. 針對插入數據庫接口:重放攻擊,會出現大量重復數據,甚至垃圾數據會把數據庫撐爆。
  2. 針對查詢的接口:黑客一般是重點攻擊慢查詢接口,例如一個慢查詢接口1s,只要黑客發起重放攻擊,就必然造成系統被拖垮,數據庫查詢被阻塞死。

1.2.1 如何解決重放問題?

防重放,業界通常基于 nonce + timestamp 方案實現。每次請求接口時生成 timestamp 和 nonce 兩個額外參數,其中 timestamp 代表當前請求時間,nonce 代表僅一次有效的隨機字符串。生成這兩個字段后,與其他參數一起進行簽名,并發送至服務端。服務端接收請求后,先比較 timestamp 是否超過規定時間(如60秒),再查看 Redis 中是否存在 nonce,最后校驗簽名是否一致,是否有篡改。

如果看過我DDD&微服務系列中冪等方案的文章,對于nonce方案肯定比較熟悉,這就是冪等方案中的token機制,只不過此時冪等key是由客戶端生成的。

圖片圖片

2. 身份認證方案

我們已經了解了如何解決對外接口可能遇到的篡改和重放問題,但還遺漏了最關鍵的身份認證環節。一般而言,對互聯網開放的接口不是任何人都能調用的,只有經過認證的用戶或機構才有權限訪問。解決身份認證問題通常通過 AppId 和 AppSecret 實現。

2.1 AppId + AppSecret

AppId作為一種全局唯一的標識符,主要用于用戶身份識別。為防止其他用戶惡意使用別人的 AppId 發起請求,通常采用配對 AppSecret 的方式,類似一種密碼。在請求方發起請求時,需將 AppID 和 AppSecret 搭配上前文提到的安全方案,一并簽名提交給提供方驗證。

現在,讓我們再來梳理一下完整的簽名方案。

1、服務方提供一組 AppId 和 AppSecret,并由客戶端保存。

2、將timestamp、nonce、AppId 與請求參數一起并按照字典排序,使用URL鍵值對(key1=value1&key2=value2…)的格式拼接形成字符串StringA。

3、在StringA的最后拼接上AppSecret,得到字符串StringB。

4、使用摘要算法對 StringB 進行加密,并將得到的字符串轉為大寫,得到簽名值 sign,將其與參數一起發送給服務端。

5、服務端接收請求后,對接口進行校驗(時間、隨機字符串、身份驗證、簽名)。

在這個流程中,AppID 參與本地加密和網絡傳輸,而 AppSecret 僅作本地加密使用,不參與網絡傳輸。服務端拿到 AppID 后,從存儲介質中獲取對應的 AppSecret,然后采用與客戶端相同的簽名規則生成服務端簽名,最后比較客戶端簽名和服務端簽名是否一致。

3. 代碼實現

"Talk is cheap. Show me the code." 說了這么久,現在讓我們從代碼的角度來看看如何在 DailyMart 中將上面的理論知識串聯起來,安全地對外提供接口。

本文涉及到的所有代碼都已上傳至github,如果需要請參考文末方式進行獲取。

3.1 AppId 和 AppSecret的生成

在生成 AppId 和 AppSecret 時,只需確保 AppId 的全局唯一性,然后將生成的 AppId 和 AppSecret 進行綁定。在 DailyMart 中,我們使用短鏈的生成算法來生成 AppId,再對 AppId 進行 SHA 加密后得到對應的 AppSecret。

private static String getAppKey() {
 long num = IdUtils.nextId();
 StringBuilder sb = new StringBuilder();
 do {
  int remainder = (int) (num % 62);
  sb.insert(0, BASE62_CHARACTERS.charAt(remainder));
  num /= 62;
 } while (num != 0);
 return sb.toString();
}

通過這個算法生成的 AppId 和 AppSecret 形如:

appKey=6iYWoL2hBk9, appSecret=5de8bc4d8278ed4f14a3490c0bdd5cbe369e8ec9

3.2 API校驗器

在一個系統中可能存在多種認證邏輯,比如既要支持今天所講的開放接口校驗邏輯,還需要支持內部服務的 JWT 認證邏輯。為了方便處理,我們抽象一個 API 認證接口,各種認證邏輯獨立到自己的實現中,對于今天所講的開放接口認證,主要關注 ProtectedApiAuthenticator。

圖片圖片

//認證接口
public interface ApiAuthenticator {
  AuthenticatorResult auth(ServerWebExchange request); 
}

//具體實現
@Slf4j
public class ProtectedApiAuthenticator implements ApiAuthenticator {
  ...
}

3.2 網關過濾器

接口的安全校驗很適合放在網關層實現,因此我們需要在網關服務中創建一個過濾器 ApiAuthenticatorFilter。

@Component
@Slf4j
public class ApiAuthenticatorFilter implements GlobalFilter, Ordered {
    ...
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
       
        // 獲取認證邏輯
        ApiAuthenticator apiAuthenticator = getApiAuthenticator(rawPath);
        AuthenticatorResult authenticatorResult = apiAuthenticator.auth(exchange);
      
        if (!authenticatorResult.isResult()) {
            return Mono.error(new HttpServerErrorException(
                    HttpStatus.METHOD_NOT_ALLOWED, authenticatorResult.getMessage()));
        }
        
        return chain.filter(exchange);
        
    }
    
   
   /**
     * 確定認證策略
     * @param rawPath 請求路徑
     */
    private ApiAuthenticator getApiAuthenticator(String rawPath) {
        String[] parts = rawPath.split("/");
        if (parts.length >= 4) {
            String parameter = parts[3];
              return switch (parameter) {
                case PROTECT_PATH ->   new ProtectedApiAuthenticator();
                case PRIVATE_PATH ->   new PrivateApiAuthenticator();
                case PUBLIC_PATH ->    new PublicApiAuthenticator();
                case DEFAULT_PATH ->   new DefaultApiAuthenticator();
                default -> throw new IllegalStateException("Unexpected value: " + parameter);
              };
        }
        return new DefaultApiAuthenticator();
    }
    
}

上面提到過,不同類型的服務其接口認證不一樣,為了便于區分,可以規定對于外部請求都增加一個特定的請求前綴 /pt/,如 apigw.xxx.com/order-service/api/pt/creadeOrder。這樣在過濾器內部就需要通過 getApiAuthenticator() 方法確定認證邏輯。

3.3 接口安全認證

正如上文所說,服務端獲取到請求參數以后需要檢查請求時間是否過期,nonce是否已經被使用,簽名是否正確。

圖片圖片

按照這個邏輯我們很容易在ProtectedApiAuthenticator認證器中寫出這樣的代碼。

@Slf4j
public class ProtectedApiAuthenticator implements ApiAuthenticator {

    @Override
    public AuthenticatorResult auth(ServerWebExchange exchange)  {
        
        // 1. 校驗參數
        boolean checked = preAuthenticationCheck(requestHeader);
        if (!checked) {
            return new AuthenticatorResult(false, "請攜帶正確參數訪問");
        }

        // 2 . 重放校驗
        // 判斷timestamp時間戳與當前時間是否操過60s(過期時間根據業務情況設置),如果超過了就提示簽名過期。
        long now = System.currentTimeMillis() ;      
         if (now - Long.parseLong(requestHeader.getTimestamp()) > 60000) {
            return new AuthenticatorResult(false, "請求超時,請重新訪問");
         }

        // 3. 判斷nonce
        boolean nonceExists = distributedCache.hasKey(NONCE_KEY + requestHeader.getNonce());
        if (nonceExists) {
            return new AuthenticatorResult(false, "請勿重復提交請求");
        } else {
            distributedCache.put(NONCE_KEY + requestHeader.getNonce(), requestHeader.getNonce(), 60000);
        }
      
        // 4. 簽名校驗
       SortedMap<String, Object> requestBody = CachedRequestUtil.resolveFromBody(exchange);
       String sign = buildSign(requestHeader,requestBody);
      if(!sign.equals(requestHeader.getSign())){
        return new AuthenticatorResult(false, "簽名錯誤");
      }
      
      return new AuthenticatorResult(true, "");
}

這樣的寫法雖然能夠完成校驗邏輯,但稍顯不夠優雅。在這種場景中,使用設計模式中的責任鏈模式是非常合適的選擇。通過責任鏈模式,將校驗邏輯分解為多個責任鏈節點,每個節點專注于一個方面的校驗,使得代碼更加清晰和易于維護。

責任鏈模式已經在我星球設計模式專欄中有詳細介紹與說明,這里就不再贅述了~

@Slf4j
public class ProtectedApiAuthenticator implements ApiAuthenticator {

    @Override
    public AuthenticatorResult auth(ServerWebExchange exchange)  {
        ...
        //構建校驗對象
        ProtectedRequest protectedRequest = ProtectedRequest.builder()
                .requestHeader(requestHeader)
                .requestBody(requestBody)
                .build();

    //責任鏈上下文
        SecurityVerificationChain securityVerificationChain = SpringBeanUtils.getInstance().getBean(SecurityVerificationChain.class);

        return securityVerificationChain.handler(protectedRequest);

    }

}

3.4 基于責任鏈的認證實現

圖片圖片

3.4.1 創建責任鏈的認證接口

public interface SecurityVerificationHandler extends Ordered {
    /**
     * 請求校驗
     */
    AuthenticatorResult handler(ProtectedRequest protectedRequest);
}

3.4.2 實現參數校驗邏輯

@Component
public class RequestParamVerificationHandler implements SecurityVerificationHandler {

    @Override
    public AuthenticatorResult handler(ProtectedRequest protectedRequest) {

        boolean checked = checkedHeader(protectedRequest.getRequestHeader());

        if(!checked){
            return new AuthenticatorResult(false,"請攜帶正確的請求參數");
        }
        return new AuthenticatorResult(true,"");
    }

    private boolean checkedHeader(RequestHeader requestHeader) {
        return Objects.nonNull(requestHeader.getAppId()) &&
                Objects.nonNull(requestHeader.getSign()) &&
                Objects.nonNull(requestHeader.getNonce()) &&
                Objects.nonNull(requestHeader.getTimestamp());
    }

    @Override
    public int getOrder() {
        return 1;
    }
}

3.4.3 實現nonce的校驗

@Component
public class NonceVerificationHandler implements SecurityVerificationHandler {
    private static final String NONCE_KEY = "x-nonce-";

    @Value("${dailymart.sign.timeout:60000}")
    private long expireTime ;
  
    @Resource
    private DistributedCache distributedCache;

    @Override
    public AuthenticatorResult handler(ProtectedRequest protectedRequest) {
        String nonce = protectedRequest.getRequestHeader().getNonce();
        boolean nonceExists = distributedCache.hasKey(NONCE_KEY + nonce);

        if (nonceExists) {
            return new AuthenticatorResult(false, "請勿重復提交請求");
        } else {
            distributedCache.put(NONCE_KEY + nonce, nonce, expireTime);
            return new AuthenticatorResult(true, "");
        }
    }

    @Override
    public int getOrder() {
        return 3;
    }
}

3.4.4 實現簽名認證

@Component
@Slf4j
public class SignatureVerificationHandler implements SecurityVerificationHandler {
    @Override
    public AuthenticatorResult handler(ProtectedRequest protectedRequest) {

        //1. 服務端按照規則重新簽名
        String serverSign = sign(protectedRequest);
        log.info("服務端簽名結果: {}", serverSign);

        String clientSign = protectedRequest.getRequestHeader().getSign();
        // 2、獲取客戶端傳遞的簽名
        log.info("客戶端簽名: {}", clientSign);

        if (!Objects.equals(serverSign,clientSign)) {
            return new AuthenticatorResult(false, "請求簽名無效");
        }
        return new AuthenticatorResult(true, "");
    }

    /**
     * 服務端重建簽名
     * @param protectedRequest 請求體
     * @return 簽名結果
     */
    private String sign(ProtectedRequest protectedRequest) {
        RequestHeader requestHeader = protectedRequest.getRequestHeader();
        String appId = requestHeader.getAppId();

        String appSecret = getAppSecret(appId);
        // 1、 按照規則對數據進行簽名
        SortedMap<String, Object> requestBody = protectedRequest.getRequestBody();
        requestBody.put("app_id",appId);
        requestBody.put("nonce_number",requestHeader.getNonce());
        requestBody.put("request_time",requestHeader.getTimestamp());

        StringBuilder signBuilder = new StringBuilder();
        for (Map.Entry<String, Object> entry : requestBody.entrySet()) {
            signBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }
        signBuilder.append("appSecret=").append(appSecret);

        return DigestUtils.md5DigestAsHex(signBuilder.toString().getBytes()).toUpperCase();
    }


    @Override
    public int getOrder() {
        return 4;
    }

}

3.4.5 責任鏈上下文

@Component
@Slf4j
public class SecurityVerificationChain {
    @Resource
    private List<SecurityVerificationHandler> securityVerificationHandlers;

    public AuthenticatorResult handler(ProtectedRequest protectedRequest){
        AuthenticatorResult authenticatorResult = new AuthenticatorResult(true,"");
        for (SecurityVerificationHandler securityVerificationHandler : securityVerificationHandlers) {
            AuthenticatorResult result = securityVerificationHandler.handler(protectedRequest);
            // 有一個校驗不通過理解返回
            if(!result.isResult()){
                return result;
            }
        }
        return authenticatorResult;

    }

}

組合所有的校驗邏輯,任意一個校驗邏輯不通過則直接返回。

小結

在本文中,我們深入研究了微服務架構中對外開放接口的安全性保障機制。我們著重關注了那些暴露在外網的API接口面臨的兩個關鍵安全問題:篡改和重放。為了應對篡改問題,我們引入了雙重手段:采用HTTPS進行加密傳輸,并結合接口參數簽名驗證,以確保數據傳輸的完整性和安全性。對于重放問題,我們采納了基于nonce和timestamp的方案,以保證請求的唯一性和有效性。

在具體的代碼實現中,我們不僅考慮了文章中提到的安全認證邏輯,還充分考慮了其他可能的校驗規則。為了更好地組織和管理這些校驗規則,我們將它們拆分成獨立的模塊,根據請求路徑動態選擇相應的接口校驗器。在第三方接口校驗邏輯中,我們通過責任鏈的設計模式實現了具體的校驗規則,使得代碼邏輯更為模塊化和可擴展。這樣的結構不僅使得每個校驗步驟聚焦于特定的安全性驗證,而且提供了良好的可維護性和可擴展性。

最后給大家一個小建議:對外提供的接口協議盡量簡單,不要使用Restful接口風格,全部使用post+json或post+form風格的接口協議即可,這樣對客戶端和服務端都方便。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2019-11-20 23:44:29

接口數據加密數據安全

2021-05-26 08:49:15

API接口安全

2020-11-18 09:37:44

微服務

2023-10-16 11:12:29

2010-10-08 10:17:59

Web服務安全

2024-02-22 08:12:41

接口微服務內網服務

2018-06-25 09:48:00

數據安全云服務

2023-07-11 08:55:26

系統白名單AO

2024-07-08 11:30:35

2024-03-18 08:48:52

Spring多端認證微服務

2014-06-11 09:36:36

云存儲數據安全

2024-03-27 09:01:53

微服務FeignToken

2012-01-10 10:23:20

鐵路網絡接口

2010-06-02 13:29:55

2025-10-09 01:22:00

2024-11-27 08:47:12

2021-08-02 09:27:02

微服務接口場景

2023-02-04 10:08:40

2020-12-01 11:18:34

對外接口枚舉

2009-03-04 06:37:00

點贊
收藏

51CTO技術棧公眾號

在线观看亚洲精品视频| 菠萝蜜视频在线观看一区| 亚洲人成在线观| 青青草久久伊人| 男女在线观看视频| av亚洲产国偷v产偷v自拍| 日本午夜人人精品| 久久国产波多野结衣| 哺乳挤奶一区二区三区免费看| 黄色一区二区三区| 亚洲午夜精品福利| 五月婷婷开心中文字幕| 久久69国产一区二区蜜臀| 久久久久久久香蕉网| 337人体粉嫩噜噜噜| 99久久人爽人人添人人澡 | 懂色av一区二区三区蜜臀 | 国产精品专区在线| h视频在线播放| 懂色av一区二区在线播放| 国产精品久久久久久久久久久新郎| 青草草在线视频| 精品免费一区二区| 亚洲国产欧美久久| 第四色婷婷基地| 亚洲精品福利电影| 亚洲一区自拍偷拍| 中国一级黄色录像| 国产午夜视频在线观看| 95精品视频在线| αv一区二区三区| 88av在线视频| 亚洲中午字幕| 高清欧美性猛交xxxx黑人猛交| 成人性生交大片免费看无遮挡aⅴ| 精品久久97| 日韩美女一区二区三区| 日本高清一区二区视频| 成人久久网站| 欧洲人成人精品| www黄色av| 伊人久久av| 欧美日韩国产精品| 欧美黑人经典片免费观看| 欧美xxxx做受欧美88bbw| 亚洲日本欧美天堂| 亚洲 欧洲 日韩| 日本三级在线播放完整版| 国产欧美日本一区二区三区| 九九九久久久| 无码国产伦一区二区三区视频| 国产aⅴ精品一区二区三区色成熟| 91在线视频成人| 国产一区二区在线不卡| 麻豆91小视频| 成人久久18免费网站图片| 中文字幕欧美色图| 裸体在线国模精品偷拍| 国产精品一香蕉国产线看观看| 亚洲欧美一二三区| 日本视频一区二区三区| 国产精品视频自拍| 一级爱爱免费视频| 激情伊人五月天久久综合| 成人午夜在线观看| www五月婷婷| 波多野结衣在线一区| 久久精品日产第一区二区三区精品版| 天堂在线观看免费视频| 久久香蕉国产线看观看99| 欧美午夜精品理论片a级大开眼界| 久久这里精品| 欧美国产欧美亚州国产日韩mv天天看完整 | 99久久婷婷国产综合精品电影| 精品一区二区三区视频日产| 男人的天堂在线| 中文字幕+乱码+中文字幕一区| 亚洲一区在线免费| 9191在线播放| 欧美日韩性生活视频| 欧在线一二三四区| 日韩黄色在线| 亚洲第一偷拍网| 欧美激情aaa| 久久久久久美女精品| 欧美黑人巨大xxx极品| 国产精品国产三级国产专区52| 丝袜亚洲精品中文字幕一区| 国产一区二区丝袜高跟鞋图片| 成 人片 黄 色 大 片| 26uuu国产日韩综合| 一本久道久久综合狠狠爱亚洲精品| 成人区精品一区二区不卡| 亚洲成av人片| 9l视频白拍9色9l视频| 天堂av一区| 亚洲午夜女主播在线直播| 翔田千里88av中文字幕| 免费欧美日韩| 91精品免费| 国产中文在线观看| 亚洲一区二区三区美女| 麻豆av免费在线| 日韩成人18| 亚洲免费视频在线观看| 日韩av网站在线播放| 国产精品久久久久毛片大屁完整版| 国产精品中文字幕久久久| 日本xxxx人| 中文字幕亚洲一区二区av在线| 国产原创popny丨九色| 爱情电影网av一区二区| 亚洲欧美一区二区激情| 久久免费视频6| 久久成人精品无人区| 精品在线不卡| 日本乱理伦在线| 欧美色国产精品| 亚洲永久无码7777kkk| 欧美国产精品| 国产在线日韩在线| 国产资源在线看| 欧美日韩免费网站| 三上悠亚 电影| 日韩av久操| 国产a级全部精品| 五月天激情婷婷| 一区二区三区欧美视频| 国产无色aaa| 欧美电影一区| 国产999精品| 日韩成人黄色| 欧美日韩国产区| 欧美肉大捧一进一出免费视频| 999国产精品999久久久久久| 国产大片精品免费永久看nba| 人妻夜夜爽天天爽| 亚洲成av人片在线| 超碰人人cao| 欧美91视频| 91沈先生在线观看| 免费av不卡| 欧美一区二区三区四区五区 | 亚洲午夜成aⅴ人片| 国产在线视频三区| 91成人观看| 91视频免费在线观看| 污污网站在线看| 日韩精品一区在线观看| 久久亚洲精品大全| 国产a级毛片一区| 亚洲色成人www永久在线观看| 日韩精品一区二区三区中文在线| 久久视频免费观看| 国产xxxx孕妇| 亚瑟在线精品视频| 三叶草欧洲码在线| 久久久水蜜桃av免费网站| 欧美日产一区二区三区在线观看| 亚洲一级少妇| 在线观看91久久久久久| 在线观看毛片视频| 日韩毛片精品高清免费| 性生活一级大片| 亚洲第一毛片| 欧美深深色噜噜狠狠yyy| 亚洲成人va| 欧美成人免费视频| 狠狠人妻久久久久久综合麻豆 | 中文字幕 日韩有码| 国产精品欧美精品| 18深夜在线观看免费视频| 亚洲高清激情| 日本不卡在线观看| 2020国产精品小视频| 色综合五月天导航| 五月婷婷丁香网| 欧美日韩免费高清一区色橹橹| 亚洲av无一区二区三区| 国产美女久久久久| 熟女少妇在线视频播放| 欧美日韩中字| 91久久爱成人| 樱花草涩涩www在线播放| 中文字幕自拍vr一区二区三区| 午夜精品在线播放| 色婷婷亚洲综合| 欧洲猛交xxxx乱大交3| 91麻豆视频网站| 小早川怜子一区二区三区| 国产欧美在线| 五月天在线免费视频| 欧美日韩导航| 91色p视频在线| 日韩精品专区| 欧美激情在线一区| yiren22亚洲综合伊人22| 精品免费国产二区三区| www.亚洲激情| 午夜精品久久久久久久99樱桃 | 亚洲综合色婷婷| 欧洲av一区二区三区| 国产成人综合亚洲网站| 中文字幕国产传媒| 亚洲久久视频| 男女h黄动漫啪啪无遮挡软件| 欧美极品在线观看| 国产精华一区| 国产精品一区二区精品视频观看| 97成人在线视频| 二区三区四区高清视频在线观看| 亚洲人a成www在线影院| 丰满人妻一区二区三区免费| 欧美日韩精品一区二区天天拍小说 | 天堂在线资源库| 欧美一区二区三级| 中文字字幕在线观看| 色综合天天综合网天天狠天天| 麻豆91精品91久久久| 国产精品国产三级国产三级人妇 | 欧美午夜久久久| 久草国产在线观看| 亚洲色图丝袜美腿| 久久婷婷五月综合| 久久影院午夜论| 国产女人18毛片水真多18| 国产一区二区三区免费| 香蕉视频网站入口| 久久久777| 免费欧美一级视频| 91久久夜色精品国产九色| 久久99国产精品一区| 91亚洲一区| 亚洲五月六月| 欧美高清视频手机在在线| 日韩精品无码一区二区三区| 中文字幕精品影院| 麻豆av一区二区三区| 国产精品任我爽爆在线播放| 国产a一区二区| 亚洲国产欧美国产第一区| 91久久综合亚洲鲁鲁五月天| 欧美风情在线视频| 国产一区私人高清影院| 亚洲精品成a人ⅴ香蕉片| 国产精品视频永久免费播放| 日本精品不卡| 国产精品福利小视频| 成人av色网站| 成人国产在线视频| 九九99久久精品在免费线bt| 亚洲影院在线看| 91精品日本| 国产亚洲第一区| 欧美激情在线免费| 亚洲精品一区二区三区蜜桃久| 第一sis亚洲原创| 日本特级黄色大片| 欧美日韩成人| 日韩欧美视频网站| 噜噜噜91成人网| 亚洲一级片网站| 国产精品一区免费视频| 日本精品一二三| 97se亚洲国产综合自在线不卡| 精品无人区无码乱码毛片国产 | 国产精品一级片| 无码av免费精品一区二区三区| av不卡免费在线观看| 国产熟妇搡bbbb搡bbbb| 日本一二三不卡| 欧美 日韩 国产 一区二区三区| 一区二区三区高清| 久久精品国产成人av| 在线观看免费成人| 国内精品久久久久久久久久 | 中文字幕av观看| 欧美激情一二三区| 亚洲成人生活片| 精品久久久久人成| 亚洲一区在线观| 精品第一国产综合精品aⅴ| 色吊丝在线永久观看最新版本| 亚洲深夜福利在线| 中中文字幕av在线| 91成人天堂久久成人| 久久99国产精品二区高清软件| 91久久国产自产拍夜夜嗨| 亚洲小说图片| 国产性生活免费视频| 丝袜美腿亚洲综合| 国内自拍偷拍视频| 中文字幕国产一区| 久久精品国产亚洲av无码娇色| 色系网站成人免费| 成人高潮片免费视频| 国产亚洲成精品久久| 91香蕉在线观看| 国产精品成人国产乱一区| 日韩视频一区二区三区四区| 欧美在线日韩精品| 激情久久久久| 在线观看中文av| 久久久久久久国产精品影院| 欧美精品成人久久| 欧美日韩一区二区在线视频| 蜜臀久久精品久久久久| 日韩少妇与小伙激情| 天天免费亚洲黑人免费| 国产精品一区二区三区观看| 91一区二区三区四区| 那种视频在线观看| 成人动漫一区二区三区| 欧美激情精品久久久久久免费| 欧美性高跟鞋xxxxhd| 国产综合视频在线| 超碰日本道色综合久久综合 | 欧美日韩国产天堂| 精品推荐蜜桃传媒| 97免费视频在线| 中文字幕av一区二区三区四区| 一区二区三区不卡在线| 日韩成人免费看| yy6080午夜| 亚洲第一综合色| 国产wwwxxx| 久久国产天堂福利天堂| 色噜噜成人av在线| 亚洲激情电影在线| 三级成人在线视频| 中文字幕人妻一区二区| 欧美日韩国产中字| 天天操天天干天天| 欧美精品videosex性欧美| 国产区一区二| 日韩视频在线免费播放| 九九热在线视频观看这里只有精品| 先锋影音av在线| 欧美在线高清视频| 91青青在线视频| 国产精品海角社区在线观看| 欧美熟乱15p| 九色porny自拍| 国产精品色哟哟网站| 中文字幕一区二区三区四区免费看| 亚洲欧美综合区自拍另类| 电影一区二区三区| 欧美一区二区在线| 天堂av在线一区| 一级二级黄色片| 欧美精品丝袜中出| 污污的视频在线观看| 91在线观看网站| 激情五月***国产精品| 人妻激情偷乱频一区二区三区| 亚洲国产欧美在线| 五月婷婷在线播放| 国产成人一区二区三区| 日韩国产一区二区| 亚洲自拍第三页| 亚洲自拍偷拍网站| 五月婷婷伊人网| 国产精品麻豆va在线播放| 图片小说视频色综合| 黄色a级三级三级三级| 亚洲一区二区偷拍精品| 视频三区在线观看| 国产精品美女www| 国产精品久久久乱弄 | 久久久久久久久久久91| 国产精品x8x8一区二区| 欧美日韩在线中文| 中文字幕成人在线观看| hs视频在线观看| 性色av一区二区三区| 精品国产1区| 一级黄色高清视频| 婷婷激情综合网| av在线电影观看| caoporn国产精品免费公开| 性色一区二区三区| 97在线观看视频免费| 亚洲国产日韩欧美在线图片| 在线观看精品| 国产内射老熟女aaaa| www日韩大片| 国产人妻精品一区二区三| 91成人精品网站| 亚洲国产日韩欧美在线| 少妇毛片一区二区三区| 在线成人小视频| 色一区二区三区| 99re8这里只有精品| 久久综合成人精品亚洲另类欧美| 在线免费观看一区二区| 97av在线视频| 天天综合久久| 久久久视频6r| 精品女同一区二区| 日本午夜精品久久久久|