Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost序列化:查看流是否为;“好”;_C++_Boost_Boost Serialization - Fatal编程技术网

C++ boost序列化:查看流是否为;“好”;

C++ boost序列化:查看流是否为;“好”;,c++,boost,boost-serialization,C++,Boost,Boost Serialization,我目前开发了一个服务器应用程序,它必须从客户机接收序列化数据,对其进行反序列化并最终处理。序列化数据以字符数组的形式发送。我的问题是,通过向应用程序发送无效数据,我的应用程序很容易被破坏。因此,我想在尝试从字符串(-stream)获取数据之前,询问是否可以检查字符串(-stream)并查看它是否适合(反)序列化(例如,它是否具有有效的签名) 顺便说一下:正如标题所说,我的应用程序使用boost.serialization 提前非常感谢:)我假设您希望执行轻量级检查,而不需要读取所有数据(在这种情

我目前开发了一个服务器应用程序,它必须从客户机接收序列化数据,对其进行反序列化并最终处理。序列化数据以字符数组的形式发送。我的问题是,通过向应用程序发送无效数据,我的应用程序很容易被破坏。因此,我想在尝试从字符串(-stream)获取数据之前,询问是否可以检查字符串(-stream)并查看它是否适合(反)序列化(例如,它是否具有有效的签名)

顺便说一下:正如标题所说,我的应用程序使用boost.serialization

提前非常感谢:)

我假设您希望执行轻量级检查,而不需要读取所有数据(在这种情况下,处理异常的效率将尽可能高)

我刚刚用这个简单的函数测试了成功:

bool can_deserialize(std::istream& is)
{
    bool ok = false;
    is.seekg(0, std::ios_base::beg);

    try
    {
        boost::archive::binary_iarchive ia(is);
        unsigned test = ia.get_library_version();
        ok = true;
    } catch (...) { }

    is.seekg(0, std::ios_base::beg);
    is.clear();
    return ok;
}
下面是我使用的一个简单测试工具(在反序列化之前操作data.bin中的数据以检查“坏流”):

#包括
#包括
#包括
#包括
#包括
布尔可以反序列化(std::istream&is)
{
bool ok=false;
is.seekg(0,std::ios\u base::beg);
尝试
{
boost::archive::binary_iarchive ia(is);
unsigned test=ia.get_library_version();
ok=正确;
}捕获(…){}
is.seekg(0,std::ios\u base::beg);
is.clear();
返回ok;
}
int main()
{
向量数据={19415,-261112092,-3942,-253512105210794660,3,
27131, 13647, 24428, 15159, 9029, 24827, -979, 17194, 25102, -3631,
20914, -3223, 25801, 6652, 26208, -77, 15606, 8764, 1896, 7430, 24323,
-152, 23805, -4259, 11243, 13367, 23559, 19293, 18581, 1639, 15671,
7929, 18386, 5168, 13816, 465, 15801, 16750, -3340, -202, 10412, 11068,
13458, 24304, 14814, 6530, 1178, -974, 12882, 757, 583, 4897, 24541,
12490, -119, 2240, -4833, 569, 24700, 24522, 8708, 9760, 26837, 26060,
20914, -3223, 25801, 6652, 26208, -77, 15606, 8764, 1896, 7430, 24323,
3377, 6972, 25689, 2334, 1567, 21670, 23233, 14711, 4650, -4703, 25057,
16057, 19488, 14575, 18936, 13346, 2779, 5644, 17165, 4526, 4390,
9616, 2413, 14459, -1070, -4079, 22126, 9063, 4362, 8182, 24439, 23625,
7929, 18386, 5168, 13816, 465, 15801, 16750, -3340, -202, 10412, 11068,
4184, 25930, 24767, 2785, 17361, 18033, 12366, 20548, -3831, -4101,
16841, -193, 23217, 6351, 19077, 23565, 10482, 4100, 27488, 15956,
-2577, 7161, 20943, 25708, -2877, 7900, -4564, -3647, 12008, 1648,
10533 };
{
ofs流的std::of(“data.bin”,std::ios::out | std::ios::binary);
boost::archive::二进制文件oa(ofs);
办公自动化与数据;
ofs.flush();
ofs.close();
}
{
std::ifstream ifs(“data.bin”,std::ios::in | std::ios::binary);
如果(可以反序列化(ifs))
{
std::cout我假设您希望执行一个轻量级检查,而不需要读取所有数据(在这种情况下,处理异常是非常有效的)

我刚刚用这个简单的函数测试了成功:

bool can_deserialize(std::istream& is)
{
    bool ok = false;
    is.seekg(0, std::ios_base::beg);

    try
    {
        boost::archive::binary_iarchive ia(is);
        unsigned test = ia.get_library_version();
        ok = true;
    } catch (...) { }

    is.seekg(0, std::ios_base::beg);
    is.clear();
    return ok;
}
下面是我使用的一个简单测试工具(在反序列化之前操作data.bin中的数据以检查“坏流”):

#包括
#包括
#包括
#包括
#包括
布尔可以反序列化(std::istream&is)
{
bool ok=false;
is.seekg(0,std::ios\u base::beg);
尝试
{
boost::archive::binary_iarchive ia(is);
unsigned test=ia.get_library_version();
ok=正确;
}捕获(…){}
is.seekg(0,std::ios\u base::beg);
is.clear();
返回ok;
}
int main()
{
向量数据={19415,-261112092,-3942,-253512105210794660,3,
27131, 13647, 24428, 15159, 9029, 24827, -979, 17194, 25102, -3631,
20914, -3223, 25801, 6652, 26208, -77, 15606, 8764, 1896, 7430, 24323,
-152, 23805, -4259, 11243, 13367, 23559, 19293, 18581, 1639, 15671,
7929, 18386, 5168, 13816, 465, 15801, 16750, -3340, -202, 10412, 11068,
13458, 24304, 14814, 6530, 1178, -974, 12882, 757, 583, 4897, 24541,
12490, -119, 2240, -4833, 569, 24700, 24522, 8708, 9760, 26837, 26060,
20914, -3223, 25801, 6652, 26208, -77, 15606, 8764, 1896, 7430, 24323,
3377, 6972, 25689, 2334, 1567, 21670, 23233, 14711, 4650, -4703, 25057,
16057, 19488, 14575, 18936, 13346, 2779, 5644, 17165, 4526, 4390,
9616, 2413, 14459, -1070, -4079, 22126, 9063, 4362, 8182, 24439, 23625,
7929, 18386, 5168, 13816, 465, 15801, 16750, -3340, -202, 10412, 11068,
4184, 25930, 24767, 2785, 17361, 18033, 12366, 20548, -3831, -4101,
16841, -193, 23217, 6351, 19077, 23565, 10482, 4100, 27488, 15956,
-2577, 7161, 20943, 25708, -2877, 7900, -4564, -3647, 12008, 1648,
10533 };
{
ofs流的std::of(“data.bin”,std::ios::out | std::ios::binary);
boost::archive::二进制文件oa(ofs);
办公自动化与数据;
ofs.flush();
ofs.close();
}
{
std::ifstream ifs(“data.bin”,std::ios::in | std::ios::binary);
如果(可以反序列化(ifs))
{

std::你是更感兴趣还是在找类似的东西?我想错误检测就是我要找的东西,因为我想防止“攻击者”通过发送错误数据而破坏我的软件,而不检查数据是否在发送到服务器的过程中受到了某种程度的损坏。还有消息身份验证码似乎只有当双方(在本例中:服务器和客户端)都对发送/接收正确的数据包感兴趣时才起作用。(我的意思是,没有什么可以阻止atacker为其无效数据发送有效的身份验证代码)。谢谢你的评论,我希望我理解的一切都是正确的。你是更感兴趣还是在寻找类似的东西?我想错误检测就是我要寻找的东西,因为我想防止“攻击者”被破解