【发布时间】:2013-03-20 05:00:09
【问题描述】:
我正在构建一个使用 PHP Web 服务的 android 应用程序(我也在构建它)。
我的问题是,如何防止未经授权的用户使用我的网络服务?例如,是否有人可以获取我的 Web 服务的地址并在我的应用程序之外使用它(例如,将发布变量发送到我的服务)?
另一个相关问题是如何防止我的网络服务上的垃圾邮件请求?会不会是记录IP地址并限制调用量的情况?
【问题讨论】:
标签: java php android web-services
我正在构建一个使用 PHP Web 服务的 android 应用程序(我也在构建它)。
我的问题是,如何防止未经授权的用户使用我的网络服务?例如,是否有人可以获取我的 Web 服务的地址并在我的应用程序之外使用它(例如,将发布变量发送到我的服务)?
另一个相关问题是如何防止我的网络服务上的垃圾邮件请求?会不会是记录IP地址并限制调用量的情况?
【问题讨论】:
标签: java php android web-services
您可以在 Android 设备和您的网络服务 API 端点之间使用HTTPS 连接。
限制您的网络服务,使其仅接受HTTPS 连接。您可以使用 Apache(可能使用 SSLRequireSSL directive)或直接在您的 PHP 连接处理程序中轻松完成此操作。
在使用 HTTPS 传输流时,您可以在对 Web 服务进行 API 调用时传递特定参数,以确保请求已从您的应用程序发送。没有人能够知道传输了哪些具体数据,也无法重现与您的远程服务的可接受连接。
关于您的第二个问题,您确实可以限制给定时间内的请求数量。使用 PHP 或使用特定工具,例如 fail2ban。
【讨论】:
PHP 可以通过 POST 或 GET 从您的站点甚至 Internet 浏览器接收数据。用于执行此操作的方法之一是 curl。
你指的是什么?这个问题被称为Cross-site request forgery。
如果可以的话,你应该在你的应用中实现HTTPS的使用,这样可以解决很多安全问题。
万一你不能使用HTTPS(不管是贵还是其他问题):
你必须在你的PHP中验证POST或GET收到的信息,这种语言有很大的能力解决这些“问题”;看看PHP官方documentation的这个part。
假设您正在构建一个登录系统: 您还可以在登录页面中添加一个隐藏元素,其中包含只能发生一次的唯一密码,将此密码保存在会话中,因此,登录脚本会在会话中查找此代码,与发布到脚本的内容进行比较,应该继续。
而且,如果您想获取访问者的 IP 地址:
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
最后,阅读this。
编辑
如果您无法支付 HTTPS 证书,(如Halim Qarroum 所说),您可以使用:
Self signed SSL certificates, 哪些是免费的。 当然这有它的优点和缺点
【讨论】:
HTTPS 连接,则任何机构都可能通过不同类型的攻击来读取明文传递的数据。如果攻击者可以读取发送到他的 API 的数据,他就可以重现截获的请求,使 web 服务认为他是实际的 Android 应用程序。
My question is, how do I prevent unauthorised users using my webservice?。