文档章节

GET/POST请求的合理使用

华兹格
 华兹格
发布于 2012/10/29 17:33
字数 1392
阅读 358
收藏 7

   在我们求职之初,可能都会被问到Http请求中的GET/POST有什么区别!当时我们可能会认为这还有区别?!可能因为编码习惯,我们会在doGet()方法里调用doPost()方法【或者互相调用】。但我们真的了解它们吗?

    Tim Berners-Lee在1996年曾经撰文阐述这个问题:GET请求用于从服务器获取信息,POST请求则用于改变服务器的状态。

    虽然对普通用户的正常访问来说,这2种方法看似没有多大区别,但是对一些“非正常”访问来说就有很大影响了!比如常见的蜘蛛爬虫、网页加速器这些自动化脚本来说。现在我们就联系网页加速器进行剖析!

     网页加速器实际上是一段客户端代码,它可以帮助用户提高浏览网页的速度——奥妙在于,它会预先缓存页面。也就是说,当用户浏览当前页面时,加速器会扫描页面上的链接,并在后台预先读取链接背后的页面,将它们缓存起来。
     现在,请想象你正在浏览一个在线商店,页面上有很多“放入购物车”的链接。当你还在这条栗色 短裤与那件紫色上衣之间犹豫不决时,加速器早己忙碌地访问了所有这些链接——每个链接都会往你的购 物车里放上一件新的货品。
     这个问题其实一直都存在:搜索引擎和其他爬虫程序一直不停地追踪网页上的链接。不过一般而言, 会改变服务器状态的那些链接(譬如“放入购物车”)都不会被暴露出来,只有用户开始交易之后才能看 到,因此爬虫也无法追踪它们。但网页加速不同,它是在客户端运行的,于是突然之间,所有这些链接都 在它面前暴露无遗了。

     在理想的世界里,任何有副作用的请求都应该以POST(或者是——很少用到的——PUT或者DELETE,而非GET)的形式提交——不应该用链接,而是应该用表单与按钮来要求服务器执行操作。

    这真的是一个问题么?和以往一样,答案是“看情况”。如果你在应用程序中放了一些危险的链接(譬如“删除订单”、“解雇员工”、“发射导弹”之类的),这些链接确实有可能被无意中访问到,然后你的应用程序就会忠实地执行这些操作。


     只要遵循一个简单的原则,就可以有效地避免出现危险链接。这个原则真的很简单:永远不要直接 用<a href="…">这样的链接来作危险的事情,因为这些链接有可能在用户毫不知晓的情况下被程序访 问到。 下面的技术可以帮助你在工作中贯彻这一原则:

    (1)使用表单和按钮(而非超链接)来执行会改变服务器状态的操作。表单可以用POST方式提交,这也就是说爬虫不会导致请求提交,并且当你刷新结果页面时浏览器会发出警告。

    (2)使用确认页面。如果确实无法使用表单,就应该让超链接指向一个确认界面,要求用户点击按钮提交表单完成确认。这样以来,爬虫或网页加速器就无法造成太大伤害了!

    (3)不要以为给链接加上一个js确认框就能保护,这样也无法阻止爬虫或别的自动工具追踪链接

     (4)不要以为只有登录用户权限控制就能确保安全,虽然爬虫无计可施,但客户端程序(如google的网络加速器 )仍然可以。

   

     这也许有点恐怖,真实情况也并非如此糟糕,只有在设计网站时遵循“把可能有风险的请求通过POST提交”这一简单原则就可以避免!


摘自:《Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版》,P.377

附:get/post 区别

1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 

建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

© 著作权归作者所有

华兹格

华兹格

粉丝 163
博文 220
码字总数 82578
作品 0
海淀
高级程序员
私信 提问
加载中

评论(4)

华兹格
华兹格 博主

引用来自“owen1989”的评论

我是李磊额

哈哈。。原来给我灌水来了!
小克898
小克898
我是李磊额
华兹格
华兹格 博主

引用来自“owen1989”的评论

很有道理,我们这边开发也是post请求居多,get请求一般参数也进行了加密或 encodeURI()

这是从书本上摘抄下的内容,都是我们平时设计时的细节!看过之后,对我的触动很大,也让我在做WEB开发时时刻注意WEB安全!
很高兴您能关注这篇博客!想必贵公司在开发上对细节也十分注重吧,有没有更详细的最佳实践?多多分享给大家哈!
作为普通程序员,虽然知道Get请求有潜在的危险,但使用<a href="..."....</a>几乎成为了习惯!为了加强WEB安全性,就需要对现有的潜在威胁进行迭代。如何从 超链接 到 From表单 就成了我们必须要思考的问题了!
贵公司在使用Get请求时,对参数进行加密或encodeURI()仅是起到保护、隐藏WEB内部逻辑的作用吧,实际上仍无法避免“类网络加速器”这样的客户端脚本访问吧。
小克898
小克898
很有道理,我们这边开发也是post请求居多,get请求一般参数也进行了加密或 encodeURI()
jQuery中$.get、$.post、$.getJSON和$.ajax的用法

1、$.get $.get()方法使用GET方式来进行异步请求,它的语法结构为: $.get( url [, data] [, callback] ) 解释一下这个函数的各个参数: url:string类型,ajax请求的地址。 data:可选参数,...

本杰明刘能
2016/11/03
11
0
PUT 还是 POST ?

创建,更新与HTTP幂等性 构建基于REST API的开发者对于何时使用HTTP PUT与POST有很大的误解与困惑。有些人认为POST 应用于创建资源,而PUT则用于更新资源。其他人则认为PUT用于创建而POST用于...

pseudo
2014/08/21
3.4W
83
fetch是什么?写一个fetch请求

之前看PWA时,知道它使用的技术包括了,然后就是把这些概念简单的记住,再多就不知道了。今天再看看这个api,了解它的最好方法就是手写出来。 Fetch API 提供了一个 JavaScript接口,用于访问...

ceido
2018/09/07
0
0
nodejs express

ejs 的标签系统非常简单,它只有以下三种标签: <% code %>:JavaScript 代码。 <%= code %>:显示替换过 HTML 特殊字符的内容。 <%- code %>:显示原始 HTML 内容。 req解析 req.body: 就是...

SKYCOBS
2016/02/20
66
0
SpringBoot +spring security 与CSRF有关的几个 问题

1、问题 开启 csrf 后 列表页面没有数据 页面console.log(403) 2、科普 首先,科普一下,什么是"CSRF"? 这是一个web应用安全的问题,CSRF(Cross-site request forgery)跨站请求伪造,也被称...

douruanliang
2018/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
26分钟前
35
0
杭州哪里有开建材发票

杭州哪里有开建材发票【1.3.7 - 1.0.9.5 - 5.9.1.9.】李生,,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridge,是And...

143770
30分钟前
48
0
Java @Deprecated Annotation(注解)

在本部分的快速指南中,我们将会查看 Java 的 deprecated API 和如何在程序中使用 @Deprecated 注解。 @Deprecated Annotation(注解) 作为程序的进化和迭代,随着时间的推移,在项目中总会...

honeymoose
48分钟前
29
0
郑州开纸制品发票

郑州开纸制品发票【132 * 50 52 * 90 89】罗生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

zhangyongli
今天
65
0
OSChina 周四乱弹 —— 失业后的阳光太刺眼了

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @大又 :分享Jack Stauber的单曲《Fighter》 《Fighter》- Jack Stauber 手机党少年们想听歌,请使劲儿戳(这里) @theLovelyBugfly :笑死我...

小小编辑
今天
146
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部