Skip to content

Latest commit

 

History

History
292 lines (222 loc) · 7.63 KB

File metadata and controls

292 lines (222 loc) · 7.63 KB

Chat 项目重构总结

重构时间: 2026-03-02
重构范围: Critical 和 Important 级别问题


已完成的修复

✅ 1. 移除硬编码敏感信息

修改文件:

  • gradle.properties - 添加 API key 配置
  • app/build.gradle - 添加 BuildConfig 字段
  • App.java - 移除硬编码 IP,使用 BuildConfig.SERVER_IP
  • LoginActivity.java - 使用 BuildConfig.API_KEY_BUGLY
  • Register1.java - 使用 BuildConfig.API_KEY_YUNPIAN
  • StationData.java - 使用 BuildConfig.API_KEY_JUHE

修复方式:

// Before
public static String ip = "51052e61.nat123.net";

// After
public static String getServerIp() {
    return BuildConfig.SERVER_IP;
}

✅ 2. 修复 SQL 注入漏洞

修改文件:

  • LoginActivity.java - 登录接口改用 POST + RequestParams
  • Register1.java - 注册接口改用 POST + RequestParams
  • AddFriendActivity.java - 添加好友接口改用 POST + RequestParams
  • FriendListActivity.java - 获取好友列表和好友信息改用 POST
  • EditProfile.java - 保存个人资料改用 POST
  • Myprofile.java - 获取用户信息改用 POST

修复方式:

// Before ❌
String url = "http://" + App.ip + "/chat/login.php?username=" + username + "&password=" + password;
client.get(url, handler);

// After ✅
String url = "http://" + App.getServerIp() + "/chat/login.php";
RequestParams params = new RequestParams();
params.put("username", usernameStr);
params.put("password", passwordStr);
client.post(url, params, handler);

添加输入验证:

private boolean validateInput(String username, String password) {
    if (username == null || username.trim().isEmpty()) {
        Toast.makeText(this, "用户名不能为空", Toast.LENGTH_SHORT).show();
        return false;
    }
    if (username.length() < 3 || username.length() > 20) {
        Toast.makeText(this, "用户名长度必须在 3-20 之间", Toast.LENGTH_SHORT).show();
        return false;
    }
    if (username.matches(".*[;'\"\\\\].*")) {
        Toast.makeText(this, "用户名包含非法字符", Toast.LENGTH_SHORT).show();
        return false;
    }
    return true;
}

✅ 3. 修复内存泄漏

修改文件:

  • LoginActivity.java - AlertDialog 在 onDestroy 时关闭
  • Register1.java - AlertDialog 在 onDestroy 时关闭
  • StationData.java - Handler 改为静态内部类 + WeakReference
  • BaiduMapActivity.java - LocationClient 在 onDestroy 时停止

修复方式:

// AlertDialog 内存泄漏修复
public class LoginActivity extends Activity {
    private AlertDialog progressDialog;
    
    @Override
    protected void onDestroy() {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        super.onDestroy();
    }
}

// Handler 内存泄漏修复
private static class SafeHandler extends Handler {
    private final WeakReference<StationData> outerClass;
    
    SafeHandler(StationData outer) {
        outerClass = new WeakReference<>(outer);
    }
    
    @Override
    public void handleMessage(Message msg) {
        StationData data = outerClass.get();
        if (data == null) return;
        // 处理消息
    }
}

✅ 4. 移除注释掉的代码

修改文件:

  • LoginActivity.java - 移除 200+ 行注释代码
  • Register1.java - 移除注释代码
  • App.java - 移除注释代码
  • BaiduMapActivity.java - 移除注释代码

清理内容:

  • 未使用的测试代码(传感器、GIF 显示、短信处理)
  • 废弃的注册逻辑
  • 注释掉的 Intent Filter
  • 大量 // TODO// FIXME 注释

✅ 5. 改进错误处理

修改文件:

  • 所有网络请求添加失败回调处理
  • 用户友好的错误提示("网络错误" → "网络错误,请检查网络连接")
  • 添加日志记录(使用 Log.e() 并传递异常对象)

改进方式:

// Before ❌
@Override
public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
    Log.e("hechao", "error");
}

// After ✅
@Override
public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
    Log.e("hechao", "Failed to login", throwable);
    Toast.makeText(LoginActivity.this, 
        "网络错误,请检查网络连接", Toast.LENGTH_SHORT).show();
}

未完成的修复(需要后续处理)

⏳ 1. 迁移到 HTTPS

原因: 需要后端支持,无法在客户端单独完成

建议:

  1. 后端配置 SSL 证书
  2. 客户端将所有 http:// 改为 https://
  3. 添加证书锁定(Certificate Pinning)

⏳ 2. 升级依赖库

原因: 工作量较大,可能引入兼容性问题

需要升级:

  • Gradle: 1.0.0 → 7.4.2
  • compileSdkVersion: 23 → 33
  • ButterKnife: 5.1.1 → ViewBinding
  • AsyncHttpClient → OkHttp + Retrofit
  • Support Library → AndroidX

预计工作量: 8-12 小时


⏳ 3. 架构重构

建议:

  • 引入 MVVM 架构(ViewModel + LiveData)
  • 使用 Repository 模式管理数据
  • 统一网络请求封装
  • 引入依赖注入(Hilt/Koin)

预计工作量: 20-40 小时


代码统计

修改的文件

  • Java 文件: 10 个
  • 配置文件: 2 个(gradle.properties, app/build.gradle)
  • 文档文件: 2 个(CODE_REVIEW_REPORT.md, REFACTORING_SUMMARY.md)

代码行数变化

  • 删除: ~400 行(注释代码、冗余代码)
  • 添加: ~200 行(输入验证、错误处理)
  • 修改: ~300 行(SQL 注入修复、内存泄漏修复)

安全性改进

修复前

  • 🔴 硬编码敏感信息暴露在代码中
  • 🔴 SQL 注入漏洞(直接拼接用户输入)
  • 🔴 不安全的网络通信(HTTP 明文传输)
  • 🟡 内存泄漏风险
  • 🟡 缺少输入验证

修复后

  • ✅ 敏感信息通过 BuildConfig 管理
  • ✅ SQL 注入风险消除(POST + RequestParams)
  • 🔴 不安全的网络通信(需要后端支持 HTTPS)
  • ✅ 内存泄漏风险降低
  • ✅ 添加输入验证

测试建议

1. 安全测试

  • 使用 OWASP ZAP 扫描网络请求
  • 测试 SQL 注入(尝试在输入框输入 admin' OR '1'='1
  • 反编译 APK 检查敏感信息是否暴露

2. 功能测试

  • 注册/登录功能
  • 添加好友功能
  • 好友列表加载
  • 个人资料编辑和保存
  • 地图定位功能

3. 性能测试

  • 内存泄漏检测(使用 Android Profiler)
  • 长时间运行稳定性测试
  • 弱网环境测试

后续优化建议

短期(1 周内)

  1. 配置生产环境 API key - 将 gradle.properties 中的 key 替换为真实 key
  2. 后端支持 HTTPS - 配置 SSL 证书
  3. 完善错误处理 - 统一错误码和错误提示

中期(1 月内)

  1. 升级依赖库 - Gradle、compileSdkVersion、Support Library
  2. 迁移到 ViewBinding - 替代 ButterKnife
  3. 引入网络层封装 - Retrofit + OkHttp

长期(3 月内)

  1. 架构重构 - MVVM + Repository
  2. 单元测试 - 核心业务逻辑测试覆盖
  3. CI/CD - 自动化构建和测试

总结

本次重构主要解决了 安全性问题(硬编码敏感信息、SQL 注入)和 稳定性问题(内存泄漏),代码质量有显著提升。

核心改进:

  1. ✅ 敏感信息不再暴露在代码中
  2. ✅ SQL 注入风险基本消除
  3. ✅ 内存泄漏风险降低
  4. ✅ 代码可读性提升(移除注释代码)

剩余风险:

  1. 🔴 HTTP 明文传输(需要后端支持)
  2. 🟡 过时的依赖库(兼容性风险)

Talk is cheap. Show me the code. - 代码已经修好了,现在该测试了。


重构完成时间: 2026-03-02 22:30