SQL注入这个老问题之所以还能排到OWASP前十,根本原因是太多站长图省事直接拼SQL字符串。用户输入一旦混进查询语句,什么账号密码、订单数据、后台权限都能被拖出来。

PDO预处理语句把SQL结构和数据彻底分开:SQL模板里用占位符,真实数据通过bindParam绑定。数据库把模板编译一次,之后只接收数据,攻击者的恶意代码永远不会被当成SQL执行。
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 错误示范:直接拼接
// $sql = "SELECT * FROM users WHERE id = {$_GET['id']}";
// 正确做法:预处理
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>
很多老站用ACCESS,其实ASP里也能用参数化查询。ADODB.Command加Parameter对象,逻辑和PDO一样。核心不是用什么语言,而是永远别把用户输入直接塞进SQL。
如果全站改成预处理工作量太大,可以先从登录、注册、查询接口这些高风险入口改起,配合Web应用防火墙做兜底。但WAF是辅助,代码层的参数化才是根本。
A5创业网 版权所有