硬核PHP教程:从入门到防SQL注入
|
PHP是一门简单却容易误用的语言。很多新手写完“Hello World”就直奔数据库操作,结果在第一行SQL查询里埋下安全地雷。真正的硬核,不是堆砌高阶语法,而是从第一天就建立安全直觉。 直接拼接用户输入进SQL语句是最常见也最危险的做法。比如:$sql = "SELECT FROM users WHERE name = '$name'";。当用户输入' OR '1'='1时,整条语句变成SELECT FROM users WHERE name = '' OR '1'='1',轻松绕过身份验证。这不是黑客技术多高明,而是代码把钥匙直接递了过去。 PHP原生支持PDO和MySQLi两大扩展,它们都内置了参数化查询能力。使用PDO时,只需将具体值用占位符代替,再单独传入:$stmt = $pdo->prepare("SELECT FROM users WHERE id = ?"); $stmt->execute([$id]);。问号(?)或命名参数(:id)不会被解析为SQL代码,无论$id里塞进多少单引号、分号或注释符,都被当作纯字符串处理。 注意:预处理语句不能防范所有注入场景。表名、字段名、排序方向(ASC/DESC)、LIMIT的数字等属于SQL结构的一部分,无法用参数化绑定。这时必须白名单校验:如排序字段只允许'created_at','score'两个值;分页数量强制转换为(int)并设上限;表名从固定数组中选取,绝不接受任意字符串。 魔术引号(magic_quotes_gpc)早已废弃,不要用addslashes()代替预处理——它仅转义单引号、反斜杠等,对十六进制编码、宽字节注入等完全无效,反而制造虚假安全感。同理,htmlspecialchars()用于防XSS,对SQL注入毫无作用。
AI绘图,仅供参考 启用PDO的ERRMODE_EXCEPTION模式:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。这样数据库错误会抛出异常而非静默失败,便于快速发现未捕获的查询异常,也避免因错误信息泄露数据库结构。最小权限原则同样关键。应用数据库账号不应拥有DROP TABLE、CREATE USER等权限,只需SELECT、INSERT、UPDATE、DELETE和必要索引操作。即便SQL注入得逞,攻击者也无法删库跑路。 别忘了配合输入过滤:对手机号用正则验证格式,邮箱用filter_var($email, FILTER_VALIDATE_EMAIL),整数一律强制类型转换(int)$input。过滤与参数化不是二选一,而是纵深防御的两层护盾。 最后记住:没有“防SQL注入函数”,只有安全的编程习惯。每一次执行SQL,都要问自己——这个变量是程序员写的,还是用户送来的?如果是后者,请立刻放进prepare()的怀抱。硬核不是烧脑,而是让正确的事成为肌肉记忆。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

