新手求如何简单识别验证码
本帖最后由 xidili 于 2023-4-15 18:25 编辑超新手啥也不会,刚开始学,求教。
网页登录需验证码,xhr获取user_auth_verify文件的响应有这个验证码,我可以直接读取这个code吗?还是如何解决比较好?
下面这个代码是能看到的js文件部分代码。
`` var code="";
// 绘制文字
for(var i=0;i <50;i++) {
ctx.fillStyle = '#86cffa';
ctx.beginPath();
ctx.arc(randomNum(0, width), randomNum(0, height),1,0,2* Math.PI);
ctx.fill();
}
var pool="abcdefghijkmnpqrstuvwxyz1234567890";
for(var i=0;i<=3;i++) {
if(captcha){
var txt = captcha;
}else{
var txt=pool;
}
code=code+txt;
//随机生成字体颜色
ctx.fillStyle = '#141046';
//随机生成字体大小
ctx.font = '22px SimHei';
var x =18 + i*14
var y = 28;
//修改坐标原点和旋转角度
ctx.translate(x, y);
ctx.fillText(txt,0,0);
ctx.translate(-x, -y);
}
/**绘制干扰点**/
return code;
}
function get_code(type){
$.ajax({
url: '../../user_auth_verify.cgi',
type: 'POST',
data: '&submit=submit',
async: false,
timeout: 30000,
success: function(data) {
if(data.verify == 1){
$('#captchaImg').show();
drawCaptcha(data.code);
if(type && type == 'adv')
$('.login-box').addClass('code_show')
}else{
$('#code_cid').hide();
$('#captchaImg').hide();
$('.code-group').css("display","none")
}
},
error:function(){
drawCaptcha();
}
})
}
window.onload = function(){
$.ajaxSetup({
beforeSend: function (XMLHttpRequest,XMLObject) {
XMLHttpRequest.setRequestHeader("HTTP_X_REQUESTED_WITH", "xmlhttprequest");
var XMLObjData = XMLObject.data,repData = '';
if(XMLObjData && XMLObjData.indexOf('%')) repData = XMLObjData.replace(/\%/g,'%25');
else repData = XMLObjData;
var obj_data = decodeURIComponent(repData);
if(/[<>\\^]|\b(sum\()|\b(cmd\|\')|(\'\s+[\s\S]*\s+\')|(\'\s+\')|(confirm\()|\b(echo\s+)|(:alert)\b|\b(eval\s*\()|\|\||\b(\or\s+[\s\S]*=[\s\S]*)|\b(and\s+[\s\S]*=[\s\S]*)|(\.\.\/)|(\$\(\.\.\/)|(window\)|(window\[\"location\"\])|(window\[\'location\'\])|(window\.location)|(\.\.\/)|(\s*<\s*img\s*)|(\s*<\s*iframe\s*)|\b(onerror\s*)|\b(sleep\s*)|\b(alert\(\s*)|\b(javascript:\s*)|(--)|(\s*ping\s-n\s*)|(\s+or\s+)|\b(exec\s+)|\b(master\s+)|\b(truncate\s+)|\b(declare\s+)|(\s+insert\s+)|\b(select\s+)|\b(delete\s+)|\b(update\s+)|\b(count\s*\()|(\s+chr\s*\()|(\s+mid\s*\()|(\s+chr\s*\()|(\s+chr\s*\()/.test(obj_data) ){
alert('输入操作中存在异常注入风险,请重新输入');
return false;
};
if(XMLObject.type=="GET"){
var urlString = XMLObject.url;
var reg = /(&Token.*?(?=&|$))|(Token.*?(?=&|$))/;
var UrlArray = XMLObject.url.match(reg);
if(UrlArray && UrlArray){
var repalceString = UrlArray;
urlString = urlString.replace(repalceString,"");
}
XMLObject.url = urlString;
}
},
data:{
Token:stringtoaescovert("J112saasdftrU2NUTTI")
}
});
if(document.getElementById("captchaImg")){
document.getElementById("captchaImg").onclick = function(e) {
get_code();
}
}
};`` 可以劫持请求获取响应值,或者自己发请求,不过这些估计你一时半会理解不了,最简单的办法是劫持函数,如果这个drawCaptcha是全局函数的话,可以这样搞:
const _drawCaptcha = unsafeWindow.drawCaptcha;
unsafeWindow.drawCaptcha = function(code) {
console.log(code);
return _drawCaptcha.call(this, code);
}; 嗯,确实好用,能在控制台显示,但请问我如何才能调用它呢?@cxxjackie .拜谢。 xidili 发表于 2023-4-21 18:03
嗯,确实好用,能在控制台显示,但请问我如何才能调用它呢?@cxxjackie .拜谢。 ...
在console.log那个地方写你的脚本代码啊。
页:
[1]