2010-04-26 106 views
5

我是一个服务器端编程的新手,所以请原谅我,如果这变得凌乱。我已签约创建一个Web服务,以允许经过身份验证的用户访问数据库。用户必须输入登录名和密码。一直在阅读和阅读关于REST vs SOAP的内容,当我遇到这个陈述时,我想我已经解决了一个RESTful设计:“需要安全的数据不应该作为URI中的参数发送。”这似乎是对RESTful方法的一大缺点。我知道,使用https密码将被加密以防止中间人进行拦截,但这会使服务器日志和客户端历史记录成为可能的暴露点。有没有一个RESTful的解决方案,这个问题,还是我需要去SOAPY?任何建议赞赏。如何在REST风格的Web服务URI中保护密码参数?

+1

你为什么要通过URI传递密码,这明显是未加密的纯文本?如果是这种情况,那么为什么即使打扰密码呢? – 2010-04-26 18:56:54

+0

就像我说的,我是一个新手。在研究Web服务和REST vs SOAP时,似乎正在出现的共识是REST更简单,适用于大多数场景。在试图确定什么属于“大多数情况下”,什么不是,我认为我发现了与认证异常;即在RESTful设计中,所有内容都通过URI或标头传递,这两者都是脆弱的。所以我只是想知道这是否属实,或者是否有安全和RESTful的方式来使用用户名和密码进行身份验证。 – adam 2010-04-28 16:28:19

回答

1

使用POST类型的请求来传输必要的数据,并将敏感部分包含为发布字段,以便它是请求主体的一部分而不是URI中的参数。

+0

我不知道这有什么帮助。你能详细说明一下吗? POST不会通过URI传递数据,但它仍然会被传递。 HTTPS负责端到端的数据加密,但如果以纯文本格式存储密码,则不会有太大的作用。 – Krisc 2010-04-26 17:16:44

+1

OP的问题涉及数据的传输,而不是将其存储在服务器上。不在URI中传递安全数据的主要原因是,URI通常由您的个人应用程序以外的事物记录,比如Web服务器请求日志和浏览器历史记录。相比之下,这些日志和历史记录通常不记录POST字段。 – Amber 2010-04-26 17:32:34

+0

如果你确实需要登录POST字段,你可以[加密日志文件](http://stackoverflow.com/questions/629755/creating-an-encrypted-log-file) – 2011-12-01 02:25:53

0

这是配置您的Web服务器而不是您的应用程序的问题。错误配置会导致漏洞,这就是一个很好的例子。 Web服务器也可以记录POST请求,如果您的Web应用程序防火墙检测到攻击,这很常见。我会确保在apache中关闭日志记录功能,因为这可能不是您的应用程序正常运行所必需的。

另一个更常见的方法是使用cookie来维护会话。 Cookie仍然需要使用https保护其整个生命。

1

我认为,要真正RESTful,您应该使用HTTP身份验证(基本或摘要),因为被迫首先登录不符合REST的精神。但是,我希望这可以由知道REST的人确认(或驳斥)。

+1

其实随着REST的发展,像肥皂一样严格,这会解决他的问题。只要确保使用https。 – rook 2010-04-26 18:53:16

+1

另一种选择是使用客户端证书。您将服务器配置为只接受使用您批准的证书或由您批准的证书颁发机构颁发的证书进行的请求。在需要公共访问的情况下,这可能并不实际,但在您想要控制客户端列表的情况下,这是非常安全的。 – stand 2011-04-25 20:05:37

+0

@stand true。理想情况下,它是*解决方案。但是,正如你所说,公共访问不是“真实世界”。 – p4bl0 2011-04-25 20:35:06