如何使用PDO查询mysql避免SQL注入的方法
使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严紧,就有SQL注入风险。虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。而使用PHP的PDO扩展的 prepare 方法,就可以避免sql injection 风险。
PDO(PHP Data Object) 是PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,如 php_mysql.dll。 PHP6中也将默认使用PDO的方式连接,mysql扩展将被作为辅助 。官方地址:http://php.net/manual/en/book.pdo.php
1. PDO配置
使用PDO扩展之前,先要启用这个扩展,php.ini中,去掉"extension=php_pdo.dll"前面的";"号,若要连接数据库,还需要去掉与PDO相关的数据库扩展前面的";"号(一般用的是php_pdo_mysql.dll),然后重启Apache服务器即可。
extension=php_pdo.dll extension=php_pdo_mysql.dll
2. PDO连接mysql数据库
$dbh = new PDO("mysql:host=localhost;dbname=mydb","root","password");
默认不是长连接,若要使用数据库长连接,可以在最后加如下参数:
$dbh = new PDO("mysql:host=localhost;dbname=mydb","root","password","array(PDO::ATTR_PERSISTENT => true) "); $dbh = null; //(释放)
3. PDO设置属性
PDO有三种错误处理方式:
PDO::ERrmODE_SILENT不显示错误信息,只设置错误码
PDO::ERrmODE_WARNING显示警告错
PDO::ERrmODE_EXCEPTION抛出异常
可通过以下语句来设置错误处理方式为抛出异常
$db->setAttribute(PDO::ATTR_ERrmODE, PDO::ERrmODE_EXCEPTION);
因为不同数据库对返回的字段名称大小写处理不同,所以PDO提供了PDO::ATTR_CASE设置项(包括PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER),来确定返回的字段名称的大小写。
通过设置PDO::ATTR_ORACLE_NULLS类型(包括PDO::NULL_NATURAL,PDO::NULL_EmpTY_STRING,PDO::NULL_TO_STRING)来指定数据库返回的NULL值在php中对应的数值。
4. PDO常用方法及其应用
PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作
PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作
PDO::prepare() 主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大(防止sql注入就靠这个)
PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID
PDOStatement::fetch() 是用来获取一条记录
PDOStatement::fetchAll() 是获取所有记录集到一个集合
PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段
PDOStatement::rowCount() :主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。
5.PDO操作MYSQL数据库实例
<?php $pdo = new PDO("mysql:host=localhost;dbname=mydb","root",""); if($pdo -> exec("insert into mytable(name,content) values('fdipzone','123456')")){ echo "insert success"; echo $pdo -> lastinsertid(); } ?>
<?php $pdo = new PDO("mysql:host=localhost;dbname=mydb","root",""); $rs = $pdo -> query("select * from table"); $rs->setFetchMode(PDO::FETCH_ASSOC); //关联数组形式 //$rs->setFetchMode(PDO::FETCH_NUM); //数字索引数组形式 while($row = $rs -> fetch()){ print_r($row); } ?>
<?php foreach( $db->query( "SELECT * FROM table" ) as $row ) { print_r( $row ); } ?>
统计有多少行数据:
<?php $sql="select count(*) from table"; $num = $dbh->query($sql)->fetchColumn(); ?>
prepare方式:
<?php $query = $dbh->prepare("select * from table"); if ($query->execute()) { while ($row = $query->fetch()) { print_r($row); } } ?>
prepare参数化查询:
<?php $query = $dbh->prepare("select * from table where id = ?"); if ($query->execute(array(1000))) { while ($row = $query->fetch(PDO::FETCH_ASSOC)) { print_r($row); } } ?>
使用PDO访问MySQL数据库时,真正的real prepared statements 默认情况下是不使用的。为了解决这个问题,你必须禁用 prepared statements的仿真效果。下面是使用PDO创建链接的例子:
<?php $dbh = new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8', 'root', 'pass'); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); ?>
setAttribute()这一行是强制性的,它会告诉 PDO 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。
虽然你可以配置文件中设置字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 PHP( < 5.3.6)在DSN中是忽略字符参数的。
完整的代码使用实例:
<?php $dbh = new PDO("mysql:host=localhost; dbname=mydb", "root", "pass"); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果 $dbh->exec("set names 'utf8'"); $sql="select * from table where username = ? and password = ?"; $query = $dbh->prepare($sql); $exeres = $query->execute(array($username, $pass)); if ($exeres) { while ($row = $query->fetch(PDO::FETCH_ASSOC)) { print_r($row); } } $dbh = null; ?>
上面这段代码就可以防范sql注入。为什么呢?
当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,它们是分开传送的,两者独立的,SQL攻击者没有一点机会。
但是我们需要注意的是以下几种情况,PDO并不能帮助你防范SQL注入。
不能让占位符 ? 代替一组值,这样只会获取到这组数据的第一个值,如:
select * from table where userid in ( ? );
如果要用in來查找,可以改用find_in_set()实现
$ids = '1,2,3,4,5,6'; select * from table where find_in_set(userid, ?);
不能让占位符代替数据表名或列名,如:
select * from table order by ?;
不能让占位符 ? 代替任何其他SQL语法,如:
select extract( ? from addtime) as mytime from table;
本篇文章如何使用PDO查询mysql避免SQL注入的方法,更多相关内容请关注php中文网。
相关推荐:
关于HTML5 localStorage and sessionStorage 之间的区别
Atas ialah kandungan terperinci 如何使用PDO查询mysql避免SQL注入的方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP ialah bahasa pembangunan web popular yang telah digunakan sejak sekian lama. Kelas PDO (Objek Data PHP) yang disepadukan dalam PHP adalah cara biasa untuk kita berinteraksi dengan pangkalan data semasa pembangunan aplikasi web. Walau bagaimanapun, masalah yang sering dihadapi oleh sesetengah pembangun PHP ialah apabila menggunakan kelas PDO untuk berinteraksi dengan pangkalan data, mereka menerima ralat seperti ini: PHPFatalerror:CalltoundefinedmethodPDO::prep

PHP dan PDO: Cara melakukan sisipan kelompok dan kemas kini Pengenalan: Apabila menggunakan PHP untuk menulis aplikasi berkaitan pangkalan data, anda sering menghadapi situasi di mana anda perlu memasukkan dan mengemas kini data secara berkelompok. Pendekatan tradisional adalah dengan menggunakan gelung untuk melaksanakan pelbagai operasi pangkalan data, tetapi kaedah ini tidak cekap. PDO PHP (PHPDataObject) menyediakan cara yang lebih cekap untuk melaksanakan operasi sisipan dan kemas kini kelompok Artikel ini akan memperkenalkan cara menggunakan PDO untuk melaksanakan operasi sisipan dan kemas kini kelompok. 1. Pengenalan kepada PDO: PDO ialah PH

PDOPDO ialah lapisan abstraksi akses pangkalan data berorientasikan objek yang menyediakan antara muka bersatu untuk PHP, membolehkan anda menggunakan kod yang sama untuk berinteraksi dengan pangkalan data yang berbeza (seperti Mysql, postgresql, oracle). PDO menyembunyikan kerumitan sambungan pangkalan data asas dan memudahkan operasi pangkalan data. Kebaikan dan Kelemahan Kelebihan: Antara muka bersatu, menyokong berbilang pangkalan data, memudahkan operasi pangkalan data, mengurangkan kesukaran pembangunan, menyediakan penyata yang disediakan, meningkatkan keselamatan, menyokong pemprosesan transaksi Kelemahan: prestasi mungkin lebih rendah sedikit daripada sambungan asli, bergantung pada perpustakaan luaran, mungkin meningkatkan overhed, kod demo menggunakan PDO Sambung ke pangkalan data mysql: $db=newPDO("mysql:host=localhost;dbnam

PHP dan PDO: Cara mengendalikan data JSON dalam pangkalan data Dalam pembangunan web moden, memproses dan menyimpan sejumlah besar data adalah tugas yang sangat penting. Dengan populariti aplikasi mudah alih dan pengkomputeran awan, semakin banyak data disimpan dalam pangkalan data dalam format JSON (JavaScript Object Notation). Sebagai bahasa sebelah pelayan yang biasa digunakan, sambungan PDO (PHPDataObject) PHP menyediakan cara yang mudah untuk memproses dan mengendalikan pangkalan data. Buku

Nginx ialah pelayan web yang pantas, berprestasi tinggi, berskala, dan keselamatannya merupakan isu yang tidak boleh diabaikan dalam pembangunan aplikasi web. Terutamanya serangan suntikan SQL, yang boleh menyebabkan kerosakan besar pada aplikasi web. Dalam artikel ini, kami akan membincangkan cara menggunakan Nginx untuk menghalang serangan suntikan SQL untuk melindungi keselamatan aplikasi web. Apakah serangan suntikan SQL? Serangan suntikan SQL ialah kaedah serangan yang mengeksploitasi kelemahan dalam aplikasi web. Penyerang boleh menyuntik kod hasad ke dalam aplikasi web

PHP dan PDO: Cara membuat pertanyaan dan memaparkan data dalam halaman Apabila membangunkan aplikasi web, menanya dan memaparkan data dalam halaman adalah keperluan yang sangat biasa. Melalui paging, kami boleh memaparkan sejumlah data pada satu masa, meningkatkan kelajuan pemuatan halaman dan pengalaman pengguna. Dalam PHP, fungsi pertanyaan paging dan paparan data boleh direalisasikan dengan mudah menggunakan perpustakaan PHP Data Object (PDO). Artikel ini akan memperkenalkan cara menggunakan PDO dalam PHP untuk bertanya dan memaparkan data mengikut halaman, dan memberikan contoh kod yang sepadan. 1. Buat pangkalan data dan jadual data

PHP dan PDO: Bagaimana untuk melakukan carian teks penuh dalam pangkalan data Dalam aplikasi web moden, pangkalan data adalah komponen yang sangat penting. Carian teks penuh ialah ciri yang sangat berguna apabila kita perlu mencari maklumat khusus daripada jumlah data yang besar. PHP dan PDO (PHPDataObjects) menyediakan cara yang mudah tetapi berkuasa untuk melaksanakan carian teks penuh dalam pangkalan data. Artikel ini akan memperkenalkan cara menggunakan PHP dan PDO untuk melaksanakan carian teks penuh dan menyediakan beberapa kod sampel untuk menunjukkan proses tersebut. pertama

Cara menggunakan PDO untuk menyambung ke pangkalan data Redis adalah sumber terbuka, berprestasi tinggi, pangkalan data nilai kunci storan dalam memori yang biasa digunakan dalam cache, baris gilir dan senario lain. Dalam pembangunan PHP, menggunakan Redis boleh meningkatkan prestasi dan kestabilan aplikasi dengan berkesan. Melalui sambungan PDO (PHPDataObjects), kami boleh menyambung dan mengendalikan pangkalan data Redis dengan lebih mudah. Artikel ini akan menerangkan cara menggunakan PDO untuk menyambung ke pangkalan data Redis, dengan contoh kod. Pasang sambungan Redis pada mulanya
