国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQL注入原理以及Spring Boot如何防止SQL注入(含詳細(xì)示例代碼)

這篇具有很好參考價值的文章主要介紹了SQL注入原理以及Spring Boot如何防止SQL注入(含詳細(xì)示例代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

點(diǎn)擊下載《SQL注入原理以及Spring Boot如何防止SQL注入(含詳細(xì)示例代碼)》文章來源地址http://www.zghlxwxcb.cn/news/detail-829132.html

1. 什么是SQL注入

SQL注入是一種針對數(shù)據(jù)庫的攻擊技術(shù),攻擊者通過在應(yīng)用程序的輸入字段中插入或“注入”惡意的SQL代碼,從而在數(shù)據(jù)庫服務(wù)器上執(zhí)行非授權(quán)的SQL查詢。這種攻擊可能導(dǎo)致數(shù)據(jù)泄露、數(shù)據(jù)篡改、甚至執(zhí)行任意命令。

1.1 SQL注入原理

SQL注入的原理是攻擊者通過在應(yīng)用程序的輸入字段中插入或“注入”惡意的SQL代碼,從而繞過應(yīng)用程序的安全機(jī)制,直接對數(shù)據(jù)庫進(jìn)行查詢或操作。當(dāng)應(yīng)用程序沒有對用戶輸入進(jìn)行適當(dāng)?shù)尿?yàn)證和過濾時,攻擊者可以注入惡意的SQL代碼,導(dǎo)致應(yīng)用程序執(zhí)行非預(yù)期的數(shù)據(jù)庫操作。

具體來說,當(dāng)應(yīng)用程序使用動態(tài)SQL語句構(gòu)建查詢時,它會將用戶輸入直接拼接到SQL語句中。如果應(yīng)用程序沒有對用戶輸入進(jìn)行適當(dāng)?shù)尿?yàn)證和過濾,攻擊者可以注入惡意的SQL代碼片段,改變原始SQL語句的結(jié)構(gòu)和意圖。通過注入惡意的SQL代碼,攻擊者可以繞過應(yīng)用程序的身份驗(yàn)證、讀取敏感數(shù)據(jù)、修改數(shù)據(jù)、執(zhí)行任意命令等。

1.2 SQL注入攻擊步驟

SQL注入攻擊步驟的主要步驟如下:

  1. 發(fā)現(xiàn)漏洞:攻擊者尋找應(yīng)用程序中可能存在注入漏洞的地方,通常是表單輸入、URL參數(shù)、cookies等。
  2. 注入代碼:攻擊者在輸入字段中插入惡意的SQL代碼,這些代碼通常包括SQL語法結(jié)構(gòu),如' OR '1'='1(繞過身份驗(yàn)證)或DROP TABLE tablename(刪除表)。
  3. 執(zhí)行查詢:當(dāng)應(yīng)用程序?qū)⒂脩糨斎氲臄?shù)據(jù)拼接到SQL查詢中時,惡意的SQL代碼被執(zhí)行,導(dǎo)致非授權(quán)的數(shù)據(jù)庫操作。
  4. 獲取數(shù)據(jù):攻擊者可以通過注入代碼來獲取、修改或刪除數(shù)據(jù)庫中的數(shù)據(jù)。
  5. 利用結(jié)果:攻擊者利用從數(shù)據(jù)庫中獲取的數(shù)據(jù)進(jìn)行各種非法操作,如身份盜用、詐騙等。

SQL注入攻擊的危害包括但不限于:

  • 數(shù)據(jù)泄露:攻擊者可以獲取數(shù)據(jù)庫中的敏感信息,如用戶密碼、信用卡信息等。
  • 數(shù)據(jù)篡改:攻擊者可以修改數(shù)據(jù)庫中的數(shù)據(jù),如更改用戶信息、篡改交易記錄等。
  • 權(quán)限提升:如果攻擊者能夠注入足夠復(fù)雜的代碼,他們甚至可能獲得對整個數(shù)據(jù)庫服務(wù)器的控制權(quán)。
  • 安全漏洞:即使攻擊者沒有立即獲得數(shù)據(jù),SQL注入也可能導(dǎo)致安全漏洞,使數(shù)據(jù)庫容易受到其他攻擊。

為了防止SQL注入攻擊,開發(fā)人員應(yīng)該采取以下措施:

  • 參數(shù)化查詢:使用參數(shù)化查詢可以確保用戶輸入被正確處理,而不是直接拼接到SQL查詢中。
  • 使用存儲過程:存儲過程可以減少應(yīng)用程序與數(shù)據(jù)庫之間的直接交互,減少注入的風(fēng)險(xiǎn)。
  • 驗(yàn)證和清理輸入:對所有用戶輸入進(jìn)行驗(yàn)證和清理,確保沒有惡意代碼。
  • 最小權(quán)限原則:數(shù)據(jù)庫賬號不應(yīng)有不必要的權(quán)限,只給予應(yīng)用程序執(zhí)行必要操作的最小權(quán)限。
  • 錯誤處理:不要向用戶顯示詳細(xì)的數(shù)據(jù)庫錯誤信息,這可能泄露敏感信息。
  • 保持更新:確保數(shù)據(jù)庫管理系統(tǒng)和應(yīng)用框架保持最新狀態(tài),及時修補(bǔ)安全漏洞。

2. springboot如何防止SQL注入

防止SQL注入的最佳實(shí)踐是使用參數(shù)化查詢和預(yù)編譯的SQL語句。Spring Boot框架提供了對JdbcTemplate和Spring Data JPA的支持,這兩個工具都可以幫助我們更安全地與數(shù)據(jù)庫交互。

2.1 使用JdbcTemplate

JdbcTemplate 是一個用于簡化數(shù)據(jù)庫訪問和錯誤處理的類。它可以幫助你避免直接使用字符串拼接來構(gòu)建SQL語句,從而減少SQL注入的風(fēng)險(xiǎn)。

以下為示例代碼,它演示了如何使用JdbcTemplate防止SQL注入。通過使用預(yù)編譯的SQL語句和PreparedStatementCreator工廠類,我們將參數(shù)作為預(yù)編譯語句的參數(shù)進(jìn)行處理,避免了直接將用戶輸入拼接到SQL語句中,從而降低了SQL注入的風(fēng)險(xiǎn)。在UserRowMapper中,我們根據(jù)數(shù)據(jù)庫字段名將結(jié)果集映射到User對象的屬性上。

1、首先,我們定義一個User實(shí)體類:

public class User {  
    private Long id;  
    private String firstName;  
    private String lastName;  
    // 省略getter和setter方法  
}

2、接下來,我們創(chuàng)建一個UserRepository接口,并使用JdbcTemplate進(jìn)行查詢:

import org.springframework.jdbc.core.JdbcTemplate;  
import org.springframework.stereotype.Repository;  
import org.springframework.transaction.annotation.Transactional;  
  
@Repository  
public class UserRepository {  
    private final JdbcTemplate jdbcTemplate;  
  
    public UserRepository(JdbcTemplate jdbcTemplate) {  
        this.jdbcTemplate = jdbcTemplate;  
    }  
  
    @Transactional  
    public List<User> findUsersByLastName(String lastName) {  
        // 構(gòu)建預(yù)編譯的SQL語句,使用參數(shù)化查詢來防止SQL注入  
        String sql = "SELECT * FROM users WHERE last_name = ?";  
        // 使用JdbcTemplate的query方法執(zhí)行查詢,并傳入一個PreparedStatementCreator作為參數(shù)  
        return jdbcTemplate.query(new PreparedStatementCreator() {  
            @Override  
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {  
                PreparedStatement ps = con.prepareStatement(sql);  
                ps.setString(1, lastName); // 設(shè)置參數(shù)值  
                return ps;  
            }  
        }, new UserRowMapper()); // 自定義的RowMapper,用于將結(jié)果集轉(zhuǎn)換為User對象列表  
    }  
}

3、最后是UserRowMapper的實(shí)現(xiàn):

import org.springframework.jdbc.core.RowMapper;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.util.List;  
import javax.annotation.Nullable;  
import org.springframework.stereotype.Component;  
import com.example.demo.model.User;  
import java.util.*;  
@Component  
public class UserRowMapper implements RowMapper<User> {  
    @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException {  
        User user = new User();  
        user.setId(rs.getLong("id")); // 根據(jù)數(shù)據(jù)庫字段名設(shè)置屬性值  
        user.setFirstName(rs.getString("first_name")); // 同上  
        user.setLastName(rs.getString("last_name")); // 同上  
        return user; // 返回User對象列表中的一個對象  
    }
}

2.2 使用Spring Data JPA

Spring Data JPA 是一個為Spring框架提供存儲庫接口和查詢方法的框架。它支持自定義查詢,并且對存儲庫接口的方法進(jìn)行自動映射。由于它是基于JPA的,因此它還可以防止SQL注入。

當(dāng)使用Spring Data JPA時,可以通過以下步驟來防止SQL注入:

1、定義Repository接口:

首先,創(chuàng)建一個繼承了JpaRepository的接口,并定義需要執(zhí)行的方法。Spring Data JPA會自動為您生成實(shí)現(xiàn)。

import org.springframework.data.jpa.repository.JpaRepository;  
import org.springframework.stereotype.Repository;  
  
@Repository  
public interface UserRepository extends JpaRepository<User, Long> {  
    List<User> findByLastName(String lastName);  
}

2、使用Repository:

在服務(wù)類中,注入UserRepository并使用它來查詢數(shù)據(jù)。由于Spring Data JPA使用了JPA的查詢方法,因此它會自動處理SQL查詢的構(gòu)建,并且能夠防止SQL注入。

import org.springframework.stereotype.Service;  
import org.springframework.transaction.annotation.Transactional;  
  
@Service  
public class UserService {  
    private final UserRepository userRepository;  
  
    public UserService(UserRepository userRepository) {  
        this.userRepository = userRepository;  
    }  
  
    @Transactional  
    public List<User> findUsersByLastName(String lastName) {  
        return userRepository.findByLastName(lastName);  
    }  
}

3、自定義查詢:
如果您需要執(zhí)行自定義的JPA查詢,而不是使用Spring Data JPA提供的查詢方法,可以使用EntityManagerJpaRepositorycreateNativeQuery方法。但是,請確保您正確處理查詢參數(shù),以防止SQL注入。例如:

List<User> users = userRepository.createNativeQuery(  
    "SELECT u FROM User u WHERE u.lastName = :lastName",   
    new QueryParameter("lastName", String.class),   
    1, // maxResults (optional)  
    Sort.by("firstName") // sort (optional)  
).getResultList();

這里使用createNativeQuery時,通過將參數(shù)作為一個命名參數(shù)(:lastName)傳遞,而不是直接將其拼接到查詢字符串中,從而避免了SQL注入的風(fēng)險(xiǎn)。同時,Spring Data JPA還會自動為您處理查詢結(jié)果的映射。

2.3 使用ORM框架Hibernate

1、首先,確保已經(jīng)添加了Hibernate的依賴。例如,在Maven項(xiàng)目中,可以在pom.xml文件中添加以下依賴:

<dependency>  
    <groupId>org.hibernate</groupId>  
    <artifactId>hibernate-core</artifactId>  
    <version>5.6.10.Final</version>  
</dependency>

2、接下來,創(chuàng)建一個實(shí)體類,例如User

import javax.persistence.Entity;  
import javax.persistence.Id;  
  
@Entity  
public class User {  
    @Id  
    private Long id;  
    private String firstName;  
    private String lastName;  
    // 省略getter和setter方法  
}

3、創(chuàng)建一個DAO接口,例如UserDao

import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Repository;  
  
@Repository  
public class UserDao {  
    @Autowired  
    private SessionFactory sessionFactory;  
  
    public List<User> findUsersByLastName(String lastName) {  
        // 獲取當(dāng)前線程的Session實(shí)例  
        Session session = sessionFactory.getCurrentSession();  
        // 使用HQL查詢,避免SQL注入攻擊  
        String hql = "FROM User WHERE lastName = :lastName";  
        Query query = session.createQuery(hql);  
        query.setParameter("lastName", lastName); // 使用參數(shù)綁定,而不是直接拼接字符串構(gòu)建查詢語句  
        return query.list(); // 執(zhí)行查詢并返回結(jié)果列表  
    }  
}

在上述示例中,我們使用了Hibernate的查詢語言(HQL)來執(zhí)行查詢。HQL允許使用占位符來設(shè)置參數(shù),避免了直接拼接字符串構(gòu)建查詢語句,從而防止了SQL注入攻擊。在示例中,我們使用setParameter方法將參數(shù)綁定到查詢中,而不是直接將參數(shù)拼接到查詢字符串中。這樣,Hibernate會使用預(yù)編譯的SQL語句來執(zhí)行查詢,從而提高了查詢的性能和安全性。

2.4 使用Mybatis

使用MyBatis防止SQL注入的完整示例代碼如下:

1、首先,確保已經(jīng)添加了MyBatis的依賴。例如,在Maven項(xiàng)目中,可以在pom.xml文件中添加以下依賴:

<dependency>  
    <groupId>org.mybatis</groupId>  
    <artifactId>mybatis</artifactId>  
    <version>3.x</version>  
</dependency>

2、接下來,創(chuàng)建一個實(shí)體類,例如User

public class User {  
    private int id;  
    private String name;  
    // 省略getter和setter方法  
}

3、創(chuàng)建一個Mapper接口,例如UserMapper

import org.apache.ibatis.annotations.Select;  
import org.apache.ibatis.annotations.Update;  
  
public interface UserMapper {  
    @Select("SELECT * FROM user WHERE id = #{id}")  
    User getUserById(int id);  
  
    @Update("UPDATE user SET name = #{name} WHERE id = #{id}")  
    int updateName(int id, String name);  
}

在上述代碼中,我們使用了#{id}#{name}占位符來代替查詢和更新中的參數(shù)。MyBatis會自動將參數(shù)值綁定到占位符上,避免了直接拼接字符串構(gòu)建查詢語句,從而防止了SQL注入攻擊。

4、接下來,創(chuàng)建一個MyBatis的配置類,例如MyBatisConfig

import org.apache.ibatis.session.SqlSessionFactory;  
import org.mybatis.spring.SqlSessionFactoryBean;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import javax.sql.DataSource;

@Configuration  
public class MyBatisConfig {  
  
    @Bean  
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {  
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();  
        factory.setDataSource(dataSource);  
        return factory.getObject();  
    }  
}

在上述代碼中,我們使用了Spring框架的SqlSessionFactoryBean來創(chuàng)建SqlSessionFactory實(shí)例,然后通過SqlSessionFactory來獲取SqlSession實(shí)例。由于MyBatis已經(jīng)為我們處理了參數(shù)綁定和SQL語句的構(gòu)建,因此我們可以放心地使用Mapper接口的方法,而不用擔(dān)心SQL注入攻擊的問題。

最后,創(chuàng)建一個Service類,例如UserService,來調(diào)用Mapper接口的方法:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
  
@Service  
public class UserService {  
    @Autowired  
    private UserMapper userMapper;  
  
    public User getUserById(int id) {  
        return userMapper.getUserById(id);  
    }  
  
    public int updateName(int id, String name) {  
        return userMapper.updateName(id, name);  
    }  
}

在上述代碼中,我們使用了Spring框架的@Autowired注解來注入UserMapper實(shí)例。然后,我們可以通過UserMapper實(shí)例來調(diào)用查詢和更新方法,而不需要關(guān)心SQL語句的構(gòu)建和參數(shù)綁定的問題,因?yàn)镸yBatis已經(jīng)為我們處理了這些。

點(diǎn)擊下載《SQL注入原理以及Spring Boot如何防止SQL注入(含詳細(xì)示例代碼)》

到了這里,關(guān)于SQL注入原理以及Spring Boot如何防止SQL注入(含詳細(xì)示例代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • PHP 安全:如何防止PHP中的SQL注入?

    PHP 安全:如何防止PHP中的SQL注入?

    SQL注入防護(hù)對于確保數(shù)據(jù)庫的安全性和完整性至關(guān)重要。它涉及實(shí)施有效措施來阻止將未經(jīng)授權(quán)的 SQL 代碼注入應(yīng)用程序的惡意嘗試。開發(fā)人員可以利用輸入驗(yàn)證和參數(shù)化查詢等技術(shù)來清理用戶輸入,確保任何潛在的惡意代碼都無害。此外,使用預(yù)準(zhǔn)備語句和存儲過程可以通

    2024年04月29日
    瀏覽(22)
  • 預(yù)編譯為什么能防止SQL注入?一看你就明白了。預(yù)編譯原理詳解

    預(yù)編譯為什么能防止SQL注入?一看你就明白了。預(yù)編譯原理詳解

    「作者主頁」: 士別三日wyx 「作者簡介」: CSDN top100、阿里云博客專家、華為云享專家、網(wǎng)絡(luò)安全領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 「推薦專欄」: 對網(wǎng)絡(luò)安全感興趣的小伙伴可以關(guān)注專欄《網(wǎng)絡(luò)安全入門到精通》 先簡單了解一下SQL注入的過程。 比如一個查詢功能,根據(jù)用戶輸入的id,查

    2024年02月07日
    瀏覽(18)
  • Spring Boot中的SimpMessagingTemplate是什么,原理,以及如何使用

    Spring Boot中的SimpMessagingTemplate是什么,原理,以及如何使用

    SimpMessagingTemplate是Spring Framework中的一個類,用于向WebSocket客戶端發(fā)送消息。在Spring Boot應(yīng)用程序中,可以使用SimpMessagingTemplate來實(shí)現(xiàn)WebSocket通信的消息發(fā)送功能。本文將介紹SimpMessagingTemplate的原理和使用方法。 SimpMessagingTemplate是Spring Framework中的一個類,用于向WebSocket客戶端

    2024年02月09日
    瀏覽(38)
  • 確保你的數(shù)據(jù)庫安全:如何防止SQL注入攻擊

    最近,越來越多的組織和公司受到SQL注入攻擊的困擾。這種攻擊可以導(dǎo)致數(shù)據(jù)庫中的敏感信息泄露,破壞數(shù)據(jù)完整性,甚至可能導(dǎo)致整個系統(tǒng)崩潰。如果您是一名數(shù)據(jù)庫管理員或網(wǎng)站管理員,您需要了解如何保護(hù)您的數(shù)據(jù)庫免受SQL注入攻擊的威脅。在本文中,小德將介紹什么

    2024年02月02日
    瀏覽(23)
  • Spring Boot中的@EnableWebSocketMessageBroker注解是什么,原理,以及如何使用

    Spring Boot中的@EnableWebSocketMessageBroker注解是什么,原理,以及如何使用

    WebSocket是一種在Web瀏覽器和Web服務(wù)器之間進(jìn)行雙向通信的技術(shù)。在傳統(tǒng)的HTTP通信中,客戶端向服務(wù)器發(fā)送請求,服務(wù)器響應(yīng)請求,然后關(guān)閉連接。而在WebSocket中,客戶端和服務(wù)器之間的連接始終保持打開狀態(tài),可以隨時互相發(fā)送消息,實(shí)現(xiàn)實(shí)時通信。 Spring Boot提供了對WebSo

    2024年02月12日
    瀏覽(28)
  • Spring Boot進(jìn)階(52):Spring Boot 如何集成Flyway并初始化執(zhí)行 SQL 腳本?| 超級詳細(xì),建議收藏

    ? ? ? ?在我們的認(rèn)知中,我們會使用 SVN 或 Git 進(jìn)行代碼的版本管理。但是,我們是否好奇過,數(shù)據(jù)庫也是需要進(jìn)行版本管理的呢? ????????在每次發(fā)版的時候,我們可能都會對數(shù)據(jù)庫的表結(jié)構(gòu)進(jìn)行新增和變更,又或者需要插入一些初始化的數(shù)據(jù)。而我們的環(huán)境不僅僅只

    2024年02月15日
    瀏覽(19)
  • SQL 注入漏洞原理以及修復(fù)方法

    漏洞名稱 :SQL注入 、SQL盲注 漏洞描述 :所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。具體來說,它是利用現(xiàn)有應(yīng)用程序,將(惡意)的SQL命令注入到后臺數(shù)據(jù)庫引擎執(zhí)行的能力,它可以通過

    2024年01月24日
    瀏覽(28)
  • spring boot--自動化注入組件原理、內(nèi)嵌tomcat-1

    spring boot--自動化注入組件原理、內(nèi)嵌tomcat-1

    前言 我們知道開發(fā)spring boot項(xiàng)目,在啟動類上添加注解@SpringBootApplication ,然后引入要自動注入的組件依賴,然后現(xiàn)application.properties中加上相應(yīng)配置就可以自動注入這個組件,那么下面看看自動注入組件是如何實(shí)現(xiàn)的 一、@SpringBootApplication 注解 1、查看SpringBootApplication 類如下

    2024年02月15日
    瀏覽(22)
  • Spring Boot進(jìn)階(57):Spring中什么時候不要用@Autowired注入 | 超級詳細(xì),建議收藏

    Spring Boot進(jìn)階(57):Spring中什么時候不要用@Autowired注入 | 超級詳細(xì),建議收藏

    ? ? ? ? 注解@Autowired,相信對于我們Java開發(fā)者而言并不陌生吧,在SpringBoot或SpringCloud框架中使用那是非常的廣泛。但是當(dāng)我們使用IDEA編輯器開發(fā)代碼的時候,經(jīng)常會發(fā)現(xiàn)@Autowired 注解下面提示小黃線警告,我們把小鼠標(biāo)懸停在注解上面,可以看到這個如下圖所示的警告信息

    2024年02月16日
    瀏覽(21)
  • 【網(wǎng)絡(luò)安全-sql注入(5)】sqlmap以及幾款自動化sql注入工具的詳細(xì)使用過程(提供工具)

    【網(wǎng)絡(luò)安全-sql注入(5)】sqlmap以及幾款自動化sql注入工具的詳細(xì)使用過程(提供工具)

    分享一個非常詳細(xì)的網(wǎng)絡(luò)安全筆記,是我學(xué)習(xí)網(wǎng)安過程中用心寫的,可以點(diǎn)開以下鏈接獲取: 超詳細(xì)的網(wǎng)絡(luò)安全筆記 (也可以拿自己的環(huán)鏡來玩,我是用pikachu靶場來演示的) 【網(wǎng)路安全 --- pikachu靶場安裝】超詳細(xì)的pikachu靶場安裝教程(提供靶場代碼及工具)_網(wǎng)絡(luò)安全_Ai

    2024年02月08日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包