GET/POST请求的合理使用

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

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

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

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

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

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


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

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

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

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

     (4)不要觉得只有登陆用户权限控制就能确保安全,虽然爬虫机关用尽,但客户端程序(如google的网络加速器 )仍然能够。

   

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


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

附:get/post 区别 google

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方法好。 

建议:
一、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
二、在作数据查询时,建议用Get方式;而在作数据添加、修改或删除时,建议用Post方式;
相关文章
相关标签/搜索