我有一个用PHP编写的RESTful Web服务,它使用JSON进行通信.传输的一些数据非常敏感(密码),我正在寻找一种方法来实现服务的合理安全级别.客户端是silverlight 4应用程序.
我一直在搜索有关如何实现SSL/TLS的明确信息(我假设客户端证书身份验证属于该类别?)和消息级安全性,但我找不到关于php +中这些安全措施的实际实现的好例子json网络服务.我将非常感谢任何信息和实际例子.我知道原理,我对php不是很有经验.目前我唯一的安全措施是一个非常基本的身份验证令牌系统,在成功登录后创建服务器端会话并为用户提供身份验证令牌以进行任何进一步的通信(直到会话到期或用户从不同的IP).我真的想要至少保护敏感的流量,如密码.
最后,在实施TLS和消息层安全性之后,我必须注意哪些安全问题,如漏洞和漏洞?
先感谢您.
关于RESTful Web服务的大量示例没有考虑到当今许多应用程序是多用户的问题.
想象一下,暴露RESTful API的多用户后端.后端数据体系结构使用共享数据库和共享模式.每个表都包含对以下内容的引用tenant_id:
+-------------+----+-----------------+
| tenant_name| id | shared_secret |
+-------------+----+-----------------+
| bob | 1 | 2737sm45sx543 |
+-------------+----+-----------------+
| alice | 2 | 2190sl39sa8da |
+-------------+----+-----------------+
+-------------+----+-------+-----------+
| pet_name | id | type | tenant_id |
+-------------+----+-------+-----------+
| fuffy | 1 | dog | 1 |
+-------------+----+-------+-----------+
| kerry | 2 | cat | 2 |
+-------------+----+-------+-----------+
Run Code Online (Sandbox Code Playgroud)
问题1:如果有三个或更多客户端应用程序(即Android,iOS和Web App)与RESTful后端交互,您将如何对后端执行身份验证?
RESTful backend, API, HTTP-Verbs, shared database and schema
|
| …Run Code Online (Sandbox Code Playgroud) 我创建了一个RESTful服务器应用程序,它可以在有用的URL(例如www.site.com/get/someinfo)上提供服务请求.它是在Spring中构建的.
但是,这些访问受密码保护.我现在正在构建一个客户端应用程序,它将连接到此RESTful应用程序并通过URL请求数据.我如何通过凭证?目前,它只是向用户弹出用户/密码框,但我希望用户能够在客户端应用程序的框中键入用户名和密码,并让客户端应用程序在RESTful应用程序时提供凭据.它要求数据.客户端是使用Struts构建的.
干杯
编辑 - 我认为我的问题不够明确.我已经强制使用HTTPS了,我的问题更多,在代码中,当我从www.site.com/get/someinfo请求数据时,如何在提出请求的同时传递我的凭据?
我一直在挖掘stackoverflow/security.stackexchange线程,并没有明确的答案为客户提供一种通用的方式来安全地使用我正在通过asp.net的web api构建的RESTful服务.在搜索这个答案时,我看到"授权"和"身份验证"可以互换使用,所以我想指出我只想验证请求身份和合法性.所以,在这一点上,我不是在验证用户.
亚马逊的模型似乎是"滚动你自己"时引用的模型,但是,在这种情况下,我确实理解亚马逊已经提供了每篇论文的"论文",所以这里没有太多的重新发明.这篇文章, 设计一个没有OAuth的安全REST(Web)API,非常有帮助.
我收集的是:
我对2的问题很少,或许,我的思绪无法绕过.首先,不是应该保密的app秘密吗?那么,如果一个javascript客户端发出请求,这不会影响app密钥的保密性吗?为什么有一个应用秘密然后我可以通过验证应用密钥,现时值和服务器IP验证请求身份?我确实理解像php,ruby或c#.net这样的服务器端语言不会暴露这个秘密,但我希望这对JS和编译语言来说都是普遍安全的.
最后,Facebook有一个开发人员安全检查表告诉开发人员"永远不要在客户端或可编译代码中包含你的App Secret",这会向我建议加密的web.config等.此解决方案不适用于将REST服务暴露给通过javascript消费的任何人.
其他线程我已经通过梳理:
http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
https://developers.facebook.com/docs/facebook-login/安全性/
保护REST API/Web服务的最佳实践
REST身份验证方案的安全性
HTTP基本身份验证而不是TLS客户端认证
RESTful身份验证
我是第一次探索REST API的世界,我已经不得不通过使用Slim来解决它,但是考虑到我不需要任何框架来制作一个REST API,现在我想成为一个自制的解决方案。简单的Rest Api。我所做的是创建一个像这样的页面:
<?php
$method = $_SERVER['REQUEST_METHOD'];
$request = explode("/", substr(@$_SERVER['PATH_INFO'], 1));
switch ($method)
{
case 'PUT':
echo "PUT";
break;
case 'POST':
echo "POST";
break;
case 'GET':
echo "GET";
break;
case 'DELETE':
echo "DELETE";
break;
default:
handle_error($request);
break;
}
Run Code Online (Sandbox Code Playgroud)
我的目标是实现访问令牌,我认为应该在标头中传递它,但是我不确定(我正在寻找一种安全模式)。但是,如果我从命令行运行此命令:
curl -X GET http://localhost/v1
Run Code Online (Sandbox Code Playgroud)
我得到了GET,只是为了举例说明它应该如何工作。其他所有查询也是如此。现在真正的问题是:仅当我传递令牌时,如何才能在交换机中调用方法?例如,将在页面顶部执行控制,将执行以下检查:
if(!isset($_SERVER['AUTH_USER']))
{
exit('TOKEN not provide');
}
Run Code Online (Sandbox Code Playgroud)
另一个问题是如何通过curl传递令牌?因为如果通过...完成操作,我可以通过curl读取标题,但是它将如何工作?
更新:
如@Paradoxis所述,我尝试过:
url http://localhost/v1 -H "Authorization: <token>"
Run Code Online (Sandbox Code Playgroud)
但似乎我没有带头。我花时间了解为什么不传递标题,因此在我的代码中添加了以下行:
print_r(apache_request_headers());
Run Code Online (Sandbox Code Playgroud)
结果是:
Array
(
[Host] => localhost
[User-Agent] => curl/7.46.0
[Accept] => */*
[Authorization] => <token>
) …Run Code Online (Sandbox Code Playgroud) 好的......基本的想法是让SERVER和CLIENT在物理上分开(两个系统).
我的想法是构建一个将提供的独立Web服务(REST,XML,API-KEY)
然后我将用不同的语言(Flash,PHP,JavaScript)创建客户端.数据仅提供给经过身份验证的用户.
用户获取产品列表的典型通信将是:
好的......现在我遇到的问题是用户会话.假设我们想要构建Javascript客户端,我们实际上必须创建将与REST通信的PHP客户端(PHP了解REST API-KEY)并将信息转发给Javascript(CLIENT)吗?用户将通过PHP登录到REST服务器,然后通过PHP向REST服务器请求数据?
问题:
我正在使用Apache Jersey构建RESTful Web服务.现在我希望你需要对它的一些请求进行身份验证.使用典型的REST方法,身份验证应通过HTTP身份验证完成.但是这里的帖子 提到,如何做到这一点的更好方法是使用cookies.我认为讨论中有一些有效的观点.(如何)我可以使用Cookie验证泽西岛身份验证吗?我需要另一个框架吗?
我已经读过,会话违反了RESTfulness的概念.
由于微服务不可避免地使用REST,这同样适用吗?如果是这样,为什么我们有春季会议?它甚至列出了'Spring Session允许在头文件中提供会话ID以使用RESTfulAPI'作为其功能之一.
java spring-security spring-boot spring-session microservices
我试图了解如何使用restful客户端为经过身份验证的用户实现安全性.我遇到麻烦的情况是如何阻止用户更新不属于他自己的购买,因为宁静的客户通过了购买ID.对于熟练的用户,产品id可以容易地被篡改.由于使用https可以阻止或减轻它,因此我并不感兴趣.我真的对试图更新不属于他们的用户感兴趣.
你如何在其他世界阻止这种攻击?Web参数篡改
众所周知,Rest 服务是无状态的,一般的身份验证策略是使用基于令牌的身份验证。
在登录服务中,它需要返回令牌的凭据。
此令牌可能会在客户端 cookie 中设置,并且所有后续请求都使用此令牌进行验证并在令牌有效的情况下处理新请求。
现在我的问题是如何验证令牌?如果有人窃取了令牌并试图通过编辑cookie来使用窃取的令牌访问休息服务,那么如何识别和限制它呢?
我们永远无法知道令牌是否由有效用户获取并且同一用户是否正在尝试访问后续请求。但是有哪些可能的方法可以使其变得更加困难,例如验证请求是否来自同一来源?
一个一般建议是设置令牌/cookie 的老化时间,但直到该令牌/cookie 的老化时间为止它仍然没有帮助。
任何建议,将不胜感激。
rest ×8
java ×4
security ×4
php ×3
api ×2
ssl ×2
curl ×1
javascript ×1
jersey ×1
passwords ×1
service ×1
spring-boot ×1
struts ×1
web-services ×1