当用户将数据发布到网页时验证用户的地理位置

Posted

技术标签:

【中文标题】当用户将数据发布到网页时验证用户的地理位置【英文标题】:Validate a user's geolocation when the user posts data to a webpage 【发布时间】:2011-07-12 22:20:29 【问题描述】:

我希望网站上有一个表单,只有在用户允许页面通过 html5 的地理位置获取用户位置时才能提交。提交表单后,我希望将这些坐标与其余信息一起传递。

但是,我想阻止人们仅仅编写自己的代码来发布带有纬度和经度信息的虚假数据。我想要某种身份验证,以确保发送的坐标与用户的地理位置相对应。

这可能吗?什么方法可以验证/签署从客户端(网页)发送到服务器的坐标?你会怎么做呢?

如果有人需要更多细节,网站本身将是一个 Ruby 应用程序,表单的提交按钮实际上只是通过 POST 对 URL 进行 REST 调用。

【问题讨论】:

您不能阻止用户提交表单(或至少发送看起来与已提交表单完全相同的数据)。您不能强制执行地理位置。您可以验证这些值是否在特定范围内(如果提供的话),但您不能保证它们代表用户实际所在的位置。 @RobG 这样的事情怎么样。当页面被请求时,它会创建一个令牌/随机字符串,并将其与 ajax 请求一起传递给文档的就绪事件,如建议的 apneadiving。然后页面本身可以使用用户需要手动输入的带有扭曲字符(它们的正确名称是什么?)的图像之一。用户响应也将使用与发送位置相同的令牌发送,如果正确,它验证该令牌并信任坐标? (我只是想让游戏变得复杂,并非不可能。)感谢您的帮助! 【参考方案1】:

小心:

浏览器可能无法处理 HTML5 地理位置

网站用户可以拒绝地理位置

如果用户接受地理位置,您应该直接通过 ajax 发送数据,否则 javascript 变量可能会在客户端更改。

if(navigator.geolocation) 
  //try to retrieve user's position
  navigator.geolocation.getCurrentPosition(function(position) 
     //put ajax request here and send (position.coords.latitude, position.coords.longitude)
    ,
    function() 
    //failure: the user refused
    
  );

else 
  //failure but the navigator doesn't handle geolocation

【讨论】:

使用 AJAX 不会阻止用户在客户端修改值(或发送他们想要的任何值)。 @RobG:当然可以,但是因为一旦用户接受地理编码,数据就会直接发送,因此之后更改 js 变量是没有意义的。 感谢您的回答。我不清楚您的方法如何验证来自客户端浏览器中运行的地理位置的坐标。服务器如何知道 ajax 请求是否来自我网站的就绪事件,而不是来自具有虚假值的其他位置?【参考方案2】:

没有办法 100% 验证发送到您的服务器的数据没有被更改。用户可以轻松地使用浏览器的控制台或简单的 curl 请求来发送他想要的任何内容。

你必须这样想:你基本上是在询问用户你在哪里?并且用户正在使用他的浏览器来帮助他找到他的位置,但是最后,用户可以向您的服务器发送任何数据。

我唯一能想到的就是验证 IP 地址位置是否接近发送的纬度/经度,使用类似这样的网站:http://www.ip2location.com/1.2.3.4

但无论如何,这不是 100% 安全的,因为如果用户想弄乱您的服务器,那么他可以使用代理来设置不同的 IP 地址。

【讨论】:

以上是关于当用户将数据发布到网页时验证用户的地理位置的主要内容,如果未能解决你的问题,请参考以下文章

当用户移动地图时,停止 MKMapView 移动到用户的当前位置

当用户单击按钮时,将文本字符串添加到输入字段中(在光标位置)

流星自动将地理位置保存到用户文档

允许从属(二级)数据验证的例外情况。

Flutter Google Maps - 将相机移动到当前位置

如何将启动时窗口的位置定位到用户屏幕的右侧?