}
public object Eval(string expression, string codeBody)
{
msc.AddCode(codeBody);
return msc.Eval(expression);
}
public object Eval(ScriptLanguage language, string expression, string codeBody)
{
if (this.Language != language) this.Language = language;
return Eval(expression, codeBody);
}
public object Run(string mainFunctionName, object[] parameters, string codeBody)
{
this.msc.AddCode(codeBody);
return msc.Run(mainFunctionName, parameters);
}
public object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody)
{
if (this.Language != language)
this.Language = language;
return Run(mainFunctionName, parameters, codeBody);
}
public void Reset(){this.msc.Reset();}
public ScriptLanguage Language
{
get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
set { this.msc.Language = value.ToString(); }
}
public int Timeout {get { return 0; }}
public bool AllowUI
{
get { return this.msc.AllowUI; }
set { this.msc.AllowUI = value; }
}
public bool UseSafeSubset
{
get { return this.msc.UseSafeSubset; }
set { this.msc.UseSafeSubset = true; }
}
private void OnError(){if (RunError != null) RunError();}
private void OnTimeout(){if (RunTimeout != null) RunTimeout();}
private void ScriptEngine_Error(){OnError();}
private void ScriptEngine_Timeout(){OnTimeout();}
}
}
2 新浪微博模仿登录进程
之所以选择以新浪微博为例做模仿登录示意,是因为新浪微博登录进程环节较多及加密环节更细。
新浪微博的模仿登录验证进程主要分为以下5步操纵:
(1)首先请求微博主页获取js文件以确定client版本及加密算法;
(2)接着带上加密后的账户请求prelogin.php页面获取servertime、nonce、pubkey、rsakv、pcid、showpin等信息,以便对暗码加密利用;
(3)再请求http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)
(4)获取“新浪通行证”生存Cookie;
(5)带上Cookie,请求新浪通行证中location.replace后头的http,获取用户主页相关信息,为后续会见做筹备
具体的模仿登录进程见图1所示:
3 实现模仿登录进程中的重要环节
首先模仿登录新浪微博主页http://weibo.com/,操作FireBug就能看到,如图2所示:
复制个中一个index.js相应正文,操作JavaScript名目化东西③,将名目化功效生存为文件sina.js,个中该js文件生存了整个登录进程、ssologin.js版本、加密算法等信息。在5421行即显示的是后头client这个参数的值“ssologin.js(v1.4.11)”,如图3所示。
在微博登录框中输入账户,一旦鼠标分开文本框就是自动发送一个HTTP请求,URL为:
http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dGVzdA%3D%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.11)&_=1382411317984
虽然,需要用到模仿登录的处所还会有许多许多,碰着的贫苦或狐疑也就会许多许多,个中各类差异账户和暗码的加密算法是个中之最。下面我们以“以其人之道”的计策,提出有效办理登录进程中加密进程的办理方案,制止利用差异语言登录时需要对差异的加密算法举办移植的烦恼。
新浪腾讯微博等其他应用登录验证时,城市至少对暗码或同时账户、验证码举办一次或多次加密,加密进程无一破例地都利用JavaScript来实现,在用其他语言如Java、C#模仿登录时,较为常见的步伐就是对JavaScript的加密算法举办移植。虽然这样会显得越发直接,但在实际进程中也会碰着一些狐疑,暂不说移植的难度,对付像新浪微博这种常常改换加密算法的应用来说,就得常常移植加密算法的狐疑。假如换一个思路,直接挪用相应的JavaScript加密算法,也许维护本钱就会低落许多。下面我们就凭据这种思路,对新浪微博用C#模仿登录举办实验。
1 筹备事情
筹备事情包罗软件筹备和相应的开拓语言相关常识的相识,首先说抓包软件的选取,也许在泛泛的WEB应用开拓中,利用较多的是FireBug,也是我们容易想到的网络HTTP请求阐明东西,只是在面临有的登录验证时利用了重定向①,个中有的HTTP请求在FireBug中瞬间就被从头刷新了。所以推向利用如Fiddler之类的网络调试东西,举办整个网页登录进程的抓包,以阐明整个登录进程。Fiddler请到官方网站下载。下面的阐明进程也是操作FireBug团结Fiddler来实现的。
尚有一个必需相识的常识就是用Java或C#直接挪用JavaScript函数,对付Java挪用JavaScript,在JDK1.6插手了对Script(JSR223)的支持,假如是利用Java实现模仿登录,请查询相关的资料,这里主要是先容C#直接挪用JavaScript函数。
操作微软提供的Windows Script Control,其Microsoft(R) Script Control 是向开拓人员提供简朴要领以利用措施剧本的ActiveX(R)控件,其下载网址:
http://www.microsoft.com/zh-cn/download/details.aspx?id=1154
下载安装后,其实主要是包罗msscript.ocx在内的4个文件。其具体利用要领请拜见网上一篇名为《在C#中挪用JavaScript等剧本的实现》的文章②,其网址为:http://www.weste.net/html/200404/20040429QBI094905.html,个中对MSScriptControl的利用及从头对AxScriptControl举办封装为ScriptEngine类都举办了具体的说明,后续的新浪微博模仿登录中的账户和暗码加密也是挪用相应的ScriptEngine类的要领。其封装ScriptEngine类如下:
using System;
using MSScriptControl;
using System.Text;
namespace WinFormsAppWeibo
{
public enum ScriptLanguage
{
JScript,VBscript,JavaScript
}
public delegate void RunErrorHandler();
public delegate void RunTimeoutHandler();
public class ScriptEngine
{
private ScriptControl msc;
public event RunErrorHandler RunError;
public event RunTimeoutHandler RunTimeout;
public ScriptEngine()
: this(ScriptLanguage.VBscript)
{ }
public ScriptEngine(ScriptLanguage language)
{
this.msc = new ScriptControlClass();
this.msc.UseSafeSubset = true;
this.msc.Language = language.ToString();
((DScriptControlSource_Event)this.msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error);
((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);
如图4所示:
请求参数如图5所示:
个中su为账户“test”是用 sinaSSOEncoder.base64.encode 加密后的字符串,如图6:
请求返回功效为JSON数据名目:
sinaSSOController.preloginCallBack({"retcode":0,"servertime":1382411319,"pcid":"gz-4013138055558ead653a280f14c60f0b4fa2","nonce":"T1WU6E","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","showpin":0,"exectime":6})
请求的响应各参数的描写如下表所示:
retcode 0暗示乐成
pcid 验证码请求时传入的参数
servertime login.php登录需回传,及共同账户暗码加密
nonce login.php登录需回传,及共同账户暗码加密
pubkey 加密算法的公钥
rsakv 代表rsa加密算法
showpin 0暗示不需要验证码
showpin为1则登录需要验证码,这时就需要把pcid传入到验证码请求的参数中,请求验证码的URL为:
http://login.sina.com.cn/cgi/pin.php?r=98129622&s=0&p= gz-4013138055558ead653a280f14c60f0b4fa2
r为8位随机数,p即为上面的pcid值
首先输入错误的账户和暗码后,点击登录,以便确认提交HTTP请求的URL;只有这样才气在FireBug下看到请求的位置,其原因是乐成登录后,有一个302网页重定向,登录请求瞬间就跳过了。尚有一个步伐就是直接利用Fiddler举办抓包。下面的演示是在点击“登录”时才开始利用Fiddler举办抓包:请求的URL:
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)
具体的POST参数见图中Body部门,如图7所示:
5 总结
对付像腾讯微博、QQ空间以及webqq等的模仿登录,首先操作Fiddler对网页登录进程举办一次完整抓包,个中一个请求是对h_login_11.js的,内里就包罗对帐号及暗码的加密算法,相应的js加密函数如下:
// 对帐号加密
function uin2hex(str) {
var maxLength = 16;
str = parseInt(str);
var hex = str.toString(16);
var len = hex.length;
for (var i = len; i < maxLength; i++) {
hex = "0" + hex
}
var arr = [];
for (var j = 0; j < maxLength; j += 2) {
arr.push("\\x" + hex.substr(j, 2))
}
var result = arr.join("");
eval('result="' + result + '"');
return result
}
// 对暗码的加密
function getEncryption(password, uin, vcode) {
var str1 = hexchar2bin(md5(password));
var str2 = md5(str1 + uin);
var str3 = md5(str2 + vcode.toUpperCase());
return str3
}
在各类模仿登录中,对帐号和暗码的加密是主要重点办理的问题,不外,在实际操纵进程中,生存各个HTTP请求功效中的Cookie以及在HTTP请求头中配置好Referer、UserAgent和Cookie也是一些须要留意的细节。在每一次开始模仿登录操纵前,首先用抓包东西,对网页登录进程举办完整的相识,再实现模仿登录的进程就不是一件难事了。
参考文献:
[1]Baidu.重定向.百度百科,2013-06-10.
[2]秋枫.在C#中挪用JavaScript等剧本的实现.2004-04-29.
作者简介:鲜海(1974.12-),男,四川南部县人,开拓主办职务,工程系列中级,硕士研究生,研究偏向:现主要从事继承、网络教诲信息打点平台的开拓和研究,存眷于微博、微信的拓展应用开拓。
作者单元:西南财经大学继承(网络)教诲学院,成都 610074
注:
①重定向又称之为302即临时性转移Temporarily Moved,英文名称302 redirect,也被认为是临时重定向temporary redirect
②其作者:秋枫 宣布时间:2004-4-29 9:49:05 文章来历:CSDN
③JavaScript在线名目化:http://tool.chinaz.com/Tools/JsFormat.aspx
其详细使用方法请参见网上一篇名为毕业论文《在C#中调用JavaScript等脚本的实现》的文章②
毕业论文库:计算机 时间:2016-10-11 点击:
次