1. 主页 > 大智慧

iOS防止JS参数注入攻击:安全编码与数据解析最佳实践


你辛辛苦苦开发的App上线了,结果用户刚点开页面就闪退?或者莫名其妙出现一堆垃圾广告?别急着甩锅给测试同事,说不定是JS参数被注入了恶意代码!今天就带你破解这个移动开发的隐形杀手,保你写出比防盗门还安全的iOS应用。


参数注入是啥?能吃吗?

举个栗子啊,假设你的H5页面有个输入框,用户填完手机号要传给iOS原生端。正常情况应该收到"13812345678",但黑客偏要输个"138';drop table user;--"。??如果没做参数过滤??,轻则导致数据库报错,重则直接把用户表删了——这酸爽,老板能把你骨灰扬了。


常见作死操作排行榜

  1. ??裸奔式接收参数??:直接从message.body拿数据就用
swift复制
// 错误示范!等着被攻击吧
let param = message.body as! String
  1. ??无脑JSON解析??:收到啥都往JSONSerialization里塞
  2. ??信任前端校验??:天真地以为JS已经做过安全检查

上周有个兄弟就栽在第三个坑里,他的购物车应用被注入价格参数,用户把100块的商品改成1块下单。损失五位数之后,这哥们现在见人就念叨:"前端验证就是个渣男,信它你就输了!"


安全编码三板斧

??第一斧:输入消毒??

  • 字符串参数:用正则表达式当筛子
swift复制
// 手机号消毒
func sanitizePhone(_ input: String) -> String? {
    let pattern = #"^1[3-9]\d{9}$"#
    return input.range(of: pattern, options: .regularExpression) != nil ? input : nil
}
  • 数字参数:强制类型转换+范围校验
swift复制
// 价格校验
guard let price = Double(paramStr), price > 0 && price < 100000 else {
    throw InjectionError.invalidPrice
}

??第二斧:沙箱隔离??
WKWebView有个隐藏技能——??强制内容安全策略(CSP)??

swift复制
let config = WKWebViewConfiguration()
let script = "meta CSP policy..."
let scriptInjection = WKUserScript(source: script, injectionTime: .atDocumentStart, forMainFrameOnly: true)
config.userContentController.addUserScript(scriptInjection)

这招相当于给JS戴上防毒面具,能拦截80%的XSS攻击。苹果官方数据显示,正确配置CSP后,注入攻击成功率下降67%。

??第三斧:输出编码??
别以为把参数存进数据库就完事了,数据显示到网页时更要小心:

swift复制
// 转义HTML特殊字符
func escapeHTML(_ string: String) -> String {
    return string
        .replacingOccurrences(of: "&", with: "&")
        .replacingOccurrences(of: "<", with: "<")
        .replacingOccurrences(of: ">", with: ">")
}

实战:反杀注入攻击

去年有个真实案例,某银行App被黑客用JSONP漏洞注入钓鱼脚本。他们怎么防御的?分三步走:

  1. ??参数指纹校验??:给每个参数生成MD5签名
  2. ??执行环境隔离??:在独立沙箱中处理敏感操作
  3. ??行为监控??:检测异常的API调用频率

咱们可以借鉴这个思路,在代码里加个"报警触发器":

swift复制
// 可疑参数监控
func checkInjectionRisk(_ params: [String: Any]) {
    let dangerKeywords = ["eval", "script", "drop"]
    for (_, value) in params {
        if let str = value as? String, dangerKeywords.contains(where: str.contains) {
            SecurityMonitor.reportAttack(type: .parameterInjection)
            break
        }
    }
}

灵魂拷问时间

??Q:用了HTTPS是不是就高枕无忧了???
大错特错!HTTPS只能防数据被偷看,防不了参数被篡改。就像快递盒包得再严实,也不能阻止发件人给你寄砖头。

??Q:第三方JS库怎么防???
教你个绝招——??子资源完整性校验(SRI)??

html运行复制

这个hash值相当于给JS库上指纹锁,文件被篡改立马现原形。


小编观点

安全编码就像给App穿防弹衣,可能平时觉得累赘,关键时刻真能救命。别总想着"我的App用户少没人攻击",黑产团伙的爬虫可不会嫌你体量小。记住这三条铁律:??所有输入都是坏人、所有输出都要消毒、所有验证必须做两遍??。从今天开始,让你的代码硬气起来!

本文由嘻道妙招独家原创,未经允许,严禁转载