删除前导“";”/&引用;从用户提供的路径 我有一个简单的C++应用程序,用来在另一个用户的特定目录中执行Perl脚本。p> wrapper my-perl-script.pl 我想确保用户不要试图通过预定义“…”来欺骗C++应用程序到特定目录之外的执行脚本。做这件事最好/最简单的方法是什么

删除前导“";”/&引用;从用户提供的路径 我有一个简单的C++应用程序,用来在另一个用户的特定目录中执行Perl脚本。p> wrapper my-perl-script.pl 我想确保用户不要试图通过预定义“…”来欺骗C++应用程序到特定目录之外的执行脚本。做这件事最好/最简单的方法是什么,c++,string,replace,char,C++,String,Replace,Char,这是我的包装器源代码的精简版本 int main (int argc, char *argv[]) { /* set user here */ stringstream userCmd; userCmd << "/path/to/scripts/"; for ( int i = 1; i < argc; i++ ) { if ( i == 1) { // remove instances of ../ from t

这是我的包装器源代码的精简版本

int  main (int argc, char *argv[])
{

  /* set user here */

   stringstream userCmd;

   userCmd << "/path/to/scripts/";

   for ( int i = 1; i < argc; i++ ) {

      if ( i == 1) {
         // remove instances of ../ from the first argument

         userCmd << argv[i]
      }
      else {
         // add user supplied arguments for perl script to command
         userCmd << " " << argv[i];
      }

   }

  /* use system to execute the user command */


   return 0;
 }
intmain(intargc,char*argv[])
{
/*在此处设置用户*/
stringstreamusercmd;

userCmd在Linux下,函数
realpath()
将为您提供所请求文件的绝对路径,您可以将其与您希望其能够访问的基本目录的路径进行比较。请参见此处:


如果用户要提供
/path/to/scripts/../../../../root/sensitive.sh
realpath()
会将其转换为
/root/sensitive.sh
,您可以将其与允许的目录进行比较,并向用户抛出错误。

答案是不要删除相对路径。如果用户试图传递相对路径或完整系统路径,则它们是恶意的-只需终止应用程序

int  main (int argc, char *argv[])
{

  if ( argc == 1 || argv[1][0] == '.' || argv[1][0] == '/' ) {
     return 0;
  }

  ...

感谢Johnathon Leffler对此解决方案的评论。

我更喜欢使用字符串而不是原始指针/数组:

 int (int argc, char *argv[]) {

    std::string path (argv[1]);

    if (path.find("..") == std::string::npos)
    {
         //everything's fine
    }
    else
        std::cout << "No execution in parent directories allowed.";
}
int(int-argc,char*argv[]{
std::字符串路径(argv[1]);
if(path.find(“…”)==std::string::npos)
{
//一切都很好
}
其他的

std::cout如果他们创建了一个链接怎么办?如果他们预先设置了一个相对目录怎么办?如果他们要求在任何他们喜欢的地方运行一个符号链接的文件怎么办?如果他们编写的perl脚本出错并做了它喜欢的事怎么办?这里有可能你问了一个错误的问题,所以你能提供的关于具体细节的任何澄清都会很好@MarkB但如果Chuck Norris突然决定完全销毁应用程序来欺骗应用程序,该怎么办?@CarlNorum:用户首先需要在/path/to/scripts中具有写访问权限才能创建链接。当删除
。/
时,在目录下留下一个名称,最好拒绝该请求,而不是删除该链接修改它。
dir/../../../../../../../../../dangerzone/
?很好的调用。在我的场景{dir}中,{/path/to/scripts/dir}不存在。我在{path/to/scripts}下没有子目录-因此,文件系统应该在您给出的场景中给出一个错误。不过,您是正确的,有更安全的解决方案。持怀疑态度的Jule还发布了一个使用字符串搜索“.”的答案