有关PDO防sql注入问题
程序员文章站
2024-01-09 22:44:10
...
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 有需要特别注意什么吗?
但是....
$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'
这是正常的吗?
我输出是要做些处理?
最近才开始转用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'
这是正常的吗?
我输出是要做些处理?
下一篇: php网站如何防止sql注入?