post方式相比get安全,携带数据更大,我准备所有数据都用post方式获取,这样好吗?

如题,准备spa[single page application]化, 全站的数据都用ajax调用, 然后全部用post方式提交/获取数据,这样做有什么不好吗?

阅读 47.2k
6 个回答

1、多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。HTTP是应用层的协议,而在传输层有些情况TCP会出现两次连结的过程,HTTP协议本身不保存状态信息,一次请求一次响应。对于TCP而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用GET请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。
2、GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存。
3、GET参数是带在URL后面,传统IE中URL的最大可用长度为2048字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制(目前理论上是这样的)。
4、GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制。
5、全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。

post方式相比get安全

你从哪个学校的哪个老师那里学到的这个理论?

携带数据更大

这个是对的,POST 携带数据大,而且,不仅仅是大,某些数据只能用 POST 方法「携带」,比如 file。

我准备所有数据都用post方式获取,这样好吗?

GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「等幂」的,在这一点上,GET 被认为是「安全的」。

补充一条:GET 的内容可以被浏览器缓存,而 POST 的数据不可以。

Wikipedia:

GET

Requests a representation of the specified resource. Requests using GET should only retrieve data and should have no other effect. (This is also true of some other HTTP methods.)

POST

Requests that the server accept the entity enclosed in the request as a new subordinate of the web resource identified by the URI. The data POSTed might be, as examples, an annotation for existing resources; a message for a bulletin board, newsgroup, mailing list, or comment thread; a block of data that is the result of submitting a web form to a data-handling process; or an item to add to a database.

所以get主要用来“读取”数据,而“post”主要用于修改、插入数据。

不过就你这个问题来说,用post没有什么不好的。

POST可以防止一些跨站攻击。 比如像

http://www.wooyun.org/bugs/wooyun-2010-016317
http://www.wooyun.org/bugs/wooyun-2010-024150

但是,浏览器完成一个POST请求需要消耗更多的等待和资源。 如果某个请求数据不涉及到业务安全,建议GET完成。而XSS跨站等问题,可以用动态token解决。

“滥用”POST不一定妥当:程序overhead会成大问题。

举个例子,我有一个 Objective-C CGI 库,如果 CGI 环境变量里面没有指定存在 POST 数据,库里面就直接把 stdin 关了,而不去等待数据。这样的话效率会高很多,还省内存(不用创建输入数据对象了)!

其实,亲,post数据是二段提交的!只要你和团队能适应post的各种规则,用吧,这年头乱用方法的人多了去

宣传栏