zoukankan      html  css  js  c++  java
  • Qt发起Http/Https请求

    1. BurpSuite抓包

    1.1 设置代理

    burpsuite代理设置

    image

    浏览器代理设置(chrome),其他浏览器同理。

    地址栏输入 chrome://settings/

    打开代理设置

    image

    设置代理端口

    image

    如果使用了代理插件,比如switchomega,可以这么设置

    image

    这样当选择使用代理选项的时候,请求包的数据也会被burpsuite拦截到。

     

    1.2 导入证书

    浏览器地址栏输入 http://burp/,如果有使用代理插件,建议先停用插件,待正确导入证书后开启使用,后续不再有影响。

    image

    点击CA Certificate,下载证书cacert.der

    浏览器地址栏输入chrome://settings/

    image

    选择 “受信任的根证书颁发机构”,导入证书

    image

    下一步,选择证书,导入成功。

    1.3 拦截抓包

    浏览器地址栏输入地址访问,www.baidu.com

    intercept is off 拦截已关闭

    intercept is on 拦截已开启

    image

    可以看到请求包已经被我们拦截下来了。

    选择放行Forward或者点击Intercept is on关闭拦截就会把数据包放行出去。

    HTTP history中可以观察到已经拦截到的请求地址

    image

    如果有过滤的需求,可点击过滤

    image

    点击链接,会显示请求和响应等数据

    image

    下面自我发挥……

     

    Qt发起http/https请求

    1. 配置openssl

    qt自身是不支持https的,如果想要使用https发起请求,要进行相关配置。

    1.1 查看qt支持哪些协议

    可以通过以下代码查看使用的qt版本支持哪些协议。

    pro文件设置

    添加network支持,QT += network

    查看qt支持哪些协议

    #include <QNetworkAccessManager>

    #include <QDebug>

    
    

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);

    qDebug() << manager->supportedSchemes();
    2 配置ssl2.1 下载openssl

    http://slproweb.com/products/Win32OpenSSL.html

    选择版本,就选择这个版本了

    image

    2.2 下载后直接安装,然后加入到系统环境变量(我的安装目录是D:OpenSSL-Win32in)

    2.3 配置qt支持https

    
    

    LIBS += -L"D:/OpenSSL-Win32/lib" -llibeay32

    LIBS += -L"D:/OpenSSL-Win32/lib" -lssleay32


    INCLUDEPATH += $$quote(D:/OpenSSL-Win32/include)

    可以测试ssl是否配置成功或者查看ssl的错误提示。

    #include <QSslSocket>

    qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString();

    2.4 编写程序这里不必要的业务逻辑就不在写了,主要放上https请求的代码,着重关注和http请求的不同点。

    bool MainWindow::SendHttp()
    {
        /*QNetworkAccessManager *manager = new QNetworkAccessManager(this);
        qDebug() << manager->supportedSchemes();*/
    
        qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString();
    
        QNetworkRequest request;
        QSslConfiguration config;
    
        QNetworkProxy proxy;
        proxy.setType(QNetworkProxy::HttpProxy);
        proxy.setHostName("127.0.0.1");
        proxy.setPort(8080);
        QNetworkProxy::setApplicationProxy(proxy);
    
        //url
        request.setUrl(QUrl(strWww));
    
        QSslConfiguration conf = request.sslConfiguration();
        config.setPeerVerifyMode(QSslSocket::VerifyNone);
        config.setProtocol(QSsl::TlsV1_0);
        request.setSslConfiguration(config);
    
        //header
        auto it = m_headerMap.begin();
        while(it != m_headerMap.end())
        {
            //qDebug() << it->second.m_skey.toLatin1() << it->second.m_sval.toLatin1() << '
    ';
            request.setRawHeader(it->second.m_skey.toLatin1(), it->second.m_sval.toLatin1());
            ++it;
        }
    
        //nam
        QNetworkAccessManager qnam;
        qDebug() << qnam.supportedSchemes();
    
        // 开启一个局部的事件循环,等待响应结束,退出
        QEventLoop loop;
        QTimer timer;
        //发出请求
        QNetworkReply *reply = qnam.get(request);
        QObject::connect(&qnam,SIGNAL(finished(QNetworkReply *)),&loop,SLOT(quit()));
        //请求结束并下载完成后,退出子事件循环
        QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
        //超时退出
        QObject::connect(&timer,SIGNAL(timeout()),&loop,SLOT(quit()));
        //超时设置5秒钟
        timer.start(5000);
        //开启子事件循环
        loop.exec();
        //....
    
        if (reply->error() == QNetworkReply::NoError)
        {
            QVariant statusCodeV =
                reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    
           if(statusCodeV.toInt() == 200
                                        /*这里写了这个readAll(),
                                         * 下面readAll()就取不出数据了
                                         * && !reply->readAll().isEmpty()
                                         */
            )
            {
    
               //写入文件
               std::ofstream ofile;
               ofile.open("test.txt");
               if(ofile.fail())
               {
                    qDebug() << "error ofile" << '
    ';
               }
               //reply->readAll().isEmpty()
               ofile << reply->readAll().toStdString();
               ofile.flush();
               ofile.close();
            }
        }
    
        return true;
    }
  • 相关阅读:
    [转]Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
    ubuntu wifi连接出现Network service discovery disabled的解决办法
    使用java实现对称加密解密(AES),非对称加密解密(RSA)
    [转] mysql分区性能初探
    CyclicBarrier和CountDownLatch的使用
    oom 和 jvm crash的问题
    使用单元素枚举实现单例
    【转】mysql 计划事件
    用Linkedhashmap的LRU特性及SoftReference软引用构建二级缓存
    动态生成正则表达式
  • 原文地址:https://www.cnblogs.com/HackerArt/p/10502478.html
Copyright © 2011-2022 走看看