在互联网上,我看到以下建议:
GET永远不要更改服务器上的数据-为此使用POST请求
这个想法的基础是什么?
如果我做一个将数据插入数据库的php服务,并在GET查询字符串中传递参数,那为什么会出错呢?(我使用准备好的语句来处理SQL注入)。POST请求以某种方式更安全吗?
还是有一些历史原因?如果是这样,那么今天的建议有多有效?
在互联网上,我看到以下建议:
GET永远不要更改服务器上的数据-为此使用POST请求
这个想法的基础是什么?
如果我做一个将数据插入数据库的php服务,并在GET查询字符串中传递参数,那为什么会出错呢?(我使用准备好的语句来处理SQL注入)。POST请求以某种方式更安全吗?
还是有一些历史原因?如果是这样,那么今天的建议有多有效?
Answers:
这不是建议。
甲GET
以这种方式在所定义的HTTP协议。它应该是幂等且安全的。
至于为什么- GET
可以缓存并在浏览器中刷新。一遍一遍又一遍。
这意味着,如果你犯同样GET
再次,你会插入到你的数据库再次。
考虑一下,如果GET
成为链接并且被搜索引擎抓取,这意味着什么。您的数据库中将充满重复数据。
我还建议阅读URI,可寻址性以及HTTP GET和POST的用法。
在某些浏览器中,链接预取也存在问题-即使页面作者未指明,它们也会调用预取链接。
例如,如果您的注销位于站点上每个页面所链接的“ GET”后面,则仅由于此行为而使人们可以注销。
GET
永远不会是破坏性的行为(正确的是,因为它是通过这种方式指定的)。如果现在通过破坏该规范破坏应用程序,则将保留应用程序的两个部分。
GET
。该建议是错误的。安全意味着用户不能对副作用负责,也不意味着不能有副作用。否则,您将没有服务器的日志文件,这很荒谬!RFC2616的9.1.1节非常清楚地阐明了这一点。
GET
不应更改所请求的资源GET
,但这并不意味着“服务器上的任何内容都不应更改”。当然,在任何请求期间,诸如日志,计数器和其他服务器状态之类的内容都可能发生变化。
每个HTTP动词都有自己的责任。例如GET
,由RFC定义
表示检索Request-URI标识的任何信息(以实体形式)。
POST
另一方面,表示插入或更正式地
POST方法用于请求源服务器接受
请求中包含的实体作为
请求行中Request-URI标识的资源的新下属
保持这种方式的原因:
GET
用作信息检索和数据挖掘的手段GET
实际上是read,而POST
实际上是writeGET
相同的URL必须向所有用户返回相同的结果,否则您将完全不信任返回的结果为了完整性,只是为了强制正确使用(来源):
GET
参数作为URL的一部分传递,该URL的长度很小且有限,默认情况下为256个字符,某些服务器支持4000多个字符。如果要插入长记录,则没有合法的方法将数据传递到̶G̶E̶T̶
̶转移纯文本。URL实际上是使用TLS加密的,所以TLS很好。GET
是不切实际的GET
如果用户在浏览器中按“后退”按钮,将重新执行?
符号的URL编辑:之前,我说过POST可以帮助您防御CSRF,但这是错误的。我不认为这是正确的。您必须在所有更改数据的请求中要求会话范围的唯一隐藏令牌,以防止CSRF。
在互联网的早期,有浏览器加速器。这些程序将开始单击页面上的链接以缓存内容。Google Web Accelerator就是这些程序之一。这可能会对单击链接时进行更改的应用程序造成严重破坏。我假设仍然有人在使用加速器软件。
代理服务器和浏览器将缓存GET请求,因此当用户再次访问该页面时,它可能不会将请求发送到您的应用程序,因此用户认为他们已采取了措施,但实际上没有。
对于以数据库为中心的应用程序中的CRUD操作,请使用以下模式:
使用HTTP GET进行读取操作(SQL SELECT)
使用HTTP PUT进行更新操作(SQL UPDATE)
使用HTTP POST进行创建操作(SQL INSERT)
使用HTTP DELETE进行删除操作(SQL DELETE)
GET永远不要更改服务器上的数据-为此使用POST请求
该建议以及此处的所有答案都是错误的。显然,我过于戏剧化,其他答案也很好,但是我认为确切的建议应为:
GET应该很少更改服务器上的数据-为此使用POST请求
说“从不”太极端了,尽管这里的其他答案准确地解释了为什么您应该“很少”这样做,但是在某些情况下,使用GET更改数据是完全合理的。一个示例是一次性使用电子邮件验证链接。通常,这些链接包含一个GUID,在访问该GUID时必须更改数据。如果正确实现,则随后的相同GET请求将被忽略。
这显然是一个边缘情况,但当然值得注意。