基于PHP PDO面向对象的固定表列查询是否存在SQL注入风险?
结论:你的写法不存在SQL注入风险
原因如下:
- 表名与列名的安全性:你明确说明
$table和$col是固定值,不来自用户输入,完全由开发者控制。即便额外做了sanitize处理(这一步其实非必须),也进一步确保了这两个参数不会被篡改。由于没有用户可控输入直接拼接到SQL结构中,这部分不存在注入风险。 - 用户输入参数的处理:唯一来自用户的
$val,你使用了PDO的参数绑定(bindParam)传递,而非直接拼入SQL字符串。PDO会自动对参数做转义处理,确保用户输入不会被解析为SQL语句的一部分,这是防范SQL注入的标准可靠做法。
你的代码回顾:
public function count_by_id($table,$col,$val) { $table=$this->sanitize($table,'string'); $col=$this->sanitize($col,'string'); $val=$this->sanitize($val,'string'); $sql= "SELECT count(*) FROM $table WHERE $col=:val"; $stmt = $this->dbConnection->prepare($sql); $stmt->bindParam(':val', $val, PDO::PARAM_STR); $stmt->execute(); $number_of_rows = $stmt->fetchColumn(); return $number_of_rows; }
调用示例:
count_by_id('users','username',$username);
count_by_id('posts','slug',$slug);
额外提醒:
如果未来业务变化需要让$table或$col支持用户输入,绝对不能直接拼接,必须通过白名单验证(比如预先定义允许的表名/列名数组,只接受数组内的值),否则会引入严重注入风险。但就当前你的使用场景而言,完全安全。
内容的提问来源于stack exchange,提问作者Vishal Rana
相关产品推荐
相关产品推荐

