当向第三方提供库时,C++include文件是否属于安全漏洞
Are C++ include files a security breach when supplying a library to 3rd parties?
我不是C++专家,我实际上更喜欢C,我也不处于技术的前沿,但我偶尔会以库的形式向第三方提供一些科学软件。我知道依靠汇编并不是保护我专有利益的好方法,但我一直信任我的"客户"。
然而,我突然想到,"恶意"第三方可能会通过编辑我的包含文件来滥用我的软件;将private:类成员更改为public:是一个特别令人担忧的问题。
我的担心是没有根据的吗?如果不是,有没有解决方案,也许有一种预编译头的方法?
附言:我知道皮条客这个成语,但我的一些同事不喜欢动态记忆。此外,c++11还没有达到这些部分。
我不知道你为什么认为这是一个问题。如果人们想扰乱你的代码(并可能以这种方式破坏他们自己的代码),为什么不呢?如果你想保护库中使用的类似算法的东西不被反向调用,我会理解的,但简单地访问private
变量并不是你应该害怕的事情。
毕竟,private
并没有提供任何真正的保护,你总是可以做这样的把戏
class My
{
public:
int i()
{
return _i;
}
private:
int _i = 5;
};
struct Omg
{
public:
int _i;
};
int main()
{
My m;
Omg * o = (Omg*)(&m);
o->_i = 10;
std::cout << m.i();
return 0;
}
至于皮条,它在Qt中使用,如果你觉得方便和合适,你也可以使用它,这里有更多信息。
很多时候,交付给客户的软件由客户端代码和专有代码组成。客户端代码是允许客户或客户端读取甚至修改的软件的一部分。另一方面,专有代码是软件作者想要保护并禁止包括客户在内的其他人使用的代码。
为了保护专有代码,您可以将其放入单独的文件中,并将其编译为DLL。但这并不安全,因为黑客可以在该DLL上使用反编译器并访问源代码。
一个更可靠的方法是使用加密工具,但我还没有使用任何加密工具来了解如何将加密文件编译或转换为库文件。
最后,客户端代码将链接到并调用专有代码。因此,是否进行保护是一个早期决定,它将深刻影响软件的整个设计。
您可以使用纯接口或"pimpl习语"来减少SDK消费者对类内部细节的访问。最终,它们拥有编译后的代码,可以对其进行反汇编并执行任何操作,但如果您希望您的分布式包含文件不太容易被SDK客户端滥用,那么具体类上的纯接口或pimpl习惯用法可以从发布的头文件中隐藏这些详细信息。
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何将更多文件夹添加到c++include路径
- 修改生成文件以简化框架 #include 路径
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- 使用 #include 将大量重复代码放入单独的文件中是否可以和/或正常?
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- 【MacOSX 10.15.1】使用 odb 生成数据库,致命错误:wchar.h:没有这样的文件或目录 #include < wchar.h>
- 为什么 C++ 编译器在"c:program filesgnu emacsinclude"中查找包含文件?
- pip install uwsgi 失败,出现 /usr/local/include/string/string.h:7:10:致命错误:找不到'sstream'文件?
- 无法将静态二进制文件链接到 #include
- 如果您有Visual Studio 2017 Preview 2更新,您可以为我提供include/iosfwd文件吗?
- 如何向 g++ 编译器解释如何读取用于从'list'文件中搜索 .h 文件的'include'目录列表
- QTableView clearSelect 失败,并显示 ASSERT:在文件 /usr/include/qt4/QtCore/qlist.h 中"!isEmpty()",第 282 行
- 如何避免在转发声明导致不完整类型错误时在头文件中 #include
- <utility> 在开发 C++ 头文件中 #include
- 如何为头文件声明“#include”以避免“error lnk2005”
- c++头文件和include
- c++头文件交叉#include