文档章节

GET/POST请求的合理使用

hanzhankang
 hanzhankang
发布于 2012/10/29 17:33
字数 1392
阅读 323
收藏 7
点赞 0
评论 4

   在我们求职之初,可能都会被问到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
nodejs express

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

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

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

douruanliang
05/15
0
0
微信公众平台开发问题请教

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

Lucare
2016/05/31
239
6
关于 HTTP GET/POST 请求参数长度最大值的一个理解误区

刚看到群里又有同学在说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过 XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹的博客或者书籍, 导致一种理解上...

大数据之路
2013/06/09
0
3
GET和POST到底啥区别???

最普遍的答案 我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的。 可能很多人都已经猜到了,他要的答案是: GET使用URL或Cookie传参。而POST将数...

一生只为虞美人
07/12
0
0
REST风格的原则

一个好的RESTful API,应该具备以下特征: 这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览...

吞吞吐吐的
2017/09/13
0
0
jemter简单的测试计划

测试计划一 1)测试网站:http://www.geneedu.cn/和http://supu01.1688.com/ 2)测试目的是该网站在负载达到20 QPS 时的响应时间。 备注: QPS : Query Per Second 每秒查询率。是一台查询服...

蓝蝶飞扬
2015/12/15
499
0
把“通过HTTP请求获取数据”封装成工具类是否合理?

目前有一个需求,需要访问第三方的数据接口 系统中已经存在了一个实现比较粗糙的工具类,可以通过类似 XXXUtil.get("http://oschina.net")或者XXXUtil.post("http://oschina.net",paraMap)的...

TiMoLove
2015/07/26
508
4
性能测试-jmeter简单实例

上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢。这一节创建一个简单的测试计划来使用这些元件。该计划对应的测试需求。 1)测试目标网站是fnng.cnblogs.co...

邵琼
2017/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部