跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

有关PDO防sql注入问题

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'这是正常的吗?我输出是要做些处理?

相关文章