向第三方提供库时,C++ 包含文件是否存在安全漏洞?
Are C++ include files a security breach when supplying a library to 3rd parties?
我不是C++专家,其实我更喜欢C,我也不在技术前沿,但我偶尔会以库的形式向第三方提供一些科学软件。我知道依靠编译并不是保护我的专有利益的好方法,但我一直相信我的 "clients".
但是我想到 "malicious" 第三方可能会通过编辑我的包含文件来滥用我的软件;将 private: class 成员更改为 public: 是一个特别令人担忧的问题。
我的担心是没有根据的吗?如果不是,是否有解决方案,也许是 pre-compile headers 的方法?
PS 我知道 pimpl 惯用语,但与我一起工作的一些人不喜欢动态内存。另外,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;
}
关于pimpl,是Qt中使用的,如果你觉得方便合适也可以用,here更多信息
很多时候交付给客户的软件由客户端代码和专有代码组成。客户端代码是允许客户或客户阅读甚至修改的软件部分。另一方面,专有代码是软件作者想要保护并禁止他人(包括客户)使用的代码。
要保护专有代码,您可以将其放入单独的文件中并将其编译成 DLL。但这并不安全,因为黑客可以在该 DLL 上使用反编译器并访问源代码。
比较靠谱的方法是使用加密工具,不过我没用过不知道加密后的文件怎么编译或者转成库文件
最后,客户端代码将link调用专有代码。所以是否保护是一个早期的决定,将对软件的整个设计产生深远的影响。
您可以使用纯接口或 "pimpl idiom" 让您的 类 的内部细节不那么容易被您的 SDK 使用者访问。最终,他们拥有编译后的代码并可以对其进行反汇编并做任何事情,但是如果您希望您的分布式包含文件不易被 SDK 客户端滥用,那么纯接口或 pimpl idiom on concrete 类 可以隐藏这些细节来自已发布的 headers.
我不是C++专家,其实我更喜欢C,我也不在技术前沿,但我偶尔会以库的形式向第三方提供一些科学软件。我知道依靠编译并不是保护我的专有利益的好方法,但我一直相信我的 "clients".
但是我想到 "malicious" 第三方可能会通过编辑我的包含文件来滥用我的软件;将 private: class 成员更改为 public: 是一个特别令人担忧的问题。
我的担心是没有根据的吗?如果不是,是否有解决方案,也许是 pre-compile headers 的方法?
PS 我知道 pimpl 惯用语,但与我一起工作的一些人不喜欢动态内存。另外,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;
}
关于pimpl,是Qt中使用的,如果你觉得方便合适也可以用,here更多信息
很多时候交付给客户的软件由客户端代码和专有代码组成。客户端代码是允许客户或客户阅读甚至修改的软件部分。另一方面,专有代码是软件作者想要保护并禁止他人(包括客户)使用的代码。
要保护专有代码,您可以将其放入单独的文件中并将其编译成 DLL。但这并不安全,因为黑客可以在该 DLL 上使用反编译器并访问源代码。
比较靠谱的方法是使用加密工具,不过我没用过不知道加密后的文件怎么编译或者转成库文件
最后,客户端代码将link调用专有代码。所以是否保护是一个早期的决定,将对软件的整个设计产生深远的影响。
您可以使用纯接口或 "pimpl idiom" 让您的 类 的内部细节不那么容易被您的 SDK 使用者访问。最终,他们拥有编译后的代码并可以对其进行反汇编并做任何事情,但是如果您希望您的分布式包含文件不易被 SDK 客户端滥用,那么纯接口或 pimpl idiom on concrete 类 可以隐藏这些细节来自已发布的 headers.