跳转到正文
报告库
用途分类 / 数据分析

Flutter Use Http Package Skill 安全审计

作者说它能做什么(原文)

Use the `http` package to execute GET, POST, PUT, or DELETE requests. Use when you need to fetch from or send data to a REST API.

第三方安全检查结论

先别安装或运行

已检查文件
1
发现的风险
2
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 2 项风险
高风险

示例可能把真实 Bearer 令牌发送给第三方演示服务器

原文依据:2 处
发现了什么

示例在固定的 `jsonplaceholder.typicode.com` 请求中放置了 Authorization 头,并使用 `your_token_here` 提示替换令牌。若用户直接替换占位符却未同时改为自己信任的 API,真实凭据会被发送给该第三方。

为什么需要注意

第三方可能获得令牌,并在令牌仍有效且权限允许时访问相应账户或 API。令牌也会以明文形式留在应用源代码和编译产物中。

这是示例代码,但它把 Authorization 头与固定的第三方演示域名放在同一个真实请求中。占位符本身不是秘密;只有用户用真实令牌替换它、却没有把 URL 改为令牌所属且受信任的 API 时,令牌才会发送给 jsonplaceholder.typicode.com。用户可要求作者删除演示请求中的认证头,或明确要求令牌和 API 主机必须匹配。

SKILL.md:43来自说明文档打开原文件
*   **URIs:** Always parse URL strings using `Uri.parse('your_url')`.*   **Headers:** Inject authorization and content-type headers via the `headers` parameter map. Use `HttpHeaders.authorizationHeader` for auth tokens.*   **Payloads:** For POST and PUT requests, encode the body using `jsonEncode()` from `dart:convert`.*   **Status Validation:** Evaluate `response.statusCode`. Treat `200 OK` (GET/PUT/DELETE) and `201 CREATED` (POST) as success. 
查看另外 1 个位置
SKILL.md:94来自说明文档打开原文件
// 2. Network execution with background parsingFuture<List<Photo>> fetchPhotos() async {  final response = await http.get(    Uri.parse('https://jsonplaceholder.typicode.com/photos'),    headers: {      HttpHeaders.authorizationHeader: 'Bearer your_token_here',      HttpHeaders.acceptHeader: 'application/json',    },  );
中风险

未经校验的远程图片地址可触发对任意主机的请求

原文依据:3 处
发现了什么

API 响应中的 `thumbnailUrl` 被直接保存并交给 `Image.network`,代码未限制协议或主机。控制 API 响应的一方可以令客户端联系其选择的图片服务器。

为什么需要注意

该服务器能观察用户的 IP 地址、请求时间和常见网络元数据,并可利用大量或超大图片请求消耗流量与内存。

示例把响应中的 thumbnailUrl 原样存入模型,并由 Image.network 自动请求该地址,没有协议或主机限制。因此,能控制或篡改 API 响应的一方可以让客户端连接其指定的图片主机,造成 IP/请求元数据泄露、跟踪,或尝试访问客户端可达的内部地址;证据并不表明图片请求会携带 Bearer 令牌。用户可要求仅允许 HTTPS 和认可的图片域名。

SKILL.md:123来自说明文档打开原文件
  factory Photo.fromJson(Map<String, dynamic> json) {    return Photo(      id: json['id'] as int,      title: json['title'] as String,      thumbnailUrl: json['thumbnailUrl'] as String,    );  }
查看另外 2 个位置
SKILL.md:157来自说明文档打开原文件
          final photos = snapshot.data!;          return ListView.builder(            itemCount: photos.length,            itemBuilder: (context, index) => ListTile(              leading: Image.network(photos[index].thumbnailUrl),              title: Text(photos[index].title),            ),          );
SKILL.md:155来自说明文档打开原文件
      builder: (context, snapshot) {        if (snapshot.hasData) {          final photos = snapshot.data!;          return ListView.builder(            itemCount: photos.length,            itemBuilder: (context, index) => ListTile(              leading: Image.network(photos[index].thumbnailUrl),              title: Text(photos[index].title),            ),
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。未发现风险
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

6 个说明模块

该 Skill 指导项目安装 Flutter `http` 依赖,并为 Android 和 macOS 启用出站网络能力。这些权限符合其 REST API 网络访问用途,但会让应用具备连接外部服务器的能力。

查看原文
SKILL.md:21来自说明文档打开原文件
1. Add the `http` package dependency via the terminal:   ```bash   flutter pub add http   ```2. Import the package in your Dart files:
SKILL.md:29来自说明文档打开原文件
   ```3. Configure Android permissions by adding the Internet permission to `android/app/src/main/AndroidManifest.xml`:   ```xml   <uses-permission android:name="android.permission.INTERNET" />   ```4. Configure macOS entitlements by adding the network client key to both `macos/Runner/DebugProfile.entitlements` and `macos/Runner/Release.entitlements`:   ```xml   <key>com.apple.security.network.client</key>   <true/>   ```

网络示例向一个固定的第三方演示域名发起 GET 请求,并随请求发送 Authorization 请求头。代码块属于示例而非自动执行脚本,但被复制并填入真实令牌后会产生实际外发。

查看原文
SKILL.md:93来自说明文档打开原文件
// 2. Network execution with background parsingFuture<List<Photo>> fetchPhotos() async {  final response = await http.get(    Uri.parse('https://jsonplaceholder.typicode.com/photos'),    headers: {      HttpHeaders.authorizationHeader: 'Bearer your_token_here',      HttpHeaders.acceptHeader: 'application/json',    },  );

示例信任 API 返回的 `thumbnailUrl`,随后由 `Image.network` 对该地址发起第二次网络请求;因此实际联系的主机不只包括初始 API。

查看原文
SKILL.md:123来自说明文档打开原文件
  factory Photo.fromJson(Map<String, dynamic> json) {    return Photo(      id: json['id'] as int,      title: json['title'] as String,      thumbnailUrl: json['thumbnailUrl'] as String,    );  }
SKILL.md:157来自说明文档打开原文件
          final photos = snapshot.data!;          return ListView.builder(            itemCount: photos.length,            itemBuilder: (context, index) => ListTile(              leading: Image.network(photos[index].thumbnailUrl),              title: Text(photos[index].title),            ),          );
从这里开始 · 工作说明SKILL.md
flutter-use-http-package
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。
文件与检查记录1 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明

代码和说明中提到的操作

连接外部网站
SKILL.md:3来自说明文档打开原文件
name: flutter-use-http-packagedescription: Use the `http` package to execute GET, POST, PUT, or DELETE requests. Use when you need to fetch from or send data to a REST API.metadata:
SKILL.md:96来自说明文档打开原文件
  final response = await http.get(    Uri.parse('https://jsonplaceholder.typicode.com/photos'),    headers: {
运行命令
SKILL.md:22来自说明文档打开原文件
1. Add the `http` package dependency via the terminal:   ```bash   flutter pub add http
读取了多少行
175
文件校验值(用于核对版本)
f51a6c27957ad014a0fee4dac2675044989d31ae8c2b9dddbc20ff2d4402ecb2