实现目标:用户点击按钮,自动登录到某网站后台。 前提:知道网站的用户名密码哈,不存在破解思路。 疑难点: 1.验证码的识别 2.ajax提交的跨域问题 验证码的识别技术上的实现这里不做讨论,本人是采用的融合接口来实现的,这里讨论的验证码的识别是指的抓取验证码的步骤。 刚开始是想着,PHP服务端抓取验证码,然后直接提交给接口识别,后来发现一个问题,PHP是在服务端跑的程序,其访问验证码携带的session信息与客户端浏览器访问的时候是不同的,会导致提交登录信息的时候,验证码会跟随改变,无法通过验证。 最终实现方案: 比如:模拟登录的代码在A服务器,需要登录到B服务器,客户端代号为C 实现代码: index.php <?php header("Content-type:text/html;charset=utf-8"); ?> <!--HTML--> <script src="http://10.1.0.18:82/Public-shandong/js/jquery-1.10.2.min.js" type="text/javascript"></script> 正在跳转中,请稍后。。。 <div style="display:none"> <form action="http://10.1.0.18:82/Home/Index/login.html" method="post" id="test_form"> <input type="hidden" name="username" value="admin" /> <input type="hidden" name="passwd" value="www.php2.cc" /> <input type="text" name="verifyCode" id="verifyCode" value="<?php echo $code; ?>" /> <button type="button" id="btn_login">提交<button/> </form> </div> <script type="text/javascript"> $(function () { $('#test_form').submit(function(){ $.post("http://10.1.0.18:82/Home/Index/login.html", $('#test_form').serialize(), function (data) { if (data.ret) { alert(data.ret); $('.error').show().html(data.msg); $(':input[name="verifyCode"]').val(''); return; } window.location.href = data.data; }, 'json',true); return false; }); $('#btn_login').click(function () { $('#test_form').submit(); }) }) var url = "http://10.1.0.18:82/Home/Index/verifyCode.html";//这是验证码地址 convertImgToBase64(url, function(base64Img){ //转化后的base64 //console.log(base64Img); $.post("http://10.1.0.18:82/autologin/identify.php",{iddentify:base64Img},function(result){ console.log(result); $("#verifyCode").val(result); $('#test_form').submit(); }); }); //实现将项目的图片转化成base64 function convertImgToBase64(url, callback, outputFormat){ var canvas = document.createElement('CANVAS'), ctx = canvas.getContext('2d'), img = new Image; img.crossOrigin = 'Anonymous'; img.onload = function(){ canvas.height = img.height; canvas.width = img.width; ctx.drawImage(img,0,0); var dataURL = canvas.toDataURL(outputFormat || 'image/png'); callback.call(this, dataURL); canvas = null; }; img.src = url; } </script> identify.php <?php header("Content-type:text/html;charset=utf-8"); $ch = curl_init('http://op.juhe.cn/vercode/index'); $cfile = $_POST['iddentify']; $arr = explode(",",$cfile); $cfile = $arr[1]; //echo $cfile; $data = array( 'key' => '这里写自己的key', //请替换成您自己的key 'codeType' => '6001', // 验证码类型代码,请在https://www.juhe.cn/docs/api/id/60/aid/352查询 'base64Str' => $cfile, ); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $response = curl_exec($ch); curl_close($ch); $code1 = json_decode($response,true); $code = $code1['result']; echo $code; 根据以上的思路,解决验证码问题,并实现数据提交,因为提交数据也是采用的ajax的形式,A服务器与B服务器处于不同的域名下,这样就存在跨域问题。 跨域问题的解决思路: 跨域其实就是域名不同,不在一个服务器下,那么可以通过反向代理,弄到一个域名下,本人这里使用的是Nginx服务 反代的代码如下: server { listen 82; server_name 10.1.0.18:82; location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://10.1.0.8:80; } location /autologin/ { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://10.1.0.18:85/autologin/; } }
PHP技术交流QQ群:422137578 除非注明,文章均为 PHP二次开发 原创,转载请注明本文地址:http://www.php2.cc/article-2690-1.html |