当前位置:Gxlcms > PHP教程 > 有关PDO防sql注入问题

有关PDO防sql注入问题

时间:2021-07-01 10:21:17 帮助过:9人阅读

php还算新手
最近才开始转用pdo的


请教一
以前知道用mysql_real_escape_string

但是最近才知道 pdo是不能用mysql_real_escape_string
因为这个函数好像是要用mysql_connect() 先连好才能用的

还知道了要用bindParam这类的写法配合预处理


$stmt = $dbh->prepare ("INSERT INTO user (firstname, surname) VALUES (:f-name, :s-name)");
$stmt -> bindParam(':f-name', 'John');
$stmt -> bindParam(':s-name', 'Smith');
$stmt -> execute();


想请教一下bindParam是否已经足够安全?

还是用bindValue会更好?



请教二

相比mysql_real_escape_string好像麻烦点?

mysql_real_escape_string 处理后....写入数据库时

Tom's Book 在PHP中显示处理成 Tom\'s Book

但写入数据库中,是只保存 Tom's Book

这一点在前台显示时,是非常方便的,因为毕竟的纯粹的SELECT麻,也应该没什么安全问题...吧?

但是问题来了

既然bindParam自动加上了转义,甚至保存到数据库中,那我不知道前台有什么地方需要用到stripslashes()这个函数

难度每个地方都加吗?

有关这问题只有三个可能吧?

1. PDO有其他防SQL注入的方法?? 保存时可以不用保存 "\" 这符号?
2. 有可能有配置文件加入一些东西...把全站都加上stripslashes()? 貌似不太可行?
3. 老老实实,除了日期或分类ID之外的,慢慢的一个个加上?



另外也想请教一下
$stmt = $dbh->prepare ("INSERT INTO user (firstname, surname) VALUES (:f-name, :s-name)");
$stmt -> bindParam(':f-name', 'John');
$stmt -> bindParam(':s-name', 'Smith');
$stmt -> execute();

除了用"?"以外,这一类的写法算合理吗?

还有,官方也提议我们用PDO需要升到5.3.6? 那还是直接升5.4 有需要特别注意什么吗?


回复讨论(解决方案)

确实是新手,还不知道 PDO::quote 方法的存在
用PDO需要升到5.3.6,是因为直到5.3.6,PDO才具有实用价值。之前的所有版本都存在着各种严重问题

prepare 准备
bindParam 绑定参数
这是为一条SQL多次使用(仅参数不同)准备的,而无需每轮都组装查询串

php 是通过 magic_quotes_gpc 来决定是否对外来数据做转义处理的
php 5.3.6及以后默认关闭
php5.4.0及以后忽视它的存在
也就是说:安全问题是你自己的问题,php不打算替你完成了

用了
prepare
bindParam

是否也不足够

要用PDO::quote?

那想请问一下

用quote的话不是取代了prepare?
就不能预处理或者批量insert?

预处理后用 execute 和 直接用 query 是两条路
quote 是转义,对于预处理后的 execute 会自动隐式执行
对于 query 需自己显式的执行

预处理后用 execute 和 直接用 query 是两条路
quote 是转义,对于预处理后的 execute 会自动隐式执行
对于 query 需自己显式的执行

明白了??

但是....
$sql = "INSERT INTO foo (id,name) VALUES ('',:name)";
$stmt = $pdo->prepare($sql);

$stmt->bindParam(':name', $name);

$name = $pdo->quote($_POST["name"]);

$stmt->execute();


比如我输入:peter's book

但为什么会保存成'peter's book'

这是正常的吗?

我输出是要做些处理?

人气教程排行