GET/POST请求的合理使用
GET/POST请求的合理使用
hanzhankang 发表于5年前
GET/POST请求的合理使用
  • 发表于 5年前
  • 阅读 305
  • 收藏 7
  • 点赞 0
  • 评论 4

新睿云服务器60天免费使用,快来体验!>>>   

   在我们求职之初,可能都会被问到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
粉丝 155
博文 161
码字总数 82578
评论 (4)
小克898
很有道理,我们这边开发也是post请求居多,get请求一般参数也进行了加密或 encodeURI()
hanzhankang

引用来自“owen1989”的评论

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

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

引用来自“owen1989”的评论

我是李磊额

哈哈。。原来给我灌水来了!
×
hanzhankang
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: