文档章节

GET/POST请求的合理使用

hanzhankang
 hanzhankang
发布于 2012/10/29 17:33
字数 1392
阅读 328
收藏 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方式;

© 著作权归作者所有

共有 人打赏支持
hanzhankang

hanzhankang

粉丝 158
博文 220
码字总数 82578
作品 0
海淀
高级程序员
加载中

评论(4)

hanzhankang
hanzhankang

引用来自“owen1989”的评论

我是李磊额

哈哈。。原来给我灌水来了!
小克898
小克898
我是李磊额
hanzhankang
hanzhankang

引用来自“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
8
0
fetch是什么?写一个fetch请求

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

ceido
09/07
0
0
nodejs express

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

SKYCOBS
2016/02/20
40
0
微信公众平台开发问题请教

做过微信公众平台开发的同学,可否告知下,在我的后台系统中,要接入微信平台的管理,例如用户管理,素材管理等等,调用微信提供的接口,我目前是通过前台页面对后台发起异步请求,然后在后台...

Lucare
2016/05/31
239
6
SpringBoot +spring security 与CSRF有关的几个 问题

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

douruanliang
05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

df和du命令 磁盘分区

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 df 命令 查看系统磁盘空间使用情况 常用参数 -h (human-readble) # 人性化的为空间大小转换单位显示[root@centos7 ~]# df -h文件系...

robertt15
37分钟前
3
0
【a&sAI创新】华为CloudIVS轻量云:借力打力,四两拨千斤

[摘要] 1、测评表现就目前来说,AI的门槛还是比较高的,业内所熟知的算法企业,为了追求算法的极致,比如人脸识别公司,仍在不断扩大研发...   1、测评表现   就目前来说,AI的门槛还是比...

yizhichao
54分钟前
2
0
安卓安装APK报错error: INSTALL_FAILED_UPDATE_INCOMPATIBLE

记录一个 DELETE_FAILED_INTERNAL_ERROR Error while Installing APK问题 之前遇到这个问题 方案1 将data/data/目录下该应用的包名的目录删除掉,如:adb shell rm -rf data/data/com.demo.h...

切切歆语
55分钟前
1
0
用网关zuul时,熔断hytrix里面的坑

1,zuul 默认的隔离级别是信号量,默认最大隔离信号量是100 信号量隔离和线程池隔离的区别如下: https://my.oschina.net/u/867417/blog/2120713 默认设置: 2,zuul里隔离是按服务隔离的,也...

爱吃大肉包
55分钟前
0
0
使用SSM+Solr优雅的实现电商项目中的搜索功能

在学习了Redis&Spring-Data-Redis入门和Solr&Spring-Data-Solr入门后,接下来就该是项目实战了。这次我们用Vue.JS和ElementUI写前端页面,优雅的整合SSM-Shiro-Redis-Solr框架。 手摸手教你优...

TyCoding
55分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部