PHP 模拟用户点击按钮自动登录网站后台

  • PHP二次开发
  • 2018-8-2 08:24
  • PHP二次开发
  • 阅读(96)
  • 评论(1
  • 摘要: 实现目标:用户点击按钮,自动登录到某网站后台。前提:知道网站的用户名密码哈,不存在破解思路。疑难点:1.验证码的识别2.ajax提交的跨域问题验证码的识别技术上的实现这里不做讨论,本人是采用的融合接口来实现的 ...
    实现目标:用户点击按钮,自动登录到某网站后台。
    前提:知道网站的用户名密码哈,不存在破解思路。
    疑难点:
    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

    相关阅读

    发表评论

    最新评论

    引用 广安网站建设   2018-8-15 09:36
    支持博主

    查看全部评论(1)

    用户名:  *

    邮 箱:  *

    网 址: 注意加上“http://”哦!