X.d 笔记

小Web,大世界

0%

HTTP小结之四《完结》:URL,Cookie

整理一下HTTP的基础知识:(四):URL,Cookie

最后说下URL和Cookie可能你说还有session,但标准上来说是没有定义session,只不过服务器软件形成了共识,都做了Session机制。

简单点说就是基于一个Cookie,做为KEY,然后存放一些数据到里面。这样也方便去取。

URL

URL的
格式为:protocol :// hostname[:port] / path / [;parameters][?query][#fragment]

  • Protocol 协议
  • Hostname 主机名
  • Port 端口
  • Path 路径
  • Parameters 选项
  • ?query 查询
  • #fragment 片段(书签)

这里简单写个javaScript表达式方法测试是不是HTML的URL(没太多验证,COPY需谨慎)

function execUrl(url){
    var rtn = false;
    var strRegex = "^(https://|http://)"
        + "([^:/]+)"
        + "(:[0-9]{1,4})?"
        + "([^?#]*)"
        + "([^#]*)"
        + "(.*)$";
    var regUrl = new RegExp();
    regUrl.compile(strRegex);
    if (regUrl.test(url)) {
        rtn={
            'protocol':RegExp.$1,
            'host':RegExp.$2,
            'Port':RegExp.$3,
            'Path':RegExp.$4,
            'query':RegExp.$5,
            'fragment':RegExp.$6
        }
    }
    return rtn;
}
//test
console.log(execUrl("http://www.xdnote.com:80/js5/main.php?sid=DDKQwEHHSYSSdxkkyYHHHAdmHFGOezJD#module=outlink"));

很多时候老区分不出URL和URI有什么区别,每次都要用什么getRequestURL,getRequestURI都去试试才知道URI比URL少一截,但又不包括后面的,其实打个比方,URL就是你要的东西,URI就是服务器要的东西。

一个URL如下 https://www.xdnote.com/tag/java/?xxxx#yyyy 这就是你要的,前面的https://www.xdnote.com/对服务器没用,你可以绑N个域名到服务器,服务器不care。后面的?xxxx#yyyy对服务器也没用(只是对你自己写的Web应用有用)所以服务器的URI只是一个路径/tag/java/通过这个路径可以找到资源。

Cookie是HTML的标准,就是访问HTML的时候,出于程序上的方便,存储一点数据到Cookie里面,各个浏览器里面的Cookie存的地方都不一样,所以数据不是通用的。

盗Cookie这种行为一直都存在,当提到盗Cookie追踪,国内的用户当然会不以为然,大不了在网页上有几个广告呗,都习惯了,而且有追踪Cookie的网站打的广告而且更加适合个人口味。其实不以为然,广告厂商盗Cookie是为了精准广告,而黑客来盗什么Cookie,因为很多网站把用户登录信息都放大Cookie里面,比如有个“XX时间内自动登录”这种功能,就是往Cookie里面存一个加密串,后续再打开这网站时服务器会把这个加密串解密并登录,于是黑客只要知道你的加密串是什么就可以登录你的帐号了。

顺带一提,盗Cookie说来还是有一点点技术含量,前些年本人去开发的一个项目发现用户帐号/email,密码等都明文存在数据库,本来CSDN也这么样没什么,无意间,发现个别员工直接用SQL客户端连到现网服务器看别人的密码然后一个一个在支付宝或其它网站上试,甚至有技术人员做了个工具去导出有效帐号和生效网站,当时那个网站有十万级别的用户注册,测试结果大部分都可以成功登录-_-!,因为现在需要注册的网站太多,每个人去注册时为了方便基本都使用同一个帐号/email/密码。

想一下,CSDN都明文存密码,那国内明文存密码的网站多了去了,在国内只要有利益驱使,什么事干不出来,你敢说我没中木马,也没下载东西,只是去一个网站注册了个帐号,然后第二天发现我其它网站的密码都被人破解了,更气的是你即使知道是中了服务器的招,也不知道是那个垃圾网站的技术人员黑了你。而且现在即使是MD5加密也不够狠了,目前国内还出了个MD5库的网站,每天自已遍历各种组合存到数据库,虽然破不了,但我强大的库能查到,反正就是不安全,建议少去小网站注册用户,如果真要注册,不要用常用的密码,目前各大平台都出了outh2登录,这个不错,可以用QQ,微博帐号登录其它网站,安全方便,不过很多小网站会例行让你再创建个账号完成“绑定”,这时你可以随便输入,不要用常用的帐号密码,后续要登录时用QQ或微博登录就行了。主要是现在开个网站的成本实在太低了,防人之心不可无。

还是回到正题。
传播木马,窃听插件,代理,脚本盗取,前几种都是意思问题就不说了,这里说说脚本的方式。
比如你开了个A网站,然后网络上有个B网站,B网站的其中一个页面有XSS漏洞,不得不说,现在发现有XSS漏洞的网站奇多,而且用工具一扫就知道哪个页面有这个漏洞参数如何,那A就可以在页面上搞一个隐藏的脚本指向B站的那个漏洞页面,然后B站页面自动载入后会运行A站的脚本,由于是在B站运行的,所以B站的Cookie就有权限可以发到A站的服务器了,所以只要浏览了我的A站的用户,无一幸免的都会自动浏览B站,如果你刚好在B站的Cookie里面记录了好东西的话,就乖乖的被你的A站拿到了,关键是用户对此一无所知。

当然这只是技术手段,非技术手段都可以,比如你装什么360、搜狗、遨游、QQ什么的浏览器,个人就很难保证这些厂商的人品了,用户数据是他们竞争同行的关键,你想想平时的上网信息会不会被他们来个挖掘什么的?

哦,我好像说了很多不该说的,回到技术吧。
Cookie里面有个httpOnly属性,设置了这个属性的,就只有服务器端能读取了,使用js脚本读取不了,可惜的是tomcat6只能设置自身的jsessionid其它的不能设置。Cookie主要有name,value,domain,path,expire,secure,httponly属性。expire为负数时表示会话完就失效。

这里再提供下使用javaScript读写Cookie的代码。

function getCookie(name)
{
if (document.cookie.length>0)
  {
  start=document.cookie.indexOf(name + "=")
  if (start!=-1)
    {
    start=start + name.length+1 
    end=document.cookie.indexOf(";",start)
    if (end==-1) end=document.cookie.length
    return unescape(document.cookie.substring(start,end))
    }
  }
return ""
}
function setCookie(name,value,expiredays)
{
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays)
document.cookie=name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}

服务器端一般使用Session存数据,实际上Session也是基于Cookie才能实现,刚才说的tomcat自动生成的JSESSIONID就是存在Cookie里面做为Session标识。