0

可能重复的问题

我正在生成一个重置链接/令牌,该链接/令牌将通过电子邮件发送给客户,如下所示。

    QByteArray token;
    token.resize(crypto_pwhash_SALTBYTES);
    randombytes_buf(token.data(), crypto_pwhash_SALTBYTES);

    QUrlQuery token_url("http://localhost:8080/reset/staff");
    token_url.addQueryItem("token", token);
    token_url.query(QUrl::FullyEncoded).toUtf8();

这似乎产生了正确的输出:

http://localhost:8080/reset/staff&token=pc%22%EF%BF%BD%C6%9Fsktx%EF%BF%BD!%06t%5C%0B

要针对存储的哈希验证重置请求,我需要令牌 QByteArray。

QByteArray path = request.getPath();
qDebug() << path;

QUrlQuery token_url(path);
QString token(token_url.queryItemValue("token"));
qDebug() << token;

qDebug() << QUrl::fromPercentEncoding(path);

包含在 Firefox 中粘贴的 url 的输出是乱码

"/reset/staff&token=pc\"\xEF\xBF\xBD\xC6\x9Fsktx\xEF\xBF\xBD!\x06t\\\x0B"
"pc\"�Ɵsktx�!%06t\\%0B"
"/reset/staff&token=pc\"�Ɵsktx�!\u0006t\\\u000B"

我知道我可能正在做一个小狗无符号字符转换。

将 QBytearrays 传入和传出 QUrlQuery 的优雅方法是什么?

我见过一些程序员编写自己的 URL 解析器,但这似乎太过分了。

4

1 回答 1

0

[已解决] 问题出在 QtWebApps HttpRequest::decodeRequestParams() 中,Url 被双重解码,另外 QUrlQuery.query() 不能像您期望的那样安静地工作。

KISS 手动编码您的 URL

QByteArray url("http://localhost:8080/reset/staff?");
url.append("&token="+token.toPercentEncoding());

qDebug() << url; 

在接收端

split the query from "?"
then split at "&" into key=value pairs
then split at "=" 
finally QByteArray::fromPercentEncoding(key)
finally QByteArray::fromPercentEncoding(value)

如果有人有更优雅的解决方案,我愿意改进。

于 2016-10-26T08:51:27.643 回答