PHP + MySQL Ensky / 林宏昱
PHP & MySQL以前你可能會這樣用$link = mysql_connect($host, $id, $pw);mysql_select_db($link, $db);$q = mysql_query($sql);mysql_close(...
Using MySQLiPHP組織已經打算將mysql_connect,mysql_query這些function刪掉了。why?http://www.php.net/manual/en/mysqlinfo.api.choosing.php因為...
Using MySQLi所以我這邊介紹的套件,叫做MySQLi,他是一套OO的library。我們現在就來看看要怎麼用。
MySQLi connect建立連線<?php$host   = localhost;$ip =   ensky;$pw =   ensky5566;$db =   ensky;$link   = new mysqli($host, $id, ...
MySQLi connect & close關閉連線<?php$link = new mysqli($host, $id, $pw, $db);$link->query(SET NAMES "UTF8");// do something …$l...
MySQLi Query• Mysqli的Query比較特別,  他的return值是一個object,  叫做Mysqli_result,  你可以對那個object做一些操作。• http://www.php.net/manual/en/c...
MySQLi Query$sql = SELECT * FROM `interest`;$result = $link->query($sql);$data = $result->fetch_all(MYSQLI_ASSOC);ref: htt...
Free Result• Query完要記得把result free掉$result = $link->query($sql);// 使用result$result->free();這很重要,因為result會暫存一些資訊在database那邊...
Num Rows• 有時候你只是想知道有幾行而已,沒有真  的要把資料拿出來,此時要這樣用(當然,  你也可以用COUNT(*)語句,那樣更快):$sql = SELECT * FROM `interest`;$result = $link->...
Code Demo - Query
SQL InjectionSQL好用歸好用,可是他有一些很容易疏忽的地方…MySQL有個註解符號,叫做 「--」例如我可以這樣寫SELECT * FROM user -- read all things from user table看起來一切...
SQL Injection你在判斷登入的時候阿,可能會這樣寫$sql = "SELECT * FROM `user`"     . " WHERE `id` = {$_POST[id]}"     . " AND `pw` = {$_POST[...
SQL Injection但駭客們就開始玩你囉他傳 OR 1 = 1 -- 到你的username裡面所以SQL會變成SELECT * FROM `user`WHERE `id` =  OR 1 = 1 --AND `pw` = 隨便填而此時就...
SQL Injection• 更多sql injection: Google SQL Injection而網頁設計師當然也發現了這個問題,因此MySQLi有一些過濾字串的函式可以使用,也有一些方法可以讓你不用再關心字串過濾問題。
MySQLi escape string你可以這樣做$escape_id =    $link->real_escape_string($_POST[id]);$escape_pw =    $link->real_escape_string(...
MySQLi escape string problem但是但是,每次都用$link->real_escape_string不僅很麻煩,而且常常忘記,忘記之後又很難找到錯誤,不小心就被別人入侵。所以MySQL有提供一個叫做Preparedsta...
MySQLi Prepared statement
MySQLi Prepared statement• bind_param的參數   –s   ->   String   –d   ->   double   –i   ->   integer   –b   ->   bit stream還...
Active Record不覺得每次這樣寫有點累嗎?$sql = "INSERT INTO `user` (`name`, `email`)"     . " VALUES ({$name}, {$email})";$link->query($...
Active Record即使改成prepared statement還是有點累$stmt = $link->prepare("INSERT INTO `user`"      . "(`name`, `email`) VALUES(?, ?)...
Active Record架構魔人就提出了一個DB存取概念,叫做Active record。可以讓你使用類似這種用法$insert_data = [    "name" => "ensky",    "email" => "enskylin@g...
Active Recordupdate也很快$update_data = [     "name" => "ensky1"];$db->where("name", "ensky")   ->update("user", $update_data...
Active RecordSelect呢?$result = $db->select(*)             ->from(user)             ->where(name, ensky)             ->get(...
Active RecordJoin 也很方便$db->select(*)   ->from(user_interest AS UI)   ->join(user AS U, UI.user_id=U.id)   ->get()->result_...
Active Record講那麼多,讓你心癢難騷很想用,但我不打算教你怎麼寫出這個東西。
Active Record因為身為MySQL + PHP初學者,我們要先把基礎打紮實一點,一開始先純用MySQLi來練功夫吧!等你功夫練紮實之後,我們再來寫屬於自己的MySQL Library!
Password and Hash昨天的作業你有沒有發現一件事?我們的密碼是存「明碼」!也就是你一打開.csv檔案,就會直接看到使用者的密碼!這已經是15年前的寫法了,現在因為資安考量,早就不會這樣寫。
Password and Hash有一種加密方法呢,叫做單向hash function,也就是這個hash function他沒有反函數,只要加密就回不來了的意思。但同樣的字,總是會加密成同樣的密文。最常見的加密方法是md5和sha1了md5:...
Password and Hash最基本的加密呢,就是這樣$hashed_pw = sha1($_POST[pw]);然後我們就把加密過的密碼存到db裡面可是你會想說,阿我就不知道他原本的密碼啦,這樣要怎麼判斷他輸的是不是正確?
Password and Hash很簡單!因為一樣的密碼,加密過的密文每次都一樣,所以每次user傳過來他的密碼,我就把它加密之後再和資料庫的密碼比對,就好啦!if ( $dbpassword == sha1($_POST[pw]) ){   ...
Password and Hash你有空的話其實可以   看看md5 crack你會發現有好多網站,都可以破解md5加密過的密碼。他們其實就只是用暴力法把所有9位數以內的密碼組合的md5結果存起來而已。
Password and Hash但注重使用者安全的你,可以這樣做sha1( md5($pw) . sha1($pw) );如果還不放心,可以加上一些salt(自定義字串)例如說:sha1( md5($pw) . sha1($pw) . sha...
PHP Coding style其實這可以變成一堂課,只是在那堂課還沒生出來之前我要稍微提醒一下各位一些細節。LIVE DEMO我懶得做投影片了,對不起QQ
Homework• 把昨天的登入頁面改成mysql存• mysql可以試著自己包成class,或用mysqli,  或自己拆成不同的檔案,用require_once啦進來。  我希望架構部分你可以自己想到比較好的方法。• 密碼部分要記得使用單向...
Upcoming SlideShare
Loading in …5
×

OpenWebSchool - 06 - PHP + MySQL

1,562 views
1,451 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,562
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

OpenWebSchool - 06 - PHP + MySQL

  1. 1. PHP + MySQL Ensky / 林宏昱
  2. 2. PHP & MySQL以前你可能會這樣用$link = mysql_connect($host, $id, $pw);mysql_select_db($link, $db);$q = mysql_query($sql);mysql_close($link);… blablabla
  3. 3. Using MySQLiPHP組織已經打算將mysql_connect,mysql_query這些function刪掉了。why?http://www.php.net/manual/en/mysqlinfo.api.choosing.php因為mysql_相關函式推出已經有10年了,很多功能沒有、而且很多功能容易讓使用者疏忽,而寫出很容易被入侵的程式。
  4. 4. Using MySQLi所以我這邊介紹的套件,叫做MySQLi,他是一套OO的library。我們現在就來看看要怎麼用。
  5. 5. MySQLi connect建立連線<?php$host = localhost;$ip = ensky;$pw = ensky5566;$db = ensky;$link = new mysqli($host, $id, $pw, $db);
  6. 6. MySQLi connect & close關閉連線<?php$link = new mysqli($host, $id, $pw, $db);$link->query(SET NAMES "UTF8");// do something …$link->close();
  7. 7. MySQLi Query• Mysqli的Query比較特別, 他的return值是一個object, 叫做Mysqli_result, 你可以對那個object做一些操作。• http://www.php.net/manual/en/class.mysqli-result.php
  8. 8. MySQLi Query$sql = SELECT * FROM `interest`;$result = $link->query($sql);$data = $result->fetch_all(MYSQLI_ASSOC);ref: http://www.php.net/manual/en/mysqli-result.fetch-array.php
  9. 9. Free Result• Query完要記得把result free掉$result = $link->query($sql);// 使用result$result->free();這很重要,因為result會暫存一些資訊在database那邊,而當人數一多的時候就會耗用很多資源,所以要養成用完就free的好習慣。
  10. 10. Num Rows• 有時候你只是想知道有幾行而已,沒有真 的要把資料拿出來,此時要這樣用(當然, 你也可以用COUNT(*)語句,那樣更快):$sql = SELECT * FROM `interest`;$result = $link->query($sql);$row_cnt = $result->num_rows;$result->free();
  11. 11. Code Demo - Query
  12. 12. SQL InjectionSQL好用歸好用,可是他有一些很容易疏忽的地方…MySQL有個註解符號,叫做 「--」例如我可以這樣寫SELECT * FROM user -- read all things from user table看起來一切都很好
  13. 13. SQL Injection你在判斷登入的時候阿,可能會這樣寫$sql = "SELECT * FROM `user`" . " WHERE `id` = {$_POST[id]}" . " AND `pw` = {$_POST[pw]}";有人傳ensky / ensky5566就會變成SELECT * FROM `user`WHERE `id` = enskyAND `pw` = ensky5566看起來一切都還是很好
  14. 14. SQL Injection但駭客們就開始玩你囉他傳 OR 1 = 1 -- 到你的username裡面所以SQL會變成SELECT * FROM `user`WHERE `id` = OR 1 = 1 --AND `pw` = 隨便填而此時就悲劇了,後面的判斷密碼部分備註解掉了,因此他有可能可以直接登入你的系統!
  15. 15. SQL Injection• 更多sql injection: Google SQL Injection而網頁設計師當然也發現了這個問題,因此MySQLi有一些過濾字串的函式可以使用,也有一些方法可以讓你不用再關心字串過濾問題。
  16. 16. MySQLi escape string你可以這樣做$escape_id = $link->real_escape_string($_POST[id]);$escape_pw = $link->real_escape_string($_POST[pw]);然後後面再開始用$escape_id和$escape_pw,MySQLi會自動幫你轉成不會有問題的字串
  17. 17. MySQLi escape string problem但是但是,每次都用$link->real_escape_string不僅很麻煩,而且常常忘記,忘記之後又很難找到錯誤,不小心就被別人入侵。所以MySQL有提供一個叫做Preparedstatement的方法幫助你,我這就來介紹一下。
  18. 18. MySQLi Prepared statement
  19. 19. MySQLi Prepared statement• bind_param的參數 –s -> String –d -> double –i -> integer –b -> bit stream還有很多有趣的東西可以玩看看ref: http://www.php.net/manual/en/class.mysqli-stmt.php
  20. 20. Active Record不覺得每次這樣寫有點累嗎?$sql = "INSERT INTO `user` (`name`, `email`)" . " VALUES ({$name}, {$email})";$link->query($sql);
  21. 21. Active Record即使改成prepared statement還是有點累$stmt = $link->prepare("INSERT INTO `user`" . "(`name`, `email`) VALUES(?, ?)");$stmt->bind_param("ss", $name, $email);$stmt->execute();$stmt->close();
  22. 22. Active Record架構魔人就提出了一個DB存取概念,叫做Active record。可以讓你使用類似這種用法$insert_data = [ "name" => "ensky", "email" => "enskylin@gmail.com"];$db->insert(user, $insert_data);然後還會自動幫你escape
  23. 23. Active Recordupdate也很快$update_data = [ "name" => "ensky1"];$db->where("name", "ensky") ->update("user", $update_data);UPDATE `user` SET `name`="ensky1"WHERE `name` = "ensky"
  24. 24. Active RecordSelect呢?$result = $db->select(*) ->from(user) ->where(name, ensky) ->get()->result_array();SELECT * FROM `user`WHERE `name` = "ensky"
  25. 25. Active RecordJoin 也很方便$db->select(*) ->from(user_interest AS UI) ->join(user AS U, UI.user_id=U.id) ->get()->result_array();
  26. 26. Active Record講那麼多,讓你心癢難騷很想用,但我不打算教你怎麼寫出這個東西。
  27. 27. Active Record因為身為MySQL + PHP初學者,我們要先把基礎打紮實一點,一開始先純用MySQLi來練功夫吧!等你功夫練紮實之後,我們再來寫屬於自己的MySQL Library!
  28. 28. Password and Hash昨天的作業你有沒有發現一件事?我們的密碼是存「明碼」!也就是你一打開.csv檔案,就會直接看到使用者的密碼!這已經是15年前的寫法了,現在因為資安考量,早就不會這樣寫。
  29. 29. Password and Hash有一種加密方法呢,叫做單向hash function,也就是這個hash function他沒有反函數,只要加密就回不來了的意思。但同樣的字,總是會加密成同樣的密文。最常見的加密方法是md5和sha1了md5:轉換成32位數英文數字sha1:轉換成40位數英文數字
  30. 30. Password and Hash最基本的加密呢,就是這樣$hashed_pw = sha1($_POST[pw]);然後我們就把加密過的密碼存到db裡面可是你會想說,阿我就不知道他原本的密碼啦,這樣要怎麼判斷他輸的是不是正確?
  31. 31. Password and Hash很簡單!因為一樣的密碼,加密過的密文每次都一樣,所以每次user傳過來他的密碼,我就把它加密之後再和資料庫的密碼比對,就好啦!if ( $dbpassword == sha1($_POST[pw]) ){ //認證成功!}
  32. 32. Password and Hash你有空的話其實可以 看看md5 crack你會發現有好多網站,都可以破解md5加密過的密碼。他們其實就只是用暴力法把所有9位數以內的密碼組合的md5結果存起來而已。
  33. 33. Password and Hash但注重使用者安全的你,可以這樣做sha1( md5($pw) . sha1($pw) );如果還不放心,可以加上一些salt(自定義字串)例如說:sha1( md5($pw) . sha1($pw) . sha1(ensky) );這樣保證沒有網站破的了吧XDD
  34. 34. PHP Coding style其實這可以變成一堂課,只是在那堂課還沒生出來之前我要稍微提醒一下各位一些細節。LIVE DEMO我懶得做投影片了,對不起QQ
  35. 35. Homework• 把昨天的登入頁面改成mysql存• mysql可以試著自己包成class,或用mysqli, 或自己拆成不同的檔案,用require_once啦進來。 我希望架構部分你可以自己想到比較好的方法。• 密碼部分要記得使用單向加密函數• coding style部分要記得邏輯判斷放上面• 既然學了CSS,你可以考慮將登入介面美化一下

×