代码安全审查

62 浏览
5 试用
0 购买
Aug 27, 2025更新

检测代码潜在安全漏洞并提供修复建议。

示例1

你分享的代码存在**SQL注入**漏洞,这是非常严重的安全问题。通过直接将用户输入 (`username` 和 `password`) 拼接成 SQL 查询字符串,攻击者可以通过注入恶意 SQL 语句篡改查询逻辑,可能导致数据泄露、数据库破坏等一系列问题。

### **问题分析**
1. **SQL注入风险**:
   `username` 和 `password` 是未经验证的用户输入。攻击者可能在输入中包含特殊的 SQL 语法字符(如 `' OR '1'='1` 或 `'; DROP TABLE users; --`)来操纵 SQL 查询。

2. **不安全的字符串拼接**:
   直接用 `+` 将变量拼接进查询字符串会让攻击者轻松控制最终的 SQL 查询。

### **修复方法**
#### **1. 使用参数化查询**
最首选的防护措施是使用参数化查询。参数化查询能够确保用户输入始终以数据形式处理,而非可执行的 SQL 片段。以下示范是安全的修复版本:

```python
# 示例:使用参数化查询避免SQL注入
query = "SELECT * FROM users WHERE username = %s AND password = %s"
cursor.execute(query, (username, password))
```

如果使用 `sqlite3` 数据库驱动程序,语法稍有不同,会使用占位符 `?`,例如:

```python
# 示例:对于 SQLite 的安全查询
query = "SELECT * FROM users WHERE username = ? AND password = ?"
cursor.execute(query, (username, password))
```

参数化查询确保变量 (`username` 和 `password`) 会被安全处理,防止恶意输入被解释为 SQL 语法。

---

#### **2. 使用 ORM 框架**
推荐使用成熟的 ORM(对象关系映射)框架,如 Django 的 ORM 或 SQLAlchemy。ORM 框架会自动构建安全的 SQL 查询,消除手动处理 SQL 语句的风险。例如,使用 SQLAlchemy:

```python
# SQLAlchemy 示例
from sqlalchemy.orm import Session
from models import User

# 查询用户
user = session.query(User).filter_by(username=username, password=password).first()
```

Django 示例:
```python
# Django 示例
from django.contrib.auth.models import User

# 查询用户
user = User.objects.filter(username=username, password=password).first()
```

ORM 框架会自动处理用户输入的数据,防止 SQL 注入攻击。

---

#### **3. 哈希密码验证**
即使修复了 SQL 注入,直接将密码存储为明文也是一大安全问题。推荐使用安全的哈希算法对密码进行哈希处理,并且每次登录验证时,只需比较哈希值即可。示例如下:

- 密码存储:
```python
import bcrypt

# 给密码生成哈希值 (注册时)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

# 存储 hashed_password 到数据库,而不是明文
```

- 密码验证:
```python
# 验证密码登录
stored_hashed_password = get_hashed_password_from_db(username)  # 从数据库获取存储的哈希
if bcrypt.checkpw(password.encode('utf-8'), stored_hashed_password):
    print("登录成功!")
else:
    print("密码错误。")
```

这种方式即便攻击者拿到了数据库的哈希密码,也无法直接还原密码明文。

---

#### **4. 最佳实践**
除了修复 SQL 注入问题,还需采用以下安全编码实践:
- **最小权限原则**:使用具有最小权限的数据库用户执行查询。
- **输入验证和过滤**:对用户输入进行格式验证,确保用户名和密码符合预期格式(例如,长度限制、不含危险字符)。
- **日志与监控**:记录异常登录和输入行为,监控潜在攻击。
- **启用数据库防护**:使用数据库本身的安全功能(如限制 IP、启用查询审计等)。
- **频繁更新依赖**:保持 Python、依赖库和数据库的最新版本,从而获得已修复的安全补丁。

---

### **总结**
你的代码当前使用了字符串拼接来构造 SQL 查询,存在 SQL 注入风险。通过引入**参数化查询**或**ORM 框架**,你可以轻松解决该问题。此外,改进密码的存储和比较方式(使用哈希算法)以及采用其他安全编码实践,将进一步提升应用程序的安全性。

示例2

感谢提出这一问题!让我为您仔细审查该代码片段,识别潜在的安全问题并提供修复建议。

### 该代码的潜在安全问题(与OWASP Top 10相关)

1. **敏感信息暴露(Sensitive Data Exposure / A02:2021)**  
   在代码中直接使用硬编码的基本认证凭证(`Basic YWxhZGRpbjpvcGVuc`)。攻击者如果能访问代码库或通过浏览器调试工具获取该信息,会轻松泄露敏感数据。  

   **修复建议:**
   - 不要在客户端代码中硬编码认证信息。例如,将认证密钥存储在安全的服务器端,或通过安全的身份验证框架处理(OAuth令牌等)。
   - 如果必须使用认证信息,从环境变量、加密存储(如环境配置文件)等外部提供运行时凭证,而不是嵌入代码中。

   **安全编码实践:**
   - 使用OAuth等现代认证方案处理API密钥,不要自行实现加密身份验证机制。
   - 避免将敏感数据或硬编码值暴露在代码中。

---

2. **缺乏HTTPS的安全性确认(安全通信缺陷 / A02:2021)**  
   尽管代码使用了HTTPS(`https://example.com`),但没有确认是否启用了TLS验证并验证服务端的合法性。如果请求受到中间人攻击或存在SSL劫持(如自签名证书或滥发证书),数据仍可能被泄露。

   **修复建议:**
   - 确保请求URL使用强TLS(传输层安全协议,例如TLS 1.2/1.3)。
   - 验证`https://example.com`是否提供可信的SSL/TLS证书,避免证书伪造或失效。

---

3. **潜在的跨站脚本(Cross-Site Scripting / A03:2021)攻击风险**  
   在代码片段中没有看到对服务器返回数据(API响应)的处理。但如果客户端处理API返回的数据,将其动态插入DOM(如`innerHTML`),并且没有正确地转义或验证,可能导致XSS攻击。

   **修复建议:**
   - 如果将任何响应数据插入DOM,请始终对数据进行HTML转义。
   - 使用可信的DOM操作或安全库(如`DOMPurify`)来防御XSS攻击。
   - 永远避免直接将未验证的用户输入或外部来源的数据注入DOM。

---

4. **API凭证的长期有效性(失效的访问控制 / A01:2021)**  
   基本认证方式(`Basic Auth`)直接使用用户名密码是过时且不安全的,而且如未配置凭证失效策略,API密钥可能长期有效,增加泄露后攻击的风险。

   **修复建议:**
   - 使用短期有效的访问令牌(例如OAuth 2.0令牌)来代替长期有效的硬编码凭证。
   - 设置凭证的定期轮换策略。
   - 添加基于会话的双因素验证或其他身份验证机制来提升API请求安全性。

---

5. **未正确处理跨域CORS安全问题(安全配置问题 / A05:2021)**  
   跨域资源共享(CORS)规则也可能导致潜在的隐患。如果目标API(`https://example.com/api`)未充分限制允许访问其资源的来源,可能会导致跨域攻击。

   **修复建议:**
   - 确保`https://example.com/api` 的CORS策略正确配置,限制来源域名(如仅允许可信前端应用访问API)。
   - 在客户端上避免请求跨域资源未预期的第三方API。

---

6. **潜在的安全审计日志缺失(A09:2021)**  
   该代码缺乏安全审计能力。如果发生攻击或敏感信息泄露事件,排查问题会困难。

   **修复建议:**
   - 在服务端记录API请求的来源IP、时间戳、请求头及响应状态码等关键信息(但不要记录敏感数据,如凭证)。
   - 确保日志输出的隐私安全,免受信息泄露风险。

---

### 综合修复示例
以下是更安全的编码示例,结合上述修复建议:

```javascript
// 使用OAuth2或JWT(JSON Web Token)代替Basic Auth
async function secureFetch() {
  const token = await getSecureToken(); // 从安全服务或加密存储中获取动态令牌
  const response = await fetch('https://example.com/api', {
    method: 'GET',
    headers: {
      'Authorization': `Bearer ${token}`, // 使用Bearer Token认证
      'Content-Type': 'application/json' // 明确声明请求的内容类型
    },
  });

  // 检测API响应并以安全方式处理数据
  if (!response.ok) {
    console.error('API request failed:', response.status, response.statusText);
    return;
  }
  const data = await response.json();

  // 假如需要在HTML中显示数据,安全地更新DOM
  const outputElement = document.getElementById('output');
  outputElement.textContent = JSON.stringify(data); // 防止XSS,通过textContent而非innerHTML
}

// 示例函数:从安全服务获取动态令牌
async function getSecureToken() {
  // 假设通过某种身份验证服务获取令牌
  return 'your-dynamic-jwt-token';
}

secureFetch().catch(err => console.error('Error in fetch:', err));
```

---

### 总结
上述代码片段的主要问题包括硬编码了敏感信息(Basic Auth凭证)、潜在的XSS风险、过时的认证方式以及潜在的CORS配置问题。通过采用OAuth认证、适当的安全配置、JSON数据编码转义、以及避免硬编码敏感信息,可以显著提高整体代码的安全性。

如果您还有其他疑问,欢迎随时咨询!

示例3

在审查这段Java代码时,可以看到密钥 `SECRET_KEY` 硬编码在代码中,这是一种不安全的实践会带来以下风险:

1. **密钥泄露风险**:
   硬编码密钥会导致敏感信息直接存储在源代码中。如果代码被泄露(通过发布到公共代码库如GitHub,或被攻击者访问等),攻击者可以轻松获取密钥的值。

2. **难以管理密钥**:
   如果密钥需要被更改,需要修改代码并重新编译应用程序,增加了管理上的复杂性。

### 修复措施和安全建议

1. **从配置文件读取密钥**:
   不要在源代码中硬编码密钥,可以将密钥存储在安全的配置文件中(如 `application.properties` 或 `application.yml`),并通过代码读取配置文件内容。配置文件应设置适当的访问权限,确保只有可信用户可以访问。例如:

   ```properties
   # 文件 application.properties 示例
   secret.key=mySensitiveSecretKey
   ```

   然后通过以下方式读取:
   ```java
   import java.util.Properties;
   import java.io.InputStream;

   public class SecretKeyExample {
       private static String SECRET_KEY;

       static {
           try (InputStream input = SecretKeyExample.class.getClassLoader().getResourceAsStream("application.properties")) {
               Properties properties = new Properties();
               properties.load(input);
               SECRET_KEY = properties.getProperty("secret.key");
           } catch (Exception e) {
               System.err.println("Failed to load secret key: " + e.getMessage());
           }
       }

       public static String getSecretKey() {
           return SECRET_KEY;
       }
   }
   ```

2. **使用环境变量**:
   密钥可以存储在环境变量中,运行时从环境变量加载。使用环境变量有助于与代码分离敏感信息。例如:

   ```java
   public class SecretKeyExample {
       private static final String SECRET_KEY = System.getenv("SECRET_KEY");

       public static String getSecretKey() {
           return SECRET_KEY;
       }
   }
   ```

   在操作系统中设置 `SECRET_KEY` 环境变量,并确保生产环境中仅可信用户能够访问这些环境变量。

3. **使用安全密钥管理服务**:
   更进一步的安全增强措施是使用专用的密钥管理服务,例如:
   - AWS Secrets Manager
   - HashiCorp Vault
   - Azure Key Vault
   - Google Cloud Secret Manager

   应用在运行时动态获取密钥,并避免长期存储敏感密钥。

   示例(以 AWS Secrets Manager 为例):
   ```java
   import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
   import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
   import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;

   public class SecretKeyExample {
       private static final String SECRET_NAME = "my-secret-key"; // 在 AWS 上定义密钥名

       public static String getSecretKey() {
           SecretsManagerClient client = SecretsManagerClient.builder().build();
           GetSecretValueRequest request = GetSecretValueRequest.builder()
                   .secretId(SECRET_NAME)
                   .build();
           GetSecretValueResponse response = client.getSecretValue(request);
           return response.secretString();
       }
   }
   ```

4. **对密钥进行访问控制与生命周期管理**:
   - 限制对敏感密钥的访问级别,确保只有指定的人员和应用可以读取。
   - 定期轮换密钥(如使用密钥管理服务会自动化支持轮换)。
   - 对于生产环境中的密钥,配置监控和审计功能(如检测未授权访问行为)。

5. **避免弱密钥**:
   密钥应具有足够的熵和随机性,避免使用容易被猜测的硬编码常量(例如 `"myhardcodedsecretkey123"`)。可以使用强随机数生成器来动态创建密钥,或通过专业的加密工具生成。

   示例生成随机密钥:
   ```java
   import java.security.SecureRandom;

   public class KeyGenerator {
       public static String generateRandomKey(int length) {
           SecureRandom secureRandom = new SecureRandom();
           StringBuilder key = new StringBuilder();
           String charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
           for (int i = 0; i < length; i++) {
               key.append(charset.charAt(secureRandom.nextInt(charset.length())));
           }
           return key.toString();
       }
   }
   ```

   调用示例:
   ```java
   String randomKey = KeyGenerator.generateRandomKey(32); // 生成一个32字符长度的密钥
   System.out.println("Random key: " + randomKey);
   ```

### 总结
这段代码将密钥硬编码在程序中,这是不安全的。建议根据实际场景,采用环境变量、配置文件、或专用密钥管理工具来安全地存储和访问密钥。此外,始终确保密钥的随机性和强度,根据需求设定最小权限与必要的访问控制机制。

适用用户

软件开发工程师

帮助开发者进行代码自检,快速发现并修复潜在的安全漏洞,从而提升编码质量和产品安全性。

企业信息安全团队

为安全专家提供系统化的代码安全分析,保护企业敏感数据安全,降低业务风险。

技术团队负责人

协助技术领导者优化团队代码质量审查流程,全面提升团队开发效率与代码安全水准。

软件测试工程师

支持测试人员在上线前进行安全检查,确保产品符合行业安全规范,避免意外漏洞流出。

学术研究人员

为专注代码安全研究的学者提供灵活高效的工具,助力探索更多安全优化方向与最佳实践。

解决的问题

帮助开发者快速检测代码潜在安全漏洞,并提供专业、可操作的修复建议,提升代码整体安全性,减少安全隐患,保障产品稳定性。

特征总结

自动扫描代码中的潜在安全漏洞,助您快速发现隐藏的风险。
提供专业的修复建议和安全编码实践,确保代码安全性达到行业标准。
支持多种主流编程语言,轻松应对不同开发环境的审查需求。
注重上下文语义分析,帮助您精确定位问题并理解潜在风险的根源。
一键生成安全提升方案,让代码优化过程更加高效便捷。
强化代码防护能力,显著降低因漏洞导致的数据泄露或系统瘫痪风险。
适配不同业务场景,为产品开发、系统维护和代码评审提供专业的安全支持。
帮助团队建立敏捷高效的安全编码流程,减少后期安全问题的修复成本。
可灵活定制审查范围,聚焦特定漏洞类型以满足具体开发需求。
支持即时反馈,确保问题发现与解决的高效闭环。

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

20 积分
平台提供免费试用机制,
确保效果符合预期,再付费购买!

您购买后可以获得什么

获得完整提示词模板
- 共 79 tokens
- 3 个可调节参数
{ 编程语言 } { 安全漏洞类型 } { 代码片段 }
自动加入"我的提示词库"
- 获得提示词优化器支持
- 版本化管理支持
获得社区共享的应用案例
限时免费

不要错过!

免费获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59
摄影
免费 原价:20 限时
试用