创建文件路径时如何避免攻击者攻击路径参数
答案:2 悬赏:0
解决时间 2021-01-30 06:57
- 提问者网友:痞子房西
- 2021-01-29 06:40
创建文件路径时如何避免攻击者攻击路径参数
最佳答案
- 二级知识专家网友:我的任性你不懂
- 2021-01-29 08:04
避免出现delete this操作
说明:对象指针应避免使用delete this语句硬删除,除非能保证this指针删除后不再被引用,并且保证对象是通过new操作符在堆上创建的。
原因有两个:
(1)类的对象既可能是栈对象,也可能是堆对象。如果对栈对象的指针进行delete,即删除非动态分配的内存,会导致未定义行为;
(2)二是delete this容易产生悬挂指针(dangling pointer),悬挂指针是个严重的安全漏洞,可以被攻击者利用执行任意代码。
错误示例:错误的删除this指针
class SomeClass
{
public:
SomeClass();
~SomeClass();
void doSomething();
void destroy();
// ...
};
void SomeClass::destroy()
{
delete this; //【错误】删除this指针会导致出现悬挂指针
}
void main()
{
SomeClass sc; // 声明栈对象
sc.destroy(); // 释放非动态分配的内存。
}
推荐做法1:不delete this,让栈对象离开作用域后自动析构。
class SomeClass
{
public:
SomeClass();
~SomeClass();
void doSomething();
void destroy();
// ...
};
void SomeClass::destroy()
{
// delete this; // Dangerous!!
}
// ...
void main()
{
SomeClass sc; // 声明栈对象
} // 离开作用域,自动调用sc.~SomeClass()
如果不得不使用delete this,保证类对象是堆对象,且this指针delete后置NULL,可参考如下示例代码:
class SomeClass
{
public:
SomeClass();
void doSomething();
void destroy();
// ...
protected:
~SomeClass();
};
void SomeClass::destroy()
{
delete this;
}
// ...
{
SomeClass* sc = new SomeClass();
sc->destroy();
sc = NULL;
}
这个示例代码中,将析构函数声明为protected,可以保证类SomeClass的对象不会在栈上生成。同时,在显示调用destory()来delete this指针后,再将指针置NULL,防止指针解引用。
延伸阅读材料:Dangling Pointer, Jonathan Afek, 2/8/07, BlackHat USA
规则9.4:禁止在类的公共接口中返回类的私有数据地址
说明:如果一个类私有成员数据的引用或者其指针,被类的公有函数作为返回值return,则此私有数据可能会遭受到非可信代码的修改,导致引入不安全因素。
说明:对象指针应避免使用delete this语句硬删除,除非能保证this指针删除后不再被引用,并且保证对象是通过new操作符在堆上创建的。
原因有两个:
(1)类的对象既可能是栈对象,也可能是堆对象。如果对栈对象的指针进行delete,即删除非动态分配的内存,会导致未定义行为;
(2)二是delete this容易产生悬挂指针(dangling pointer),悬挂指针是个严重的安全漏洞,可以被攻击者利用执行任意代码。
错误示例:错误的删除this指针
class SomeClass
{
public:
SomeClass();
~SomeClass();
void doSomething();
void destroy();
// ...
};
void SomeClass::destroy()
{
delete this; //【错误】删除this指针会导致出现悬挂指针
}
void main()
{
SomeClass sc; // 声明栈对象
sc.destroy(); // 释放非动态分配的内存。
}
推荐做法1:不delete this,让栈对象离开作用域后自动析构。
class SomeClass
{
public:
SomeClass();
~SomeClass();
void doSomething();
void destroy();
// ...
};
void SomeClass::destroy()
{
// delete this; // Dangerous!!
}
// ...
void main()
{
SomeClass sc; // 声明栈对象
} // 离开作用域,自动调用sc.~SomeClass()
如果不得不使用delete this,保证类对象是堆对象,且this指针delete后置NULL,可参考如下示例代码:
class SomeClass
{
public:
SomeClass();
void doSomething();
void destroy();
// ...
protected:
~SomeClass();
};
void SomeClass::destroy()
{
delete this;
}
// ...
{
SomeClass* sc = new SomeClass();
sc->destroy();
sc = NULL;
}
这个示例代码中,将析构函数声明为protected,可以保证类SomeClass的对象不会在栈上生成。同时,在显示调用destory()来delete this指针后,再将指针置NULL,防止指针解引用。
延伸阅读材料:Dangling Pointer, Jonathan Afek, 2/8/07, BlackHat USA
规则9.4:禁止在类的公共接口中返回类的私有数据地址
说明:如果一个类私有成员数据的引用或者其指针,被类的公有函数作为返回值return,则此私有数据可能会遭受到非可信代码的修改,导致引入不安全因素。
全部回答
- 1楼网友:输掉的尊严
- 2021-01-29 08:16
你说呢...
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯