我有一个与网络服务对话的移动应用程序(目前是 IOS 和很快的 Android)。没有登录,数据不是私人的。基本上,该应用程序发布一个标记(经度、纬度)并获取最近的 25 个标记以显示在地图上。
这是一个非常微不足道的应用程序,我无法想象有人会付出巨大的努力来滥用 Web 服务。但是,我可以看到有人在发布许多标记时很有趣。我最担心的是有人在运行一个推送许多请求的脚本(使用昂贵的带宽并对我的应用程序数据进行胡说八道)。
我慢慢得出结论,这并不安全。最好的答案是“不要这样做”。不要提供未经身份验证的 Web 服务。没有多少服务如此开放。Google 的 You Tube API 是开放的,但大多数都不是。不幸的是,我别无选择。因此,经过几天的研究,这是我的想法。请注意,我离安全专家还很远,我相信我的方法可以改进。但这可能会为您指明正确的方向。希望更有经验的人可以加入并纠正/改进这一点。我发现这篇文章和评论特别有用。
消息级安全
我将使用哈希加密来保护味精。客户端和 Web 服务都保留一个共享密钥的副本,该密钥用作盐以从 URL 和所有 POST 参数创建哈希。散列作为附加参数传递,并且在另一端重建和比较散列(使用共享密钥作为盐)。在您了解任何移动客户端代码都可以在几分钟内进行逆向工程之前,这非常好。在这一点上,这条防线完全没有用。
客户措施
客户端包括消息速率限制作为限制诚实用户发送的消息数量的措施。再一次,这对于越狱移动设备的攻击者来说毫无用处。
服务器端安全
因此,服务器端必须尽可能多地采取额外的安全措施,以独立于假设您的客户端(和共享机密)受到损害的情况。这是我所拥有的:
一个 msg arg 是用于限制重放攻击的 UTC 时间。这应该可以防止攻击者在服务器上重复触发相同的消息。
服务器通过 IP 进行速率限制。是的,IP 很容易被欺骗,并且代理切换是孩子们的游戏,但是当你拥有这么少的东西时,一切都会有所帮助。
当然,服务器严格验证所有参数,使用参数化查询并且不返回异常。
传输级安全
不幸的是,我相当有信心在没有注册过程的情况下颁发单个客户端 SSL 证书是不可能的。而且因为我使用的是 msg 哈希检查(而且我的数据不是私有的),所以我不完全确定 SSL 带来了什么。但是,我可能会使用 SSL(带有一个应用程序范围的证书),因为它增加了另一个级别的安全性,可以轻松且廉价地部署(尽管每个 msg 都会花费额外的连接时间)。
我的方法中的大洞
我被警告说,如果该应用程序变得流行,那么有人会破坏客户端上的共享秘密。仅仅因为他们可以而且他们可能会将其发布在互联网上。所以实际上这一切都归结为服务器端。不幸的是,我无法识别和阻止攻击者。这是我非常喜欢的。
最后的请求
经过几天的研究,这就是我所拥有的。但我想要更多。我将特别感谢任何加强服务器端的想法。所以,我把我所有的 SO 点都作为赏金。是的,先生,全97分!