== How to fix it in .NET

=== Code examples

The following code uses the `find` command and expects the user to enter the
name of a file to find on the system.

It is vulnerable to arguments injection because untrusted data is inserted
directly into the arguments of a process call without sanitization. +
The application assumes that incoming data always consists of a specific range
of characters and ignores that some characters might force the `find` command
to start a shell.

In this particular case, an attacker may remove files in `/some/folder` with the following string:

----
'*' -exec rm -rf {} \; 
----

==== Noncompliant code example

[source,csharp,diff-id=1,diff-type=noncompliant]
----
public class ExampleController : Controller
{
    public void Run(string args)
    {
        Process p             = new Process();
        p.StartInfo.FileName  = "/usr/bin/find";
        p.StartInfo.Arguments = "/some/folder -iname " + args;
        p.Start();
    }
}
----

==== Compliant solution

[source,csharp,diff-id=1,diff-type=compliant]
----
public class ExampleController : Controller
{
    public void Run(string args)
    {
        Process p            = new Process();
        p.StartInfo.FileName = "/usr/bin/find";
        p.StartInfo.ArgumentList.Add("/some/folder");
        p.StartInfo.ArgumentList.Add("-iname");
        p.StartInfo.ArgumentList.Add(args);
        p.Start();
    }
}
----

=== How does this work?

include::../../common/fix/introduction.adoc[]

Here `ArgumentList` takes care of escaping the passed arguments and internally
creates a single string given to the operating system when `System.Diagnostics.Process.Start()` is
called.

