文档章节

GET/POST请求的合理使用

你来打我呀
 你来打我呀
发布于 2012/10/29 17:33
字数 1392
阅读 331
收藏 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方式;

© 著作权归作者所有

共有 人打赏支持
你来打我呀

你来打我呀

粉丝 160
博文 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
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
SpringBoot +spring security 与CSRF有关的几个 问题

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

douruanliang
05/15
0
0
关于 HTTP GET/POST 请求参数长度最大值的一个理解误区

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

大数据之路
2013/06/09
0
3

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 快捷键

快捷键图标。 官方的下载地址为:https://atlassianblog.wpengine.com/wp-content/uploads/2018/01/keyboard-shortcuts-infographics.pdf...

honeymose
50分钟前
2
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
54分钟前
3
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
5
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
4
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部