API có thể được xây dựng theo dạng Thủ tục 3 Hướng đối tượng Thông thường khi kết nối với database MySQL, thì ứngdụng PHP kết nối thông qua các thành phần API đượccung cấp sẵn.. PHP’s
Trang 1PHP & MYSQL NÂNG CAO
ThS Nguyễn Hà Giang
Trang 3Định nghĩa lớp, phương thức, hàm và biến cho phép ứng
dụng gọi để thực hiện một nhiệm vụ nào đó
API có thể được xây dựng theo dạng
Thủ tục
3
Hướng đối tượng
Thông thường khi kết nối với database MySQL, thì ứngdụng PHP kết nối thông qua các thành phần API đượccung cấp sẵn
PHP App API MySQL
Trang 5Trong PHP thường thấy khái niệm extension
PHP bao gồm core và phần extension
Chức năng kết nối MySQL là một dạng
Trang 6MySQL API trong PHP
Gồm có 3 API option chính
6
Trang 7PHP’s MySQL Extension
Đây là extension cơ bản nhất cho phép kết nối với MySQL
Mysql chỉ cung cấp giao diện hướng thủ tục và chỉ sử dụngphiên bản MySQL 4.1.3 về trước
Có thể sử dụng với phiên bản 4.1.3 về sau nhưng không hỗ
7
trợ các chức năng bổ sung của phiên bản mới
Mã nguồn được định vị trong thư mục mở rộng ext/mysql
Do được xây dựng theo dạng thủ tục nên việc sử dụng khá
đơn giản
Trang 8PHP’s MySQLi Extension
Còn được gọi là phiên bản MySQLMySQL IImprovedmproved Extension Extension
Được phát triển nhằm sử dụng các đặc tính mới có trong phiên bản MySQL server 4.1.3
MySQLi có trong phiên bản PHP 5 về sau.
Đặc tính cải tiến
8
Đặc tính cải tiến
Object-oriented interface
Support for prepared statement, multiple statement
Support for transaction
Enhanced debugging capabilities
Embedded server support
Giao diện hướng thủ tục cũng được cung cấp kèm theo!
Trang 9PDO (PHP Data Object)
PDO là lớplớp trừutrừu tượngtượng databasedatabase cho ứng dụng PHP
Cung cấp các API cho ứng dụng PHP mà không quan tâm
đến kiểu database server kết nối
Theo lý thuyết, nếu sử dụng PDO API, có thể chuyển
9
database server sử dụng từ PostgreSQL đến MySQL vớimột ít sự thay đổi trong code PHP
Ưu điểm: đơn giản, khả chuyển
Nhược: không cho phép sử dụng tất cả các đặc tính nângcao của phiên bản cuối cùng MySQL
Trang 10Thao tác PDO
Trang 11Đóng kết nối
Tên database Lớp PDO
Trang 12$db = new PDO ( 'mysql:dbname=test' , $user , $pass );
$result = $dbh -> query ( 'SELECT * FROM BOOKS' );
$result = $dbh -> query ( 'SELECT * FROM BOOKS' );
foreach( $result as $row ) {
print_r ( $row );
}
$db = null ; }
Trang 13Sử dụng PDO object
13
try{
// tạo đối tượng PDO
$pdo = new PDO ( 'mysql:dbname=lab3' , $user , $pass );
// thực thi câu truy vấn
$result = $pdo- > query ( 'select title, author from books' );
foreach ($result as $row ) // lặp qua từng dòng {
Trang 14Sử dụng PDO object
14
try{
$pdo = new PDO ( ' mysql:dbname=lab3 ', $user , $pass );
$stmt = $pdo -> prepare ('SELECT * FROM BOOKS WHERE id=?' );
while ($row = $stmt- > fetch ( PDO::FETCH_ASSOC ) {
printf( 'Title: %s<br />Author: %s <p /> ',
Trang 15Sử dụng PDO object
15
try {
$pdo = new PDO ( 'mysql:dbname=lab3' , $user , $pass );
$stmt = $pdo- > prepare ( 'SELECT * FROM BOOKS WHERE
author=:author AND price>:price'); // kết buộc tham số
$stmt -> bindParam (':author', $author , PDO::PARAM_STR );
$stmt -> bindParam (':price', $price , PDO::PARAM_STR );
$stmt -> execute (); // th c thi câu truy v n
VD 3
$stmt -> execute (); // thực thi câu truy vấn
while ( $row = $stmt -> fetch ( PDO::FETCH_OBJ ))// lấy kq từng dòng {
printf ( 'Title: %s<br />Author: %s <p />' ,
$row -> title , $row -> author ); }
$pdo = NULL ; // đóng kết nối }
catch ( PDOException $e ) { printf( 'Error: %s' , $e -> GetMessage ());
}
Trang 16Sử dụng PDO object
16
VD 4
try {
$pdo = new PDO ( 'mysql:dbname=lab3' , $user , $pass );
$stmt = $pdo- > prepare ('SELECT title,author FROM BOOKS WHERE
price>:price');
// kết buộc tham số
$stmt -> bindParam (':price', $price , PDO::PARAM_STR );
$stmt -> bindColumn ('title', $title , PDO::PARAM_STR );
$stmt -> bindColumn ('title', $title , PDO::PARAM_STR );
$stmt -> bindColumn ('author', $author , PDO::PARAM_STR );
$stmt -> execute (); // thực thi câu truy vấn while ( $stmt -> fetch ( PDO::FETCH_BOUND ))// lấy kq từng dòng {
printf ( 'Title: %s<br />Author: %s <p />' ,
}
Trang 17Thao tác MySQLi
Trang 18Sử dụng MySQLi
Tạo đối tượng mysqli
18
define ( 'SERVER' , 'localhost' );
define ( 'USER' , 'root' );
define ( 'PASS' , '' );
define ( 'DB' , 'myDB' );
define ( 'DB' , 'myDB' );
…
$sqli = new mysqli( SERVER, USER, PASS, DB );
if ( mysqli_connect_errno ()) // nếu có lỗi kết nối
{
printf ( "Connect fail: %d" , mysqli_connect_error ());
}
Trang 19Sử dụng MySQLi
Truy vấn dữ liệu (1)
19
…
$query = "SELECT * FROM BOOKS" ;
if ($result = $mysqli -> query ( $query )) //thực thi truy vấn
if ($result = $mysqli -> query ( $query )) //thực thi truy vấn
{
// hiển thị số dòng truy vấn được
printf ( "Return Row: %d" , $result -> num_rows );
}
Trang 20Sử dụng MySQLi
Truy vấn dữ liệu (2)
20
$query = "SELECT title, author, price from BOOKS" ;
if ( $result = $mysqli ->query( $query )) {
while ( $obj = $result ->fetch_object()) { // lấy giá trị field theo dạng thuộc tính obj
{ // lấy giá trị field theo dạng thuộc tính obj
echo "Title: $obj->title <br />" ; echo "Author: $obj->author <br />" ; echo "Price: $obj->price <p>" ;
} }
Trang 21MySQLi – Prepare Statement
Cho phép khai báo câu lệnh SQL trước
Bổ sung các tham số vào câu lệnh
Cho phép sử dụng lại nhiều lần câu lệnh SQL
Thích hợp cho lệnh Insert: lúc đó chỉ thay đổi giá trị của tham số!
21
tham số!
Các phương thức sử dụng cho prepare statement
prepare(‘câu lệnh SQL’): khai báo câu lệnh SQL
bind_param(type, param): binding các tham số cho câu lệnh
execute(): thực thi câu lệnh prepare
bind_result(var1,var2,…): binding kết quả với các biến
Trang 22Sử dụng MySQLi
Sử dụng prepare statement
22
$myID = 2 ; // id của sách (để test)
$query = "SELECT title, author from BOOKS where id>?";
$stmt = $mysqli -> prepare ( $query );
$stmt -> bind_param ( "d" , $myID ); // kết buộc tham số
Trang 23$query ="SELECT title,author FROM BOOKS WHERE id>? AND price >?";
$stmt = $mysqli -> prepare ( $query );
$stmt -> bind_param ( "dd" , $myID , $price );
Trang 24Hậu quả của SQL injection
Kẻ xấu vượt qua được kiểm tra đăng nhập
Có thể xem, thay đổi và tệ hơn là xóa dữ liệu trong database
Trang 25SQL injection – VD1
Cho form nhập liệu như sau
25
Trang 28SQL injection – VD2
Cho form đăng nhập như sau
28
Trang 32Cross-site scripting (XSS)
XSS:
Là một dạng kỹ thuật tấn công phổ biến hiện nay
Là vấn đề bảo mật quan trọng đối với người phát triển ứng dụng web cũng như người sử dụng.
Một số các trang web phổ biến cũng từng dính XSS như
Trang 33Cross-site scripting
Tấn công bằng cách chèn vào các web động (ASP, PHP,CGI, JSP…) các đoạn mã script nguy hiểm để thực hiệnmột hành động nào đó
Các đoạn mã được chèn vào hầu hết được viết bằng cácclient-side scripting như javascript, jscript, DHTML
33
client-side scripting như javascript, jscript, DHTML
VấnVấn đềđề nguynguy hiểmhiểm: kẻ tấn công cố tạo ra những mã độc
và gởi chúng cho nạn nhân, nạn nhân không nghi ngờ vàkích vào, đoạn mã độc thực thi, có thể lấy thông tincookie của nạn nhân gởi về cho kẻ tấn công!
Trang 34Cross-site scripting
Cơ bản XSS cũng giống như SQL Injection, nó cũng gởicác request từ client đến server nhằm chèn các thông tinvượt quá tầm kiểm soát của server
Có thể là một request được gởi từ form dữ liệu
ttp://www.example.com/search.cgi?query=<script>alert('XSS was found !');</script>
Trang 35Cross-site scripting
Khác với kỹ thuật tấn công khác gây tổn hại cho server,còn XSS chỉ gây tổn hại ở phía client mà nạn nhân trựctiếp là người duyệt website đó
Bản chất của XSS là chỉ tấn công vào bề mặt của site, do
Trang 36Cross-site scripting
Minh họa 1
36
Trang 38Cross-site scripting
Minh họa 2
38
File: demoXSS.php Đơn giản nhận tham số query string là id và hiển thị về trình duyệt
demoXSS.php thị về trình duyệt
User nhập URL như sau
Điều gì xảy ra khi ai đó link thực thi đến file
script ở host khác, rồi send URL này cho victim?