Home >Backend Development >PHP Tutorial >The best solution to prevent SQL injection in php_PHP tutorial
If the user enters a query that is inserted directly into a SQL statement, the application will be vulnerable to SQL injection, such as the following example:
Use prepared statements and parameterized queries. SQL statements with any parameters will be sent to the database server and parsed! It is impossible for an attacker to maliciously inject SQL!
There are basically two options for achieving this:
1. Use PDO (PHP Data Objects)
$stmt->execute(array(':name' => $name));
foreach ($stmt as $row) {
// do something with $row
}
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
Note that when using PDO to access the MySQL database, the real prepared statements are not used by default! To resolve this issue, you must disable emulation of prepared statements. An example of using PDO to create a connection is as follows:
setAttribute() line is mandatory. It tells PDO to disable simulated prepared statements and use real prepared statements. This ensures that statements and values are not parsed by PHP before being sent to the MySQL database server (an attacker has no opportunity to inject malicious SQL).
Of course you can set the character set parameter in the constructor options, especially note that 'old' PHP versions (5.3.6) will ignore the character set parameter in the DSN.
Explanation
What happens when the SQL prepared statement you pass is parsed and compiled by the database server? Tell the database engine what you want to filter by specifying characters (like a? or like: name in the above example). Then call execute to execute the prepared statement combined with the parameter value you specified.
The most important thing here is that the parameter value is combined with a precompiled statement, not with a SQL string. The working principle of SQL injection is to create a SQL script including a malicious string by deception and send it to the database. Therefore, by sending actual separate sql parameters, you will reduce the risk. When using prepared statements, any parameters you send, will only be treated as strings (although the database engine may do some parameter optimization, of course eventually may be a number). In the above example, if the variable $name contains 'sarah';DELETE * FROM employees, the result will only be a search string "'sarah';DELETE * FROM employees", you will not get An empty table.
Another benefit of using prepared statements is that if you execute the same statement multiple times in the same session, this will only be parsed and compiled once, giving you some speed gains.
Oh, since you asked how to do the insert, here is an example (using PDO):