代码之家  ›  专栏  ›  技术社区  ›  UpTheCreek

减少从Ajax/JSON服务中获取数据的技术

  •  11
  • UpTheCreek  · 技术社区  · 15 年前

    我想知道是否有人遇到过任何技术来减少通过服务器上的JSON类型服务(旨在提供Ajax功能)暴露的数据被外部代理获取的机会。

    在我看来,如果你说一个使用数据的Flash客户机,这个问题就不那么困难了。然后您可以向客户机发送加密数据,客户机将知道如何对其进行解密。然而,由于JavaScript源代码的开放性,对于Ajax来说,同样的方法似乎是不可能的。

    有人在这里实施了一项巧妙的技术吗?

    无论使用哪种方法,它都应该允许真正的Ajax函数使用数据。

    请注意,我并不是真的在讨论保护“敏感”信息,泄漏的奇怪记录不是问题。相反,我正在考虑停止这样一种情况,即整个数据库被僵尸(一次完成,或随着时间的推移逐渐完成)所覆盖。

    谢谢。

    7 回复  |  直到 15 年前
        1
  •  7
  •   eglasius    15 年前

    首先,我想澄清一下:

    在我看来问题不是 如果你说了一句话,那就太难了 使用数据的客户端。那么你 可以将加密数据发送到 客户,知道如何 解密它。同样的方法似乎 但是,使用Ajax是不可能的,因为 javastrip的开放性 来源。

    很明显,信息被加密发送到Flash客户机,攻击者很容易从您的Flash编译程序中找到用于此操作的内容-复制并获取所有数据。

    如果数据恰好具有您正在思考的值,那么您可以依赖上面的内容。

    如果这是公共信息,请接受这一点,不要与之抗争,而是找到利用它的方法。

    如果这是您只向一组用户公开的信息,请确保您具有相应的身份验证/安全通信。如其他人所说,跟踪使用情况,并采取相应措施,

        2
  •  7
  •   Justin Grant    15 年前

    阻止僵尸程序窃取你的数据的第一件事不是技术,而是合法的。首先,确保你的网站在使用条款中使用了正确的语言,从法律的角度来看,你试图阻止的内容实际上是不允许的,并且是可以辩护的。第二,确保在设计技术策略时考虑到了法律问题。例如,在美国,如果您将数据置于身份验证屏障之后,而攻击者窃取了数据,则很可能是 violation of the DMCA law .第三,找一个能在知识产权和DMCA问题上为你提供建议的律师……StackOverflow上的好人还不够。:-)

    现在,关于技术:

    一个合理的解决方案是要求用户在能够访问敏感的Ajax调用之前进行身份验证。这允许您简单地监视Ajax调用的每用户使用情况,并(手动或自动)取消在特定时间段内发出过多请求的任何用户的帐户。(或者如果您试图防御涓涓细流的方法,则请求总数太多)。

    当然,这种方法容易受到自动注册新“用户”的复杂僵尸的攻击,但是有了相当好的captcha实现,很难构建这种僵尸。(参见“规避”一节 http://en.wikipedia.org/wiki/CAPTCHA )

    如果你想保护 公众的 数据(没有身份验证),那么您的选项就更有限了。正如其他答案所指出的,您可以尝试基于IP地址的限制(并与大型企业代理用户发生冲突),但复杂的攻击者可以通过分布负载来绕过这一限制。还有像Likley这样的复杂软件,它可以监视请求时间、请求模式等,并试图发现僵尸。例如,扑克网站在这方面花了很多时间。但不要指望这些系统便宜。你可以做的一件简单的事情就是挖掘你的网络日志(例如使用 Splunk )找到你网站上的前N个IP地址,然后对它们进行反向IP查找。一些将是合法的公司或ISP代理。但是,如果你在名单中识别出一个竞争对手的域名,你可以封锁他们的域名或者跟你的律师联系。

    除了盗窃前的防御之外,您可能还需要考虑插入一个“蜜罐”:故意伪造信息,以便以后跟踪。例如,地图制造商就是通过这种方式来抓住浪费的:他们在地图中插入一条假街道,然后看看其他哪些地图显示的是同一条假街道。虽然这并不能阻止有决心的人吸走你所有的数据,但它可以让你稍后发现谁在使用你的数据。这可以通过在文本输出中嵌入唯一的文本字符串来实现,然后在Google上搜索这些字符串(假设您的数据在另一个公共网站上可重用)。如果您的数据是HTML或图像,您可以包括一个指向您的网站的图像,您可以跟踪谁下载了它,并寻找模式,您可以使用它来击败那些免费下载者。

    请注意,其他答案之一中提到的javascript加密方法对于未经验证的会话不起作用——攻击者只需下载javascript并像普通浏览器一样运行它。故事的寓意:公共数据本质上是不可辩驳的。如果要保护数据,请将其置于身份验证屏障之后。

    这是显而易见的,但是如果你的数据可以被搜索引擎公开搜索,你将需要一个非Ajax的解决方案(Google不会读取你的Ajax数据!)你要把这些页标出来 NOARCHIVE 所以你的数据不会出现在谷歌的缓存中。你可能还需要一个搜索引擎爬虫IP地址的白名单,你可以进入你的搜索引擎爬虫网页(你可以与谷歌,必应,雅虎等合作,以获得这些),否则恶意机器人可以简单地模仿谷歌,并获得你的数据。

    最后,我要回应上面的@kGregory:确保威胁是真实的,值得付出所需的努力。许多公司高估了其他人(合法客户和恶毒行为者)对自己业务的兴趣。可能是你的情况很奇怪,你有特别重要的数据,它特别有价值获得,它必须在没有认证的情况下公开访问,如果有人窃取你的数据,你的法律资源将受到限制。但所有这些都是不寻常的。

    另一种思考这个问题的方法,可能适用于你的案例,也可能不适用于你的案例。有时更改数据的工作方式更容易,从而避免了对数据的安全保护。例如,您是否可以将数据以某种方式绑定到站点上的服务,以便数据在与代码一起使用时不会非常有用。或者你可以在里面嵌入广告,这样无论在什么地方你都能得到报酬?等等。我不知道这些缓解措施是否适用于您的案例,但许多企业已经找到了在互联网上免费赠送东西(鼓励而不是阻止广泛的再分销)并仍然赚钱的方法,因此在您的案例中,混合的免费/支付策略可能(或不可能)是可能的。

        3
  •  1
  •   mattbasta    15 年前

    如果您有一个内部memcached框,您可以考虑使用一种技术,在这种技术中,您可以为每一个IP创建一个条目,该条目将在一小时内到达您的服务器。然后在每次IP到达Ajax端点时增加该值。如果值超过特定阈值,则重新建立连接。如果值在memcached中过期,您知道它不会被“hoovered away”。

        4
  •  1
  •   aasukisuki    15 年前

    这不是一个有概念证明的具体答案,但可能是你的起点。您可以创建一个提供加密/解密功能的javascript函数。Javascript需要动态构建,并且您将包含会话独有的加密密钥。在服务器端,您将拥有一个加密服务,它使用会话中的密钥在传递JSON之前对其进行加密。

    这至少可以防止有人监听你的网络流量,从你的数据库中提取信息。

    不过,我和Kdgergory在一起,听起来你的数据太开放了。

        5
  •  1
  •   elhoim    15 年前

    一些技术列在 Further thoughts on hindering screen scraping .

    如果你使用PHP, Bad behavior 是一个很好的帮助工具。如果您不使用PHP,它可以提供一些关于如何过滤的想法(请参见 How it works 页)。

    Incredibill's blog 正在给出好的提示、要阻止的用户代理/IP范围列表等…

        6
  •  1
  •   Dave    15 年前

    以下是各种建议:

    1. 发布赎回所需的令牌以及每个Ajax请求。使令牌过期。
    2. 跟踪来自每个客户机的查询数,并根据网站的预期正常使用情况限制过度使用。
    3. 寻找使用中的模式,例如顺序查询、请求峰值或查询发生的速度比人类可以执行的快。
    4. 检查用户代理。许多机器人程序不能完全复制浏览器的用户代理信息,您可以使用此方法消除对数据的编程性刮擦。
    5. 一旦超过请求阈值,更改网站的前端组件以重定向到验证码(或其他人工验证机制)。
    6. 修改逻辑,使respsonse数据以几种不同的方式返回,从而使解析所需的代码复杂化。
    7. 废弃客户端的javascript。
    8. 阻止违规客户的IP。
        7
  •  0
  •   BalusC    15 年前

    僵尸通常不解析javascript,因此Ajax代码不会立即执行。如果他们真的这样做了,僵尸通常也不维护会话/cookie。知道这一点后,如果调用请求时没有有效的会话/cookie(显然是由父页上的请求预先在服务器端设置的),则可以拒绝该请求。

    但这并不能保护你免受人身伤害。最安全的方法是限制使用登录名/密码的用户访问。如果这不是你的意图,那么你必须接受这样一个事实 公众的 应用程序。当然,您可以使用IP地址和用户代理扫描日志和维护黑名单,但这是极端的。