适当的REST动词用于检查敏感数据输入是否有效?

时间:2012-08-23 21:35:40

标签: api rest

我需要发送数据并比较它是否存在于API服务器中。例如:

$a['foo'] = 'hello';
$a['bar'] = 'world';
$rest->verb('resource', $a);

如果API服务器中存在foobar的值,则应返回OK其他Bad Request

我想使用GET作为动词,因为它听起来更合适,只是在查询字符串中发送数据,但如果foobar是敏感信息并且通过传输更加安全,那该怎么办?交/放?但后来我没有添加或更新任何内容。

这种情况下最好的动词是什么?

2 个答案:

答案 0 :(得分:3)

好吧,出于安全考虑而排除GET 1 实际上只留下了POST / PUT(忽略了DELETE)。

在这些可用选项中,我建议使用POST,因为它更常见(特别是在REST之外)和整体上不太具体的HTTP动词。

来自REST for the Rest of Us

  

POST动词可以带有各种含义。 这是瑞士军刀的HTTP动词。对于某些资源,它可能用于改变内部状态。对于其他人,其行为可能是远程过程调用的行为。


1 GET的问题是服务器的任何数据必须通过URI(资源名称和查询字符串)传输。因此,此响应假设使用POST动词的请求不会使用URI来传输敏感信息,或者它不会比GET更好。文章How Secure are Query Strings over HTTPS?讨论了URI中数据的一些问题,即使使用HTTPS连接(应该用于所有敏感请求)。

答案 1 :(得分:1)

如果你将这样的问题发送到服务器并恢复正常。一毫秒之后,它可能不再适用。因此,如果您使用来自服务器的旧的(毫秒级但仍旧的)响应作为接受某些客户端输入的事实,那么当您稍后尝试存储该数据时,仍可能出错。

你应该只是尝试在服务器上创建一些东西,这意味着它应该是PUT或POST。如果您阅读了有关REST的内容,则表明如果您知道生成的资源的URL,则应使用PUT,否则请使用POST。你有它。如果一切正常,您可能希望发送201,否则发送409。

您在使用PUT / POST的服务器上创建的内容不一定是最终数据 - 它可能只是一个表示客户已声明此ID或其他内容的令牌。

现在,如果您仍然希望在服务器上存储任何内容之前进行额外的预检,那么您可能需要查看Expect或Accept等等......不记得了。在使用REST时,这是你的两个朋友。 :)

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

我还推荐这本关于REST的好书:http://shop.oreilly.com/product/9780596529260.do