== How to fix it in .NET

=== Code examples

include::../../common/fix/code-rationale.adoc[]

==== Noncompliant code example

[source,csharp,diff-id=1,diff-type=noncompliant]
----
public class ExampleController : Controller
{
    public void Run(string binary)
    {
        Process p = new Process();
        p.StartInfo.FileName = binary;
        p.Start();
    }
}
----

==== Compliant solution

[source,csharp,diff-id=1,diff-type=compliant]
----
public class ExampleController : Controller
{
    public void Run(string binary)
    {
        if (binary.Equals("/usr/bin/ls") || binary.Equals("/usr/bin/cat"))
        {
            // only ls and cat commands are authorized
            Process p = new Process();
            p.StartInfo.FileName = binary;
            p.Start();
        }
    }
}
----

=== How does this work?

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

include::../../common/fix/pre-approved-list.adoc[]

:sanitizationLib: System.Diagnostics.ProcessStartInfo

include::../../common/fix/sanitize-meta-characters.adoc[]

Here, using the `ProcessStartInfo` structure helps escaping the passed
arguments and internally creates a single string given to the operating system
when `System.Diagnostics.Process.Start()` is called.
