传递引号字符(")作为c#控制台应用程序参数

本文关键字:作为 控制台 参数 应用程序 quot 字符 | 更新日期: 2023-09-27 18:08:39

我有一个项目来演示一个类似于MS-DOS命令行中的"echo"命令的程序。下面是c#中的代码:

using System;
namespace arguments
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                switch (args[0])
                {
                    case "/?":
                        string location = System.Reflection.Assembly.GetEntryAssembly().Location;
                        string name = System.IO.Path.GetFileName(location);
                        Console.WriteLine("Displays messages'nSyntax: {0} [message]", name);
                        Environment.Exit(0);
                        break;
                }
                if (args.Length >= 0)
                {
                    string x = "";
                    foreach (var item in args)
                    {
                        x += item.ToString() + " ";
                    }
                    Console.WriteLine(Convert.ToString(x)); // this should eliminate vulnerabilities.
                }
            }
            catch
            {
                string location = System.Reflection.Assembly.GetEntryAssembly().Location;
                string name = System.IO.Path.GetFileName(location);
                Console.WriteLine("Displays messages'nSyntax: {0} [message]", name);
            }
        }
    }
}

这在做它应该做的事情时非常有效。然后我开始尝试以任何可能的方式利用它。

在命令提示符中,我运行arguments.exe ",这应该打印出"。但事实并非如此。然后我通过运行echo "echo命令进行了同样的尝试,并且它,就像它应该的那样,打印出"。这真是令人难以置信,因为我甚至没有想到这会成为一个问题。我不能让它构成很大的威胁,只是让我困惑了一分钟。

我的问题是,是否有任何方法将引号(")作为参数传递给这个控制台应用程序?

这里有一张图片可以更好地演示它:http://prntscr.com/cm9yal

传递引号字符(")作为c#控制台应用程序参数

void Main(string[] args)

args数组包含传递给应用程序的参数。因为参数可能有空格,它们可以用引号括起来。

由于这个原因,您将无法获得作为参数的字符串。您还将丢失引号参数之间的任意数量的空格。

如果需要原始命令行字符串,使用:

string cmdline = System.Environment.CommandLine;

为了能够获得单引号,您需要绕过CLR在填充args数组时执行的默认解析。您可以通过检查Environment.CommandLine来做到这一点,在您上面描述的情况下,它将返回如下内容:

ConsoleApplication1.exe '"

注意,我传递的参数只是"(不是所示的转义变体)。