JS开发字典探测用户名或密码工具

js

用javascript开发字典探测用户名或密码工具

文章作者:翟振凯 (小琦)
作者网站:http://www.xiaoqi.net
作者论坛:http://www.tdqy.com
QQ:     22336848 53353866

实例演示
打包下载

授人予鱼,不如授人予渔。本文注重讲述作者的开发思路与程序的实现方法,目地是让大家了解一个程序的开发过程和这个程序功能的实现原理,而不仅仅是给大家提供一个这样的工具。希望看过本文后的朋友会有所收获,能和我共同分享用javascript编写程序的乐趣。
为了便于大家的理解,本程序在实现过程中,简洁的使用了多种javascript技术,并且在每一步,都有详细的注解,就算您是个WEB程序开发新手,也能比较容易理解本文,并相信本文会对您将来的WEB程序开发生涯有所帮助。

核心技术

  • xmlhttp获取数据 javascript对文本数据处理
  • javascript对数组循环读取(两种方法)
  • xmlhttp取中文值乱码转换
     

主要功能

  • 网站可用用户名探测
  • 使用用户名字典批量探测户名字
  • 用户名密码暴力破解

特色

  • 采用AJAX技术,无刷新操作、呈现结果 可以载入本地字典文件或网络字典文件 脱离后台动态语言依赖,B/S模式C/S界面,纯javascript编写功能代码,完美运行于所有IE内核浏览器 实时显示探测结果,探测进度,成功结果与失败结果分开显示 支持暂停探测和继续探测
  • 代码简洁仅1K
  • 支持多线程探测,可设定缓冲时间

开发思路及原理

一、基本探测

  • 用xmlhttp向被探测页面地址发送要探测数据
  • 对xmlhttp返回值进行判断
  • 将判断结果以追加的方式呈现在页面上

二、批量探测

  • 用xmlhttp载入字典文件
  • 用javascript将字典文件以换行符(\r\n)为分隔,转化为数组
  • 按照字典数组顺序循环向探测地址发送数据并且对返回数据进行判断处理

三、功能强化

  • 取得字典数组大小(即:要探测的次数),返回给用户 将探测次数依次累加,呈现给用户当前探测进度 设定探测进程,即:每探测多少个数据,才向用户返回一次结果
  • 设定缓冲时间,即:设定探测时间间隔,防止浏览器在大数据量探测时停止响应
  • 探测暂停或继续探测

四、开发背景

前些天,想在百度空间上注册一个简短而又有意义的用户名,发现自己喜欢的很多用户名都被占用了,而进行一个个的手工用户名探测又太麻烦了。
因为我是一个喜欢运用自己掌握的技术来解决问题(或困难)的人,于是就写了这个程序。
为了使它给使用起来比较方便,也为了让它更加实用,我又在它的通用性上做了些加强。
比如:
可以探测大部分不需要验证码检测用户名是否被占用的网站。
可以探测一些网站用户的密码。
可以探测一些网站用户的密码取回问题。
可以向WEB服务器批量提交指定数据

起初我是用ASP脚本来实现的,但ASP程序只能运行于支持ASP的WEB服务器上,无法直接在浏览器上执行,使用起来没有那么方便,于是就写了这个javascript的版本的程序。

五、实现过程

1、使用try-catch异常处理创建XMLHTTPRequest对象

//尝试用IE浏览器的方式创建XMLHttpRequest对象
var xmlhttp = null;
try
{
    xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); 
}
catch(e)
{
    try
    {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch(e){
        alert("您的浏览器不能创建XMLHttpRequest对象,无法使用此程序!");
    }
}
//尝试用IE浏览器的方式创建XMLHttpRequest对象结束

/*
翟振凯注:MSXML2.XMLHTTP 和 Microsoft.XMLHTTP 都是微软的XMLHTTP控件,只是版本不同。
         IE的安全级别如果不是太高,微软的XMLHTTP控件是可以跨域获取数据的。
         因为 Mozilla Firefox 浏览器的 XMLHttpRequest() 不能跨域获取数据,我们就不用 XMLHttpRequest() 方法创建XMLHTTP对象了。
*/

2、对返回的中文编码处理

//对返回的中文编码处理
function Rec_Html(Html)
{
        var Rec=new ActiveXObject("ADODB.RecordSet");       
        Rec.Fields.Append("DDD",201,1);       
        Rec.Open();       
        Rec.AddNew();       
        Rec(0).AppendChunk(Html);       
        Rec.Update();       
        return Rec(0).Value;
        Rec.Close();
}
//对返回的中文编码处理结束

3、检查判断依据中是否需要中文编码处理

if(err.value.replace(/[^\W]/g,'').length=0)
//用正则替换掉任何非单词和数字字符后,如果值大于0,说明判断依据中可能含有中文或其它字符,就进行编码转换。
{
    Html=xmlhttp.responseText;//不转换
}
else
{
    Html=Rec_Html(xmlhttp.responseBody);//转换
}

4、进行探测,对结果进行判断并输出

//开始探测 参数为要探测的当前值
function geturl(id)
{
try{
        xmlhttp.open("GET",url.value+id,false);//定义数据传送方式,服务网页的URL(探测地址+探测值),是否同步执行
        xmlhttp.onreadystatechange = function() {//xmlhttp 触发事件

          if(xmlhttp.readyState==4)//xmlhttp对象状态如果为完成
          {  
          if(xmlhttp.status==200)   //如果服务器返回的状态码为200(成功)
          { 

                 //对结果的中文编码转换判断
                 if(err.value.replace(/[^\W]/g,'').length=0)
                 /*关于转换判断的注:
                   例如:"翟振凯".replace(/[^\W]/g,'').length          返回结果 3
                        "翟振凯22336848".replace(/[^\W]/g,'').length  返回结果 3
                        "xiaoqi22336848".replace(/[^\W]/g,'').length  返回结果 0
                        "小琦22336848".replace(/[^\W]/g,'').length    返回结果 2
                   replace(/[^\W]/g,'')的功能是把字符串里的英文和数字都清除掉。
                  */

                    {
                          Html=xmlhttp.responseText;//不转换
                    }
                 else
                   {
                          Html=Rec_Html(xmlhttp.responseBody);//转换
                    }
                 //对结果的中文编码转换判断结束

                                       
                 // 根据判断依据区分可用或不可用的值!
                 if(Html.indexOf(err.value,0)<0)
                   {
                          x_1.innerHTML=x_1.innerHTML+"<nobr> "+id;//输出可用值
                   }
                 else
                   {
                          x_2.innerHTML=x_2.innerHTML+"<nobr> "+id;//输出不可用值
                   }
                 // 根据判断依据区分可用或不可用的值!
          }  
          }  
          } 
        xmlhttp.send();
          } 
catch(e) 
{
x_2.innerHTML=x_2.innerHTML+"<nobr> "+id+"超时!";//输出异常或超时的值。
}       
}
//开始探测结束

5、载入字典文件,并把内容定义为数组

//载入本地字典文件,并把内容定义为数组
function kaishi(){
        fileFullPath=dic_url.value;
        xmlhttp.open("GET",fileFullPath,false);//载入字典文件方法
        xmlhttp.send();

        Html=Rec_Html(xmlhttp.responseBody);//中文编码转换       
        dic=Html.split('\r\n');//以换行符将载入的字典内容转换为数组   
        sl.value=dic.length;//告诉用户要探测的次数(数组大小)

xunhuan()//成功载入后开始循环探测。
}
//载入本地字典文件,并把内容定义为数组结束

6、循环探测

//循环探测
function xunhuan()
{
        bar=parseInt(jd.value);//将进度值转换为整数
        if(bar<sl.value)//判断是否探测完
        {
                for(i=0;i<parseInt(jc.value);i++){//设定探测线程
                        geturl(dic[bar+i]);//从数组内取值进行探测              
                }
          
                jd.value=bar+parseInt(jc.value);//累加探测进度,并向用户呈现当前进度
                setTimeout("xunhuan()",parseInt(hc.value*1000));//根据缓冲时间来进行重复循环探测       
        }
        else//如果进度不小于要探测的次数,就向用户返回探测完成的结果。
        {
                alert("探测完成!");
        }
}
//循环探测结束

7、为了使用方便,增加一个暂停的功能

//暂停探测函数
function pause(obj)
{
        if(obj.value=='暂停')
                {
                obj.temp=hc.value;//记忆原来的缓冲时间。
                hc.value=5000;//将缓冲时间设置为5000秒,这个值自己可以修改。
                obj.value='继续';//改变按钮显示状态
                }
        else
                {
                hc.value=obj.temp;//提取原来的缓冲时间。
                obj.value='暂停';//改变按钮显示状态
                kaishi()//继续探测
                }
}
//暂停探测函数结束

8、在开始探测前先执行排错验证

function ck()//单个值探测验证检查
{
    if (url.value.length<5){alert('请输入要探测地址!');return};
    if (id_one.value.length<1){alert('请输入要探测的值!');return};
    geturl(id_one.value)
}

function ck1()//批量值探测验证检查
{
    if (url.value.length<5){alert("请输入要探测地址!");return}
    if (err.value.length<1){alert("请输入不可用标记!");return}
    if (dic_url.value.length<5){alert("请先选择字典文件!");return}
    jd.value=0;
    kaishi()
}

9、程序介面

<html>
<body>
<p>
程序作者:翟振凯   QQ:22336848   开发日期:2006年8月 <br>
网站:<a href="http://www.xiaoqi.net">http://www.xiaoqi.net</a>  
程序打包下载地址:<a href="http://www.xiaoqi.net/zuopin/js_user.rar">http://www.xiaoqi.net/
zuopin/
js_user.rar</a>
</p>
<fieldset >
<legend>探测设置</legend>
<table border="1" width="100%" bordercolorlight="#E6E6E6" cellspacing="0" bordercolordark="#D4D0C8">
<tr>
<td>探测地址</td>
<td>
<input type="text" id="url" size="63" value=""></td>
</tr>
<tr>
<td>失败包涵标记 </td>
<td><input type="text" id="err" size="63" value=""></td>
</tr>
<tr>
<td>测试单个值</td>
<td><input type="text" id="id_one" size="20">
<input type="button" value="探测" > </td>
</tr>
<tr>
<td>选择字典文件</td>
<td><input type="file" name="dic_url" size="20">
<input type="button" value="开始" >
<input type="button" value="暂停" temp="" >
<input type="button" value="清除可用结果" >
<input type="button" value="清除不可用结果" >
</td>
</tr>
<tr>
<td>高级参数</td>
<td>
每次探测:<input type="text" id="jc" value="1" size="3"> 个 
缓冲时间:<input type="text" id="hc" value="0.1" size="3"> 秒 
进度:<input type="text" id="jd" value="0" size="12"> 
探测数量:<input type="text" id="sl" size="13">
</td>
</tr>
</table>
</fieldset>

<fieldset>
<legend>可用值:</legend>
<div style="height:100px;width:100%;overflow:auto;"><span id="x_1"></span></div></fieldset>

<fieldset>
<legend>不可用值:</legend>
<div style="height:100px;width:100%;overflow:auto;"><span id="x_2"></span></div>
</fieldset>

</body>

</html>

六、参考资料

1、使用try-catch-finally处理异常

用户可以使用该结构处理可能发生异常的代码,如果发生异常,则由catch捕获并进行处理,其语法如下:

try{
//要执行的代码
}
catch(e){
//处理异常的代码
}
finally{
//无论异常发生与否,都会执行的代码
}

通过异常处理,可以避免程序停止运行,从而具有了一定的自我修复能力。
在Ajax开发中,利用异常处理的一个典型应用就是创建XMLHttpRequest对象,不同浏览器创建它的方式是不一样的,为了使代码能够跨浏览器运行,就可以利用异常,一种方法不行,再用另一种方法,直到不发生异常为止,例如:

<script language="JavaScript" type="text/javascript">
<!--
var xmlhttp;
try{
//尝试用IE浏览器的方式创建XMLHttpRequest对象
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
try{
//尝试用非IE浏览器的方式常见XMLHttpRequest对象
xmlhttp=new XMLHttpRequest();
}catch(e){}
}
//-->
</script>

2、Append 方法

Append 方法
将对象追加到集合中。如果集合是 Fields,可以先创建新的 Field 对象然后再将其追加到集合中。
语法
collection.Append object
fields.Append Name, Type, DefinedSize, Attrib
参数
collection 集合对象。
fields Fields 集合。
object 对象变量,代表所要追加对象。
Name 字符串,新 Field 对象的名称,不得与 fields 中的任何其他对象同名。
Type DataTypeEnum 类型,其默认值为 adEmpty。新字段的数据类型。
DefinedSize 可选,长整型,指示新字段的定义大小(以字符或字节为单位)。该参数的默认值源于 Type (默认的 Type 为 adEmpty,默认的 DefinedSize 未指定)。
Attrib 可选,FieldAttributeEnum,其默认值是 adFldDefault。指定新字段的属性。如果该值未指定,字段将包含源于 Type 的属性。

3、XmlHttpRequest对象属性

onreadystatechange
每次状态改变所触发事件的事件处理程序
readyState
对象状态值:
0 = 未初始化(uninitialized)
1 = 正在加载(loading)
2 = 加载完毕(loaded)
3 = 交互(interactive)
4 = 完成(complete)
responseText
从服务器进程返回的数据的字符串形式
responseXML
从服务器进程返回的DOM兼容的文档数据对象
status
从服务器返回的数字代码,比如404(未找到)或200(就绪)
statusText
伴随状态码的字符串信息

时间: 2024-08-04 04:45:18

JS开发字典探测用户名或密码工具的相关文章

javascript字典探测用户名工具_javascript技巧

<html> <head> <style> body         { font-size: 10pt; background-color:#D4D0C8 } td           { font-size: 9pt } </style> </head> <script language="javascript"> /* 程序标题:javascript字典探测用户名工具 发布时间:2006年8月 文章作者:翟振

IOS9开发如何保存用户名与密码

问题描述 IOS9开发如何保存用户名与密码 登录界面时候,驶入了用户名与密码,勾选记住密码后,下次登录时不需要再次输入用户名与密码,或者直接跳过登录页面,谢谢! 解决方案 Android开发中如何保存用户名密码在本地 解决方案二: NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@""用户名"" forKey:"&qu

js使用cookie记住用户名与密码的实例

js如何设置一个全站都能使用的cookie来记住用户名,记住访客的信息,方便访客下次的操作.js设置一个cookie网上有很多资料,但是只能在同目录下使用,其他地方就失效了.设置全局cookie只需加一个参数即可. 把 document.cookie=c_name+ "=" +escape(value)+ ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())改成 document

app-iOS开发中如何将用户名和密码传入APP嵌入的H5页面中

问题描述 iOS开发中如何将用户名和密码传入APP嵌入的H5页面中 现在有个问题就是:iOS开发的APP中使用Webview嵌入了H5页面, 如何将APP中的用户名和密码传入H5页面中,从而实现H5页面不需要再次重新输入用户名和密码,实现H5页面中的用户名和密码与APP中的用户名和密码一致,从而实现一系列操作. 目前小白,对于H5页一点不懂,最好能说的详细点. 解决方案 建议 不要使用 用户名密码,如果是需要鉴权,可以使用传ticket 在java中写个方法,给H5页面 上的js那边调用,方法里

js里写一个当前页面弹出登陆框,用来输入用户名和密码并传到另一个页面的方法,求相助!

问题描述 js里写一个当前页面弹出登陆框,用来输入用户名和密码并传到另一个页面的方法,求相助! 解决方案 纯js拼页面--那就在table外面拼个form,加上action等属性 form里再加submit的input点击input,form直接提交到后台,自己后台处理跳转:想直接跳,那就js拿到用户名和密码,直接url带参数传过去window.location.href=""跳转页面?用户名=值&密码=值""

javascript-关于js判断用户名和密码的问题

问题描述 关于js判断用户名和密码的问题 遇到一个问题,就是判断用户名和密码里面判断不为空的条件怎么写,我用了两种判断 方法,分别遇到两个不同的问题. 第一个是第三方登录时,调到登录界面,需要点击确认才能提交表单,不能直接进入 $(function() { var username = $('#username').val(); var password = $('#password').val(); if( !username && typeof(username)!="und

IOS开发使用KeychainItemWrapper 持久存储用户名和密码_IOS

首先从官网下载 KeychainItemWrapper.h KeychainItemWrapper.m 将这两个文件导入项目中 不过该文件是手动释放的 所以要使用这个文件需要先做一些处理: 如果要使用KeychainItemWrapper.h类 在CompileSources中选中该类 添加-fno-objc-arc 接下来直接上代码: KeychainItemWrapper *keychain=[[KeychainItemWrapper alloc] initWithIdentifier:@"

js判断登陆用户名及密码是否为空的简单实例_javascript技巧

js判断登陆用户名及密码是否为空的简单实例 <script type="text/javascript"> // 验证输入不为空的脚本代码 function checkForm(form) { if(form.username.value == "") { alert("用户名不能为空!"); form.username.focus(); return false; } if(form.password.value == "

js检测用户名与密码是否正确

本文章是一款简单的javascript检测用户名与密码是否正确的函数哦,如果你是js初学者的话可以看看这段代码哦. <script language='javascript'> function xgjc(yhm,mm,xmm,qm) {  if(yhm=="")  {   alert('用户名不能为空!');   document.de.yhm.focus();   return false;  }  if(mm!=xmm)  {   alert('两次输入密码不一致!'