在 PHP 中,可以使用预处理语句(prepared statements)和参数化查询(parameterized queries)来防止 SQL 注入。
预处理语句是一种语法模板,可以在执行 SQL 语句之前先将其编译好,然后再将参数传入,避免了 SQL 注入的危险。使用预处理语句需要使用 PDO 扩展或 mysqli 扩展。
参数化查询使用占位符来代替 SQL 语句中的变量,再将变量的实际值绑定到占位符上。这种方式也可以避免 SQL 注入的危险,不过需要开发者手动操作变量的绑定,不如预处理语句来得方便。同样,使用参数化查询也需要使用 PDO 扩展或 mysqli 扩展。
以下是使用 PDO 预处理语句的示例:
$dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass);
$stmt = $dbh->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute(array($username, $password));
$results = $stmt->fetchAll();
以下是使用 PDO 参数化查询的示例:
$dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass);
$stmt = $dbh->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute(array(":username" => $username, ":password" => $password));
$results = $stmt->fetchAll();