首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过boost beast提交登录请求?

如何通过boost beast提交登录请求?
EN

Stack Overflow用户
提问于 2020-07-31 13:52:14
回答 2查看 845关注 0票数 0

我试图使用boost beast登录该站点,但在结果中只能得到字段已更改的页面

代码语言:javascript
复制
#include <iostream>

#include "boost/asio.hpp"
#include "boost/beast.hpp"

namespace beast = boost::beast;
namespace http = beast::http;
namespace asio = boost::asio;
using tcp = asio::ip::tcp;

int main() {
    asio::io_context context;

    beast::tcp_stream stream(context);
    stream.connect(tcp::resolver(context).resolve("site.com", "http"));

    http::request<http::string_body> request;
    request.version(11);
    request.method(http::verb::post);
    request.target("/login.php?redirect=somepage");
    request.set(http::field::host, "site.com");
    request.set(http::field::content_type, "application/x-www-form-urlencoded");
    request.body() = "fusername=USERNAME&fpassword=PASSWORD";
    request.prepare_payload();

    boost::beast::http::write(stream, request);

    boost::beast::flat_buffer buffer;
    boost::beast::http::response<boost::beast::http::dynamic_body> res;

    boost::beast::http::read(stream, buffer, res);

    std::cout << res;
}

这个站点的方法部分看起来像这样

代码语言:javascript
复制
<form action="./login.php" method="post">
    <input type="hidden" name="redirect" value="somepage">
    <div><b>Enter your username and password to log in.</b></div>
    <div class="input-prepend">
        <span class="add-on" style="width:100px;text-align:right;">Username:</span>
        <input type="text" class="post input" name="fusername" size="25" maxlength="40" value="" tabindex="101">
    </div>
    <div class="input-prepend">
        <span class="add-on" style="width:100px;text-align:right;">Password:</span>
        <input type="password" class="post input" name="fpassword" value="" tabindex="102" size="25" maxlength="32">
    </div>
    <input type="submit" name="login" class="bold long btn" value="Log in" style="margin:0 auto;">

</form>

res与页面相同,只是值字段看起来像value="USERNAME"

EN

回答 2

Stack Overflow用户

发布于 2020-07-31 15:01:50

重定向实际上也是在正文中发送的输入值,而不是用作URL参数。尝试更改:

代码语言:javascript
复制
request.target("/login.php");

代码语言:javascript
复制
request.body() = "fusername=USERNAME&fpassword=PASSWORD&redirect=somepage";
票数 0
EN

Stack Overflow用户

发布于 2020-07-31 16:51:30

好了,我找到答案了,希望能对你有所帮助。

在作为参数发送时,您需要对字符串“

  • ”使用转义序列

  • 如果站点有名称和值的按钮,则需要将其作为参数传递给POST too

  • POST将更改状态,但不会返回页面使用GET after this

  • 如果站点向您发送应答中的cookie,则需要将其添加到GET请求

是的,如果你不能创建HTTP请求,你可以直接在浏览器(比如Firefox)中登录,然后从浏览器中获取原始请求。

代码语言:javascript
复制
#include <iostream>
#include <fstream>

#include "boost/asio.hpp"
#include "boost/beast.hpp"

namespace beast = boost::beast;
namespace http = beast::http;
namespace asio = boost::asio;
using tcp = asio::ip::tcp;

static std::string const host = "site.com";
static std::string const redirected = "/somepage=1";
static std::string const redirected_escaped = "somepage%3D1";

static std::string const username = "USERNAME";
static std::string const password = "PASSWORD";

int main() {
    try {
        std::ofstream output("../output.html");

        asio::io_context context;

        beast::tcp_stream stream(context);
        stream.connect(tcp::resolver(context).resolve(host, "http"));

        std::string cookie;

        {
            http::request<http::string_body> request(http::verb::post, "/login.php", 11);
            request.set(http::field::host, host);
            request.set(http::field::content_type, "application/x-www-form-urlencoded");

            request.body() =
                    "redirect=" + redirected_escaped +
                    "&login_username=" + username +
                    "&login_password=" + password +
                    "&login=Log+in";
            request.prepare_payload();

            std::cout << request << std::endl;

            boost::beast::http::write(stream, request);

            boost::beast::flat_buffer buffer;
            boost::beast::http::response<boost::beast::http::dynamic_body> res;

            boost::beast::http::read(stream, buffer, res);

            cookie = std::string(res.base().at(http::field::set_cookie));

            std::cout << "Cookie: " << cookie << std::endl;
        }

        {
            http::request<http::string_body> request(http::verb::get, redirected, 11);
            request.set(http::field::host, host);
            request.set(http::field::cookie, cookie);

            std::cout << request << std::endl;

            boost::beast::http::write(stream, request);

            boost::beast::flat_buffer buffer;
            boost::beast::http::response<boost::beast::http::dynamic_body> res;

            boost::beast::http::read(stream, buffer, res);

            output << beast::buffers_to_string(res.body().data());
        }

    } catch (boost::wrapexcept<boost::system::system_error> const &wrapexcept) {
        std::cout << wrapexcept.what();
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63186448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档