利用序列化进行文件读写


[ 作者:佚名 转贴自:本站原创 点击数:86 风华初露 ]
在很多应用中我们需要对数据进行保存,或是从介质上读取数据,这就涉及到文件的操作。我们可以利用各种文件存取方法完成这些工作,但MFC中也提供了一种读写文件的简单方法——“序列化”。序列化机制通过更高层次的接口功能向开发者提供了更利于使用和透明于字节流的文件操纵方法,举一个例来讲你可以将一个字串写入文件而不需要理会具体长度,读出时也是一样。你甚至可以对字符串数组进行操作。在MFC提供的可自动分配内存的类的支持下你可以更轻松的读/写数据。你也可以根据需要编写你自己的具有序列化功能的类。

序列化在最低的层次上应该被需要序列化的类支持,也就是说如果你需要对一个类进行序列化,那么这个类必须支持序列化。当通过序列化进行文件读写时你只需要该类的序列化函数就可以了。

怎样使类具有序列化功能呢?你需要以下的工作:

该类从CObject派生。
在类声明中包括DECLARE_SERIAL宏定义。
提供一个缺省的构造函数。
在类中实现Serialze函数
使用IMPLEMENT_SERIAL指明类名和版本号

下面的代码建立了一个简单身份证记录的类,同时也能够支持序列化。

in H
struct strPID
{
char szName[10];
char szID[16];
struct strPID* pNext;
};
class CAllPID : public CObject
{
public:
DECLARE_SERIAL(CAllPID)
CAllPID();
~CAllPID();

public:// 序列化相关
struct strPID* pHead;
//其他的成员函数
void Serialize(CArchive& ar);
};

in CPP
IMPLEMENT_SERIAL(CAllPID,CObject,1) // version is 1,版本用于读数据时的检测
void CAllPID::Serialize(CArchive& ar)
{
int iTotal;
if(ar.IsStoring())
{//保存数据
iTotal=GetTotalID();//得到链表中的记录数量
arr<26;i++)
ar<<&(((BYTE*)pItem)+i);//写一个strPID中所有的数据
}
}
else
{//读数据
ar>>iTotal;
for(int i=0;i26;j++)
ar>>*(((BYTE*)pID)+j);//读一个strPID中所有的数据
//修改链表
}
}
}

当然上面的代码很不完整,但已经可以说明问题。这样CAllPID就是一个可以支持序列化的类,并且可以根据记录的数量动态分配内存。在序列化中我们使用了CArchive类,该类用于在序列化时提供读写支持,它重载了<<和>>运算符号,并且提供Read和Write函数对数据进行读写。

下面看看如何在文档中使用序列化功能,你只需要修改文档类的Serialize(CArchive& ar)函数,并调用各个进行序列化的类的Serial进行数据读写就可以了。当然你也可以在文档类的内部进行数据读写,下面的代码利用序列化功能读写数据:

class CYourDoc : public CDocument
{
void Serialize(CArchive& ar);
CString m_szDesc;
CAllPID m_allPID;
......
}

void CYourDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{//由于CString对CArchive定义了<<和>>操作符号,所以可以直接利用>>和<<
ar<>m_szDesc;
}
m_allPID.Serialize(ar);//调用数据类的序列化函数
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java反序列化漏洞一般利用思路是利用Java反序列化机制,将恶意序列化数据传递给目标系统,从而实现远程代码执行、拒绝服务等攻击。攻击者通常会构造恶意序列化数据,使其在反序列化过程中触发漏洞,从而执行恶意代码。为了防范此类攻击,可以采取一些措施,如限制反序列化对象的类型、使用安全的序列化库等。 ### 回答2: Java反序列化漏洞利用思路主要包括以下几个步骤: 1. 找到目标:攻击者首先需要找到运行了可利用Java反序列化漏洞的目标程序。这可以通过分析目标程序的代码、网络流量或者漏洞公开报告等途径进行。 2. 构造恶意序列化数据:攻击者需要构造恶意的序列化数据,这些数据会被目标程序读取并解析。攻击者可以使用一些工具或者手动编写代码来生成恶意序列化数据。 3. 选择合适的漏洞利用方式:根据目标程序的具体情况,攻击者可以选择合适的漏洞利用方式。常见的利用方式包括Java反序列化的漏洞利用链,如利用未经过正确检验的反序列化的对象进行远程代码执行或者文件读写等操作。 4. 发送恶意序列化数据:攻击者需要将构造好的恶意序列化数据发送给目标程序。这可以通过网络连接、文件上传、内存注入等方式进行。 5. 触发反序列化:目标程序接收到攻击者发送的序列化数据后,会进行相应的反序列化操作。在解析过程中,如果存在漏洞,则恶意代码会被执行,导致安全问题。 6. 实现攻击目标:一旦恶意代码被执行,攻击者可以获得对目标程序的控制,从而进行进一步的攻击行为。这可能包括窃取敏感信息、执行任意代码、篡改数据等。 为了防范Java反序列化漏洞的利用,开发者可以采取一些措施,如使用安全的序列化和反序列化库、校验反序列化输入、限制反序列化操作的范围和权限等。同时,及时更新和修补已知的漏洞也是非常重要的。 ### 回答3: Java反序列化漏洞利用思路如下: 在Java中,对象的序列化是将对象转换为字节流的过程,而反序列化则是将字节流还原为对象的过程。反序列化漏洞是指攻击者通过构造恶意的序列化数据,再使用该数据进行序列化操作,从而导致程序在反序列化的过程中触发各种安全漏洞。 通常的利用思路如下: 1. 找到存在反序列化漏洞的目标:通过静态代码分析、动态分析或源码审计等手段,找到存在反序列化漏洞的应用程序。 2. 构造恶意的序列化数据:攻击者通过修改或创建特定的序列化数据,来生成恶意的序列化数据。这些数据可能包含有害的代码或意外的操作。 3. 发送恶意数据进行序列化:攻击者将构造好的恶意序列化数据发送给目标应用程序,并通过触发反序列化操作,将恶意数据还原为对象。此时,存在漏洞的应用程序会执行恶意代码,并可能导致安全问题。 4. 利用漏洞进行攻击:一旦恶意代码被执行,攻击者可以在目标系统上执行各种恶意操作,如执行任意命令、远程代码执行、获取敏感信息等。 为了避免被反序列化漏洞攻击,需要对反序列化操作进行安全措施,比如使用白名单机制限制可反序列化的类、对反序列化方法进行签名等。同时,定期更新和修复Java环境,以及对目标应用程序进行安全测试和代码审计,也是减少反序列化漏洞风险的重要措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值