如何在 PHP 中构建安全的 RESTful 服务?

Posted

技术标签:

【中文标题】如何在 PHP 中构建安全的 RESTful 服务?【英文标题】:How to build a secure and RESTful service in PHP? 【发布时间】:2011-08-14 13:06:36 【问题描述】:

我正在构建一个应用程序系统,该系统由“在云中”的服务器部分和客户端部分组成,例如iPhone 或 android 应用程序或网络浏览器。

服务器端是用 php (LAMP) 实现的,现在是一个非常简单的服务器,有许多 php 文件服务于每种类型的方法请求,例如:getCustomers.php、addNewCustomer.php 等等。此外,到目前为止,还没有使用任何安全机制,托管服务器的 ISP 也不提供 SSL。没错,SSL 不是安全的选择。

现在,我想升级我的旧系统并实现它: 1) 真正的 RESTful 服务,以及 2) 增加安全性,用户必须经过认证和授权,但是明文密码当然是不行的。

我的问题很简单,我如何实现和实现上面的 1) 和 2) 点?是否有任何教程、书籍章节或博客文章将这一点结合在一起进行描述?还是我需要收集散布在网络上的信息,然后尽我所能将它们结合起来?

如果您知道答案,现在我希望我不会太粗鲁,请不要只说 oAuth this 或 openID that,相反,我希望能清楚地解释如何或指向例如博客文章对此进行了解释。不用说,我像疯子一样在网上搜索,但令我惊讶的是,却找不到一个好的答案!?

问候, 史蒂夫

【问题讨论】:

我也不想听起来粗鲁,但从您写的内容来看 - 您走在正确的轨道上。您提到了 OAuth / OpenID - 为什么不使用它进行身份验证?其他方式可以实现您自己的身份验证版本。至于创建真正的宁静服务,我可能是错的,但你有没有看过:ajaxpatterns.org/RESTful_Service 【参考方案1】:

是否有单独的教程、书籍章节或博客文章来描述这一点?

我可以推荐REST in Practice - Hypermedia System Architecture 作为构建HATEOAS 系统的指南。它没有 PHP 示例,但包含关于 Web 安全问题的完整章节,涵盖 HTTP 基本和摘要式身份验证、OpenID 和 OAuth 以及需要注意的攻击向量。

【讨论】:

【参考方案2】:

我不会发明/构建您的解决方案,而是将众多 PHP 框架之一用于 RESTful 服务。 http://www.recessframework.org/ 非常全面,尽管您几乎可以肯定必须对其进行扩展以包含身份验证。

http://phprestsql.sourceforge.net/ 确实支持开箱即用的身份验证,但依赖 HTTPS 来加密明文密码;当您研究如何处理身份验证时,您应该能够扩展它。

适当的身份验证:由于 REST 旨在尽可能使用 HTTP 标准,我建议使用 HTTP 身份验证机制 - 在 http://php.net/manual/en/features.http-auth.php(以及 W3C 文档中)中有详细描述。

【讨论】:

以上是关于如何在 PHP 中构建安全的 RESTful 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SSL/TLS 和/或消息级安全性保护 RESTful php Web 服务

如何使用 Java Spring 安全性构建功能齐全的 RESTful API

如何使用用户名/密码 + SSL 使用 WCF 配置安全 RESTful 服务

如何处理restful对接口安全性问题

如何使用 Spring 安全性和 Restful Web 服务验证数据库中的凭据?

使用 Android 保护 RESTful 服务的最佳方式