==== Use prepared statements

As a rule of thumb, the best approach to protect against injections is to
systematically ensure that untrusted data cannot break out of an interpreted
context.

For database queries, prepared statements are a natural mechanism to achieve
this due to their internal workings. +
Here is an example with the following query string (Java SE syntax):

----
SELECT * FROM users WHERE user = ? AND pass = ?
----

*Note: Placeholders may take different forms, depending on the library used. For the above example, the question mark symbol '?' was used as a placeholder.*

When a prepared statement is used by an application, the database server
compiles the query logic even before the application passes the literals
corresponding to the placeholders to the database. +
Some libraries expose a `prepareStatement` function that explicitly does so,
and some do not - because they do it transparently.

The compiled code that contains the query logic also includes the placeholders:
they serve as parameters.

After compilation, the query logic is frozen and cannot be changed. +
So when the application passes the literals that replace the placeholders, they
are not considered application logic by the database.

Consequently, the database server prevents the dynamic literals of a prepared
statement from affecting the underlying query, and thus sanitizes them.

On the other hand, the application does not automatically sanitize third-party
data (for example, user-controlled data) inserted directly into a query. An
attacker who controls this third-party data can cause the database to execute
malicious code.

