如何安全Web服务,而无需登录(How To Secure Web Service Without

2019-06-27 00:35发布

我有一个移动应用程序(目前IOS和Android的很快)进行对话的Web服务。 没有登录和数据不公开的。 基本上,该应用的POST的标记(LON,LAT)和GET最近的25个标记显示在地图上。

这是一个非常平凡的应用程序,我无法想象任何人带来了巨大的精力投入到滥用网络服务。 不过,我可以看到有有人登载许多标记的乐趣。 什么最使我担心被别人运​​行迫使许多请求脚本(使用昂贵的带宽,使我的应用程序数据的废话)。

我慢慢地得出这一结论,这不可能是安全的。 最好的答案是“不这样做”。 不要在没有验证提供的Web服务。 不是很多服务都这么开放。 谷歌的你管API是开放的,但大多数都没有。 不幸的是,我别无选择。 所以看这个天之后,这里是我的想法。 要知道我是从安全专家很远,我相信我的方法可以改进。 但它也可能你指出正确的方向。 我们希望,更有经验的人会附和和正确的/改善已在此。 我发现这篇文章和评论特别有帮助。

消息级安全

我会确保封邮件用哈希加密。 客户端和Web服务都保留其作为盐来从URL和所有的POST参数的哈希共享密钥的副本。 哈希值作为附加参数传递和散列被重建并比较在另一端(使用所述共享密钥作为盐)。 直到你明白,任何移动客户端的代码可以在几分钟内逆向工程这是相当不错的。 此时这条防线是完全无用的。

客户端测量

该客户端包括速率的消息的限制,因为度量来限制由诚实用户发送的邮件的数目。 然而,这同样是对谁越狱的移动设备的攻击者无用。

服务器端安全

所以,服务器端必须有尽可能多的额外的安全措施成为可能,独自站在您的客户端(和共享的秘密)被泄露的假设。 以下是我有:

一个MSG arg是它是用来限制重放攻击UTC时间。 这应该防止攻击者在服务器上重复地触发同样的味精。

服务器执行率IP限制。 是的,IP地址很容易被欺骗和代理切换是孩子的戏,但一切帮助,当你有那么一点。

当然,服务器严格验证所有参数,使用parametised查询,不返回例外。

传输级安全

不幸的是,我相当有信心,发出单独的客户端SSL证书也不是没有可能的注册过程。 而且因为我使用的味精文件完整性检查(和我的数据是不是私人的),我不能完全肯定带来的表什么SSL。 不过,我可能会使用SSL(一个应用广泛的证书),因为它(在额外的连接时间为每个味精成本虽然)补充说,很容易和便宜部署的安全级别。

张开大大洞我的方法

我警告说,如果该应用成为流行,以至于有人将损害客户端上的共享的秘密。 正因为他们能和他们可能会发布在互联网上。 因此,其实这一切都归结到服务器端。 不幸的是, 我没有办法来识别和阻止攻击者 。 这我就心疼。

一个最后的恳求

经过几天的研究,这是我的全部。 但我想要更多。 我特别欣赏的任何想法来加强服务器端。 所以,我已经把我所有的有那么点了作为赏金。 是的,先生,所有的97​​分!

Answer 1:

其实你的具体情况,因为它是目前在iOS唯一的应用程序,有一个解决方案。

  1. 用户下载并运行首次应用后,应用程式命中/access_token/create与一个GUID和继电器回通过苹果的推送通知应用程序出现API。

  2. 应用程序商店这的access_token,并使用它在以后的所有请求。 您的实际的API可以在中的access_token的基础上的速率限制。

基本上,你让苹果做保证初始请求从实际的iOS设备来所有的辛勤工作。

扩展这对桌面客户端是可能的,但有些废墟UX。 只要改变第1步,允许/access_token/create接受任意的请求,如果请求从iOS设备不成立,则强制用户验证他们的电子邮件地址/发行他们的之前的access_token解决验证码等。

Android设备(不是真的熟悉它们)可能具有相似的推送通知的机制,在这种情况下,你可以使用,或可能不会有一个推送通知机制,在这种情况下,你可以受到您的Android用户上面列出的不便。



Answer 2:

我听说过这个想法一次,谈论寻找一个全球性的解决垃圾邮件问题的时候:迫使你的客户端执行一段时间回吐计算​​。

更确切地说:发现一些计算算法,可以计算一些z用于对xy在眼睛的眨眼,但它需要一定的时间相当长,以计算z报错只有x 。 我不能提供实际的算法,但我相信,有很多他们那会多这个标准。

现在整个过程应如下所示:

  1. 当第一客户端请求产生一些session_id并且为此session_id一对xy
  2. 与提供客户端session_idx
  3. 因为它接收数据(在一些后台线程不相关的用户交互)的客户可以立即开始计算。
  4. 要请求标记,客户必须提供session_id和计算z
  5. 您可以快速验证,如果客户的z是没事,因为你已经有xy ,让你轻松做到这一点。
  6. (选项1)对于每个session_id存储多少/经常被请求它。 你怀疑它是被滥用的时刻-力再生xy
  7. (选项2)强制新xy在用于每个连续请求session_id

6和7之间选择实际调整依赖于算法与预期的“公平”使用标记数据库的复杂性。 如果你的估计是好的 - 邪恶的客户不应该获得太多的数据或超载的服务器。

希望能帮助到你。



Answer 3:

有没有什么你可以在客户端做的。 你必须给整个应用程序(包括任何按键或任何其他保护机制)给你的用户。 如果恶意用户想与您的网络服务打恶作剧,他将不得不做一些逆向工程到你的Web服务。 你可以使这个困难,但你不能避免这种情况,无论你怎么努力。

我只是执行一些服务器端率(每个IP地址)限制,而不是担心任何更多关于这一点。 这是你赢不了的战争。 如果有人真的想伤害你的服务器,他只能DDOS它不知道你的Web服务协议的任何东西。

此外,在第一次连接自动生成每个用户一个唯一的密钥或证书并没有帮助的。 在攻击者逆向工程的协议,他知道如何处理这一切,并没有通过你的规则玩。 没有什么会从每一个他遇到的限速时间要求从服务器上一个新的密钥阻止他。

库巴Wyrostek描述可以工作的方法 - 使客户端执行一些耗时的计算,你可以快速检查你允许处理请求之前。 但这不能花太长时间或您的用户会抱怨电池寿命缩短。 此外,攻击者可能会使用更强大的台式机硬件,而不是另一部iPhone。

而最后一点 - 你真的认为这是必要的吗? 你不希望你的用户必须注册,那么您的数据或服务不能是太重要了。 那么,会有人有从逆向工程您的应用程序,并请求淹没你的服务器,以获得?



Answer 4:

我其实一直在寻找一个理由来实现其中的一些想法。 大的问题,到目前为止的答案。

我同意@Kuba Wyrostek关于对待它就像一个垃圾邮件的问题是解决方案的一部分。 特别是如果你的应用程序将具有文本消息(增加一个店,服务或信息),您可能会发现一个共同的理由垃圾邮件的应用程序将是做广告的东西。 这将导致我的第一个建议:

1)把每个消息的有效性为从0%到100%有效的百分比 。 开发在服务器侧的处理与heurestics到邮件标记为或多或少有效。 这将允许您针对一些其他方法(如强迫客户计算复杂的值),只有那些需要它的请求。 您也可以更方便地登录和审查可能的滥用(更容易清理虐待它是针对后)。

您的应用程序确实有过在垃圾邮件战争电子邮件服务器具有强大的优势,但是 - 你控制谈话的两侧。 这种情况实际上提醒的是,你可能会发现有用的其他两个相关的情况下我:卫星付费电视“战争”和即时通讯克隆“战争”。 (参考杰夫Atwoods岗上黑色的星期天破解 ,例如)。 下面是那些支架,可以帮助你得到一个有点超前猫捉老鼠的游戏的一些想法:

2)要求客户端发送额外的数据 -尽可能多的数据有关请求的是有道理的。 在iOS上,送精度指标的位置。 在Android上,其实你可以得到原始的GPS数据,如星历信息。 然后,您可以(也许不是现在,但后来),开始检查这些数据的有效性。 这迫使某人逆向工程的要求,以更加努力地工作。 如果他们在查看发送GPS卫星,例如,你可以检查,对公知的数据来证实。

3)强制你的对手到移动设备 -如@Sven笔记,你的攻击者可能会使用桌面PC,这意味着“计算昂贵”的要求可能会变得微不足道。 不要让他们做到这一点(或至少让他们更加努力地工作)。 你可以,例如,在客户端计算一些数学函数(由服务器发送),并看到,根据手机型号,如果它需要毫秒完成正确的数字。 还是做一个小的3D渲染任务从服务器,它依赖于硬件限幅行为的数据。 哈希结果并寄回。 所有这些将是一个范围内 - 这是一个多任务操作系统。 但是,这将极大地帮助。

4)去对他们的动态 -沿需要在客户端的角度来计算算法的比特发送。 苹果变得有点好笑来解释远程代码,但像发送一些JavaScript不呈现到用户可能会奏效。 该代码可以问的问题,唯一的种种(屏幕分辨率,浏览器版本的WebKit怪癖),这将是难以预料了前面。 当他们赶上,你可以用这些更多的创意。

5)CAPTCHA -如果你的启发开始看到可疑数据,迫使他们进行身份验证。 如果你有一个多语言的应用程序,它可以为图片或Unicode字符匹配到另一个简单。 呈现在您以后可以更新的方式。

总之 - 一些额外的想法。 祝好运!



Answer 5:

The simplest way to implement rate limiting on the server side is to just use a web server plugin/module. For example, if your service is running on apache, install and configure mod_evasive. This will allow you to rate limit based on IP address, service/URL, etc. Mod Evasive will be more effective than what you can implement on your own.

If you use keys, you need to have some kind of captcha based way for the client to get the keys upon signup. You could have it drop accounts for abusive users. Right, of course one parameter would be the timestamp which would be verified as recent and in the past on the server side. The key would encrypt the entire payload along with the timestamp, and be added as an additional parameter. Storing frequency of requests on a per-key basis ends up requiring some kind of round-robin database, unless you only check recency of last request.

No purely client-side rate limit will make any difference. Someone could discover your API on the web without ever even having seen your client. I doubt that a shared secret would be effective for long.

You will find plenty of web services that don't require a password and are merely rate limited... for example, the twitter API offers many rate-limited unauthenticated API services.



Answer 6:

这里是另一个“解决方案”:

  • 不要在这个问题上浪费时间。

因为:

  • 你不公开一个公共接口世界,所以你可以自由通过Web服务的更新,并更新了自己的应用程序来改变你的web服务接口在任何时间。
  • 应用程序是“非常琐碎”(你叫吧),可能在目前已不常用
  • 你可能有更重要的事情,现在做的,只是耗时

如果有可疑的性能或查询尖峰去解决消费最少的时间:

  • 介绍保存在您的应用程序(阻止这些用户的95%),此客户端ID以后可以用于识别不同的客户端,如果其他的程序员想要一个密码(客户端ID)合法访问服务
  • 引入速率限制(如上所述)

这将在99.99%,解决你的问题,你可以得到现在的工作和写真棒新功能。



Answer 7:

这是棘手的,你不要指望任何人篡改数据...所以你的担心是不是诚信。 既然你不维护客户的任何列表...不能有大约真实性任何关注?

而对于所有众所周知web服务攻击(如DOS或重放攻击),你可以阻止他们的防火墙。 因此,我不认为你需要多少理会他们。

但你不想发送纯文本数据,并要确保您下载的应用程序是什么推动了数据。

如果你看一下你正在评估的方法:

确保重点 :据我了解服务器和应用程序都将共享同一个密钥,如果我是正确的所有的所有设备上的应用程序将共享相同的密钥。 并且,当应用程序推数据它散列实际进料和整个实际饲料+散列饲料发送。 在服务器端,你可以使用键和散列实际饲料和验证它是否与哈希供电匹配。 而在我看来,这个解决方案主要是解决了数据完整性方面是不是对你的主要关注点。 RGT! (是它可能会很容易进行逆向工程。)

在上述方法的服务器需要存储密钥所以如果你的密钥被泄露你的整个服务将是,这将是难以更新所有新的关键的应用程序。 否则,如果应用程序生成一个密钥,将不得不与消息的摘要或东西(如时间戳+一些随机数)一起发送上线的关键。 事实并非如此难以打破。

证书:即使有证书,你获得同样的安全..但它很难打破,但易钢:)。 如果要保持与设备的私有密钥(ofcourse那么你将不得不维持在服务器的公钥)。 你将不得不分配每个客户端的私钥,然后服务器需要维护分配的所有私钥的公钥。 如果私有密钥只compromized是单一的应用程序可以是红色已检举,并要求更新。

那么剩下的就是从你想避免伪造数据应用的发展前景。 为了防止恶作剧的唯一点,检查这样的事情的缘故是在应用程序逻辑。 您将需要缓存的最后十个(或者甚至什么的最佳数量是),饲料(来自同一个IP正在添加),并有某种逻辑的验证,如果有一个缺陷。



Answer 8:

您可以使用速率限制+客户端“软”的注册。

基本上你会产生,你可以在根据第一请求的用户默认值存储的设备ID。 为每个请求您追踪有多少请求被发送到服务器,并限制它的服务器端。 这可真的很快实现。

你也可以有某种共享密钥用于签名与生成的设备ID您的请求后+ /获取参数



文章来源: How To Secure Web Service Without Login