== How to fix it in Python Standard Library === Code examples include::../../common/fix/code-rationale.adoc[] Especially, in this example, if the *host* request parameter contains system shell control characters, the expected `ping` command behavior will be changed. ==== Noncompliant code example [source,python,diff-id=11,diff-type=noncompliant] ---- from flask import Flask, request import os app = Flask(__name__) @app.route('/example') def example(): host = request.args.get("host", "www.google.com") status = os.system("ping -c 1 %s" % host) # Noncompliant return str(status == 0) ---- ==== Compliant solution [source,python,diff-id=11,diff-type=compliant] ---- from flask import Flask, request import os app = Flask(__name__) @app.route('/example') def example(): host = request.args.get("host", "www.google.com") status = subprocess.run(["ping", "-c", "1", "--", host]).returncode return str(status == 0) ---- === How does this work? include::../../common/fix/introduction.adoc[] include::../../common/fix/pre-approved-list.adoc[] :sanitizationLib: subprocess include::../../common/fix/sanitize-meta-characters.adoc[] In the example compliant code, using the `subprocess.run` function helps to escape the passed arguments. It accepts a list of command arguments that will be properly escaped and concatenated to form the command line to execute. include::../../common/fix/shell_integration.adoc[] In the example compliant code, using the `subprocess` module's functions is preferred over older alternative as the `os` or `popen` modules. Indeed, `subprocess`, while still a dangerous library, disables the system shell's syntax interpretation by default.