利用Node.js实现模拟Session验证的登陆

1.身份验证和用户登陆


在一般的Web应用上,假设要实现用户登陆,最经常使用,也是最简单的方法就是使用Session,主要的思路是在Session中保留一些用户身份信息,然后每次在Session中取,假设信息不对或不存在,那么身份验证失败,正确则成功。

Session和Cookie是两个非常相似的东西,都是字符串,仅仅只是Session是保存在server上的,而Cookie是保存在本地的,所以Cookie是不能用作身份验证的。Session故名思议,肯定和client与server间建立的会话相关,Session的工作过程也是如此,每当client和server上的一个网站建立了会话后,就会生成Session在server上,仅仅只是Session里有没有相关的信息,就要看用户的提交操作了。

Session的区分是依照server给的SessionID来进行的,不同种类的serverSessionID不同,下面列举几种SessionID:

①使用ASP.NET的IISserver:ASP.NET_SessionId

②使用Java的Tomcatserver:JSESSIONID

利用Session进行的身份验证过程:

开启了Session支持的server在client開始会话的时候,生成一个SessionID,而且在响应(Response)头(Headers)中的Set-Cookie字段设置一个Cookie,Cookie的内容就是SessionID和Cookie的路径(path),在后继的会话中,client浏览器会自己主动附上Set-Cookie中的SessionID以向server表明身份,server依据SessionID在自己的存储中查找相关用户信息,并完毕验证过程。

那么用户登陆的过程也就是用户对server提交username、password等信息,获取SessionID的过程。


2.怎样模拟实现用户登陆


模拟用户登陆,不是为了进行暴力破解,而是为了越过某些站点的身份验证,然后获取所需信息,就比方说学校的图书馆,假设在程序中想要获取读者的借阅信息,由于程序不会像浏览器那样自己主动带上SessionID,那么就必须将username和password提交至server,获得到SessionID以后,对后继的请求带着SessionID去请求其它页面,才干获取到借阅信息,大致流程例如以下:


3.Node.js中的详细实现


我在Node.js中使用了request包来简化请求操作,当然,用原生的http包也是没有问题的,为了开发效率,还是採用一些npm包为好,话不多说,先上代码

    request(
        {
            url: 'http://222.24.3.7:8080/opac_two/include/login_app.jsp',  //请求的URL
            method: 'POST',  //POST方式请求
            encoding: null,  //因为Node默认是UTF-8,而图书馆用的GB2312,所以不进行转码
            headers: {  //请求头的设置
                ContentType: 'application/x-www-form-urlencoded'
            },
            form: {  //请求体,參数
                login_type: 'barcode',
                barcode: username,  //提交用户名
                password: password,  //提交密码
                _: '' //其它參数
            }
        },
        function (err, res, body) {   //接收回调
            body = iconv.decode(body, "GB2312");  //转码
            //console.log(body);
            session = res.headers['set-cookie'];  //获取set-cookie字段值
            //console.log(session);
            if (body == 'ok') {
                callback({Result: true, Session: session});
            }
            else {
                callback(false);  //回调
            }
        }
    );
上面的代码是一个用户登陆的请求演示样例,採用了URL转码的參数提交方式,提交username与password给server,server是西邮图书馆的借阅信息查询网站。当中3~15行为请求的构建,包括请求头、请求体(參数),详细的写法请參见request的官方文档。
后面的回调函数用于接收server回传的响应,当中就有我们须要的SessionID。
接着,我们来看怎样带上SessionID进行后继的请求
request
(
    {
        uri: 'http://222.24.3.7:8080/opac_two/reader/jieshulishi.jsp',  //构建请求
        encoding: null,  //不转码
        headers: {
            Cookie: session  //这里是关键,设置Cookie为之前请求到的以Cookie形式呈现的SessionID
        }
    }, function (err, res, body) {  //获取响应就可以
        if (err) {
            callback('Server Error');
        }
    }
);
上面代码中,最关键的就是6~8行中,对请求头的设置,也是对Cookie的设置,这里必须设置为传递username及password进行登陆后返回的内容为SessionID的Cookie,不管是什么站点,仅仅要採用Session进行身份验证,就能够使用这样的方式从程序中,模拟用户数据的提交,从而获取须要身份验证页面的信息。
我们仅仅要在响应中对body的内容进行分析,就可以抓取HTML中的信息,Node.js真是方便!

posted @ 2014-09-08 11:22  hrhguanli  阅读(1910)  评论(0编辑  收藏  举报