1

我使用 geodjango 来创建和提供我通常在 OpenLayers 中显示为 openLayers.Layer.TMS 的地图图块

我担心任何人都可以在未经许可的情况下获取 Web 服务 URL 并将其插入自己的地图,然后消耗大量服务器的 CPU 并侵犯私有数据所有权。另一方面,我希望无需登录即可公开使用磁贴服务,但只能从我的网站访问。

我认为这种违规行为是可能的吗?如果是,那么保护它的方法是什么?是否可以在客户端浏览器中隐藏 url?

编辑: 您在 OpenLayers 中启动瓦片地图服务的方式是通过可以从客户端浏览器读取的 javascript,如下所示:

    tiledLayer = new OpenLayers.Layer.TMS('TMS',
                "{{ tmsURL }}1.0/{{ shapefile.id }}/${z}/${x}/${y}.png"
                        );

将其复制/粘贴到另一个网站并访问 Web 服务数据真的很容易。

如何在 url 中添加 API 密钥并设法定期重新生成它?

4

2 回答 2

1

这可能无法回答您的问题,但无法在浏览器中隐藏 Web 请求。对于普通用户来说,查看实际请求将非常困难,但对于精通网络/计算机的用户(通常是想要利用您的 API 的程序员)进行一些嗅探并最终查看/使用您的 Web 请求可能非常容易。

您尝试执行的操作称为通过默默无闻的安全性,通常不建议这样做。如果您希望您的 API 对非授权用户完全安全,则必须创建更强大的身份验证机制。

祝你好运!

于 2013-06-06T19:00:58.220 回答
1

RESTful Authentication有一个很好的答案,可以真正帮助您。这些原则也可以在 django 中进行调整和实现。

您可以做的另一件事是将它比在 django 中实现它高一个级别,但使用您的网络服务器。

例如,我在 nginx + uwsgi + django 设置中使用以下内容:

# the ip address of my front end web app (calling my Rest API) is 192.168.1.100. 

server {
    listen            :80;
    server_name       my_api;

    # allow only my subnet IP address - but can also do ranges e.g. 192.168.1.100/16
    allow             192.168.1.100;
    # deny everyone else
    deny              all;

    location / {
    # pass to uwsgi stuff here...
    }
}

这样,即使他们获得了 URL,nginx 也会在它到达您的应用程序之前将其切断(可能会为您节省一些资源......??)。

您可以在nginx 文档中阅读有关 HTTP 访问的更多信息。

还值得注意的是,您也可以在 Apache 中执行此操作- 我只是更喜欢上面列出的设置。

于 2013-06-07T14:28:56.580 回答