C++ const std:string& 传递给第三方时的安全性 API
C++ const std:string& security when passing to a third-party API
我有第三方 API 希望我通过引用传递 std::string
。它说它正在接受 const
。这几乎没有任何意义,因为它可以将内存指针转换为非常量 char*
并修改我的字符串。
通过示例检查下面的代码。
我是否应该 concerned/suspicious 关于要求我传递 const std::string&
(通过 const 引用)而不是 std::string
(通过值)的第三方 API )?
他们告诉我这是因为他们想避免字符串复制,因为字符串可能很长。我是偏执还是有道理?
class Blah {
public:
static void testBlah(const string& s) {
char* blah = (char*) s.c_str(); // cast away from const char*
blah[1] = 'b';
}
};
int main() {
cout << "!!!Hello There !!!" << endl; // prints !!!Hello World!!!
const string s = "xxx"; // NOTE THE CONST !!!
Blah::testBlah(s);
cout << s << endl; // prints "xbx"
return 0;
}
只需将其包装在您自己信任的 class:
#include <iostream>
class Blah {
public:
static void testBlah(const std::string& s)
{
char* blah = (char*)s.c_str(); // cast away from const char*
blah[1] = 'b';
}
};
class Safe_Blah {
public:
static void testBlah(const std::string s)
{
Blah::testBlah(s);
}
};
int main()
{
std::cout << "!!!Hello There !!!" << std::endl; // prints !!!Hello World!!!
const std::string s = "xxx"; // NOTE THE CONST !!!
//Blah::testBlah(s);
Safe_Blah::testBlah(s);
std::cout << s.c_str() << std::endl; // now prints "xxx"
return 0;
}
接受 const&
对象的 API 承诺不修改该对象。虽然,是的,图书馆可能是邪恶的并且无论如何都会修改它,但这样做会违背诺言。如果您传递给它的对象被定义为 const
,修改它将是 未定义的行为。从图书馆开发人员的角度来看,这将是非常糟糕的。基本上,图书馆开发人员会邀请 Chutulhu 来以任意、随机、未指定和不可预测的方式破坏他们的用户应用程序。
说到不信任你的图书馆,你就输了。就控制您调用的库的攻击者的安全性而言,C++ API 不是 "safe"。当您调用库中的函数时,您将执行控制权交给了该库。然后该库将有权读取和写入您应用程序的所有内存,并且如果它愿意,可以用它自己的东西替换所有内存。因此,如果您担心图书馆在背后做坏事,那您就太倒霉了。
我有第三方 API 希望我通过引用传递 std::string
。它说它正在接受 const
。这几乎没有任何意义,因为它可以将内存指针转换为非常量 char*
并修改我的字符串。
通过示例检查下面的代码。
我是否应该 concerned/suspicious 关于要求我传递 const std::string&
(通过 const 引用)而不是 std::string
(通过值)的第三方 API )?
他们告诉我这是因为他们想避免字符串复制,因为字符串可能很长。我是偏执还是有道理?
class Blah {
public:
static void testBlah(const string& s) {
char* blah = (char*) s.c_str(); // cast away from const char*
blah[1] = 'b';
}
};
int main() {
cout << "!!!Hello There !!!" << endl; // prints !!!Hello World!!!
const string s = "xxx"; // NOTE THE CONST !!!
Blah::testBlah(s);
cout << s << endl; // prints "xbx"
return 0;
}
只需将其包装在您自己信任的 class:
#include <iostream>
class Blah {
public:
static void testBlah(const std::string& s)
{
char* blah = (char*)s.c_str(); // cast away from const char*
blah[1] = 'b';
}
};
class Safe_Blah {
public:
static void testBlah(const std::string s)
{
Blah::testBlah(s);
}
};
int main()
{
std::cout << "!!!Hello There !!!" << std::endl; // prints !!!Hello World!!!
const std::string s = "xxx"; // NOTE THE CONST !!!
//Blah::testBlah(s);
Safe_Blah::testBlah(s);
std::cout << s.c_str() << std::endl; // now prints "xxx"
return 0;
}
接受 const&
对象的 API 承诺不修改该对象。虽然,是的,图书馆可能是邪恶的并且无论如何都会修改它,但这样做会违背诺言。如果您传递给它的对象被定义为 const
,修改它将是 未定义的行为。从图书馆开发人员的角度来看,这将是非常糟糕的。基本上,图书馆开发人员会邀请 Chutulhu 来以任意、随机、未指定和不可预测的方式破坏他们的用户应用程序。
说到不信任你的图书馆,你就输了。就控制您调用的库的攻击者的安全性而言,C++ API 不是 "safe"。当您调用库中的函数时,您将执行控制权交给了该库。然后该库将有权读取和写入您应用程序的所有内存,并且如果它愿意,可以用它自己的东西替换所有内存。因此,如果您担心图书馆在背后做坏事,那您就太倒霉了。