网上搜到一篇 PHP 防SQL注入的文章
原文地址E文不算很好,理解不够全面,求前辈们解释一下。下面是我学习PDO后自己写的代码。php.iniextension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll求教:PHP PDO 模块,真的可以防SQL注入?用了那个$db->prepare,真的连addslashes都不需要了?
另外, PDO设置连接超时,也是 set_time_limit(秒数)?谢谢。$dbms='mysql';
$host='localhost';
$dbName='test';
$user='root';
$pass='root';
$dsn="$dbms:host=$host;dbname=$dbName";
$db = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';"));
$preparedStatement = $db->prepare('INSERT INTO mytable (title,content,date) VALUES (:title,:content,:date)');
$preparedStatement->execute(array(':title' => '$_POST['title']',':content' => '$_POST['content']',':date' => '$_POST['date']'));
原文地址E文不算很好,理解不够全面,求前辈们解释一下。下面是我学习PDO后自己写的代码。php.iniextension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll求教:PHP PDO 模块,真的可以防SQL注入?用了那个$db->prepare,真的连addslashes都不需要了?
另外, PDO设置连接超时,也是 set_time_limit(秒数)?谢谢。$dbms='mysql';
$host='localhost';
$dbName='test';
$user='root';
$pass='root';
$dsn="$dbms:host=$host;dbname=$dbName";
$db = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';"));
$preparedStatement = $db->prepare('INSERT INTO mytable (title,content,date) VALUES (:title,:content,:date)');
$preparedStatement->execute(array(':title' => '$_POST['title']',':content' => '$_POST['content']',':date' => '$_POST['date']'));
n久不用pdo了,记不太清了,我记得当时都是用pdo的quote过滤。
最好的测试方法是打开mysql的query log,模拟一些数据尝试注入(gpc quote打开和关闭都要尝试),然后去log文件看最终语句生成
pdo的中文教程不多,网上有的都是抄来抄去的那2篇。
打算再搜搜E文的介绍。
由于 SQL 指令中,串的分界符是单引号,所以需要对串中的单引号做转义处理PDO 是封装好的数据库操作类,自然也就封装了自己的转义方法 quote,而无需借助第三方注意这只是转义,而不是过滤所谓 SQL 注入,是源于 mssql 提供的 HTTP 协议的查询功能的。
用户可以通过 url 参数访问 mssql 数据库,mssql 以列表方式给出结果;
由于 mssql 的存储过程具有仅次于管理员的权限,并具有访问操作系统的能力。
所以一旦被利用,就可能导致灾难性后果php 对于 SQL 注入采取了以下防范措施
1、magic_quotes_gpc 自动转义,php5.3 起已不可关闭
2、除声明存储过程的 SQL 指令外,所用 SQL 指令都不允许出现语句结束符“;”(当然串中的是例外),即
每次只能执行一条指令。杜绝了通过重构 SQL 指令串造成攻击的可能性
3、不可能通过 php 提供的数据库操作函数在一句代码中完成查询与输出动作,给伪造查询条件获取私密资料带来困难。PDO 反而是可以的