- 以下都是基于STM32处理器,uIP协议栈,在uCOS-II操作系统下,有关uIP的移植请看之前的文章。
- 在做web网页的时候,发现如果知道某个网页名就很容易绕过登陆。当然可能在登陆成功后设置标志位,然后再每次更新网页时都验证一下标志位,但是如果登陆成功后有另一个请求网页的话也就不需要验证了。成熟的web服务器一般都是采用session技术,在这里我只是实现了简单的cookie。
- 先来简单了解一下浏览器是怎么请求网页的,也就是http报文格式。网络上应该有很多这方面的,我只是简单抓包看了一下
- 请求IP,实际上就是通过80端口请求TCP服务器端,这些报文也都是按格式通过TCP协议发送的。
- 接着web服务器就要返回HTTP/1.0 200 OK表示成功,Server是说明用的uIP的协议栈,当然也可以改成其他,这些都存在一个数组里http_header_200。
- 然后web服务器发送Content-type: text/html来告诉浏览器接下来的数据是什么类型的。之后就是html网页的输出了(其实就是转换成ascii码通过tcp发送出来)。然后浏览器会请求一下网页的图标,如果没有web服务器会发送404(这也是在一个数组里)。
- 基本上一个网页从请求到显示就是这么一个过程,而cookie就在这些报文里边,当然这需要web服务器主动来设置。假设输出登陆页面同时也登陆成功,这时候web服务器就要给浏览器发送cookie了,让浏览器接下来的请求都带着这个cookie。这样浏览器请求网页的时候由于没有这个cookie就不会绕过登陆了。当然最好设置cookie的生存周期只在这个浏览器打开期间,这也就类似于session了。
- 要在发送Content-type: text/html之前设置cookie,如图,我把前面记为用户名,后面的值记为密码,当然这都经过了简单的加密处理,同时只要在验证的时候解密就可以了。
- 在下次请求网页的时候,浏览器就会在报文里面带着设置的cookie,然后只要验证是否与用户名和密码一致,这样就可以避免绕过登陆页面了。
- uIP的demo里面,作者只能出了get请求方法,一般的web服务器还是会支持post方法的。post请求时的报文格式如下,从图中可以看到,表单提交的数据发在了报文的最后面,而不像get在网页名的后面(get会在url地址栏显示你输入的数据,可以考虑用框架页来简单处理一下,不过在属性中仍然可以看到,所以支持post方法还是很有必要的)。Content-Length的值也说明了后面提交的数据的长度,只要从报文中提取出表单提交的数据也就能过做下一步处理了。不过我还没有做过实验,应该通过这种方式应该就能支持post方法了。
基于uIP的web服务器中的cookie处理
最新推荐文章于 2018-06-04 22:47:20 发布