Upgrade to Pro — share decks privately, control downloads, hide ads and more …

06 - PHP & MySQL - OpenWebSchool

06 - PHP & MySQL - OpenWebSchool

openwebschool

August 15, 2012
Tweet

More Decks by openwebschool

Other Decks in Programming

Transcript

  1. Using MySQLi PHP 組織已經打算將mysql_connect, mysql_query這些 function 刪掉了。 why? http://www.php.net/manual/en/mysqlinfo.api.choosing.php 因為

    mysql_ 相關函式推出已經有 10 年了,很 多功能沒有、而且很多功能容易讓使用者疏 忽,而寫出很容易被入侵的程式。
  2. MySQLi connect 建立連線 <?php $host = 'localhost'; $ip = 'ensky';

    $pw = 'ensky5566'; $db = 'ensky'; $link = new mysqli($host, $id, $pw, $db);
  3. MySQLi connect & close 關閉連線 <?php $link = new mysqli($host,

    $id, $pw, $db); $link->query('SET NAMES "UTF8"'); // do something … $link->close();
  4. MySQLi Query • Mysqli 的 Query 比較特別, 他的 return 值是一個

    object , 叫做 Mysqli_result , 你可以對那個 object 做一些操作。 • http://www.php.net/manual/en/class.mysqli-result.php
  5. 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
  6. Free Result • Query 完要記得把 result free 掉 $result =

    $link->query($sql); // 使用 result $result->free(); 這很重要,因為 result 會暫存一些資訊在 database 那邊,而當人數一多的時候就會耗用 很多資源,所以要養成用完就 free 的好習慣。
  7. SQL Injection SQL 好用歸好用,可是他有一些很容易疏忽的 地方 … MySQL 有個註解符號,叫做 「 --

    」 例如我可以這樣寫 SELECT * FROM user -- read all things from user table 看起來一切都很好
  8. SQL Injection 你在判斷登入的時候阿,可能會這樣寫 $sql = "SELECT * FROM `user`" .

    " WHERE `id` = '{$_POST['id']}'" . " AND `pw` = '{$_POST['pw']}'"; 有人傳 ensky / ensky5566 就會變成 SELECT * FROM `user` WHERE `id` = 'ensky' AND `pw` = 'ensky5566' 看起來一切都還是很好
  9. SQL Injection 但駭客們就開始玩你囉 他傳 ' OR 1 = 1 --

    到你的 username 裡面 所以 SQL 會變成 SELECT * FROM `user` WHERE `id` = '' OR 1 = 1 -- AND `pw` = ' 隨便填 ' 而此時就悲劇了,後面的判斷密碼部分備註解掉 了,因此他有可能可以直接登入你的系統!
  10. SQL Injection • 更多 sql injection: Google SQL Injection 而網頁設計師當然也發現了這個問題,

    因此 MySQLi 有一些過濾字串的函式可以使用, 也有一些方法可以讓你不用再關心字串過濾 問題。
  11. MySQLi escape string 你可以這樣做 $escape_id = $link->real_escape_string($_POST['id']); $escape_pw = $link->real_escape_string($_POST['pw']);

    然後後面再開始用 $escape_id和 $escape_pw, MySQLi 會自動幫你轉成不會有問題的字串
  12. 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
  13. Active Record 即使改成 prepared statement 還是有點累 $stmt = $link->prepare("INSERT INTO

    `user`" . "(`name`, `email`) VALUES(?, ?)"); $stmt->bind_param("ss", $name, $email); $stmt->execute(); $stmt->close();
  14. Active Record 架構魔人就提出了一個 DB 存取概念,叫做 Active record 。 可以讓你使用類似這種用法 $insert_data

    = [ "name" => "ensky", "email" => "[email protected]" ]; $db->insert('user', $insert_data); 然後還會自動幫你 escape
  15. Active Record update 也很快 $update_data = [ "name" => "ensky1"

    ]; $db->where("name", "ensky") ->update("user", $update_data); UPDATE `user` SET `name`="ensky1" WHERE `name` = "ensky"
  16. Active Record Select 呢? $result = $db->select('*') ->from('user') ->where('name', 'ensky')

    ->get()->result_array(); SELECT * FROM `user` WHERE `name` = "ensky"
  17. Active Record 因為身為 MySQL + PHP 初學者, 我們要先把基礎打紮實一點, 一開始先純用 MySQLi

    來練功夫吧! 等你功夫練紮實之後, 我們再來寫屬於自己的 MySQL Library!
  18. Password and Hash 有一種加密方法呢,叫做單向 hash function , 也就是這個 hash function

    他沒有反函數, 只要加密就回不來了的意思。 但同樣的字,總是會加密成同樣的密文。 最常見的加密方法是 md5 和 sha1 了 md5:轉換成 32 位數英文數字 sha1:轉換成 40 位數英文數字
  19. Password and Hash 最基本的加密呢,就是這樣 $hashed_pw = sha1($_POST['pw']); 然後我們就把加密過的密碼存到 db 裡面

    可是你會想說,阿我就不知道他原本的密碼 啦,這樣要怎麼判斷他輸的是不是正確?
  20. Password and Hash 你有空的話其實可以 看看 md5 crack 你會發現有好多網站,都可以破解 md5 加密

    過的密碼。 他們其實就只是用暴力法把所有 9 位數以內的 密碼組合的md5結果存起來而已。
  21. Password and Hash 但注重使用者安全的你,可以這樣做 sha1( md5($pw) . sha1($pw) ); 如果還不放心,可以加上一些

    salt (自定義字串) 例如說: sha1( md5($pw) . sha1($pw) . sha1('ensky') ); 這樣保證沒有網站破的了吧 XDD
  22. Homework • 把昨天的登入頁面改成 mysql 存 • mysql 可以試著自己包成 class ,或用

    mysqli , 或自己拆成不同的檔案,用 require_once 啦進來。 我希望架構部分你可以自己想到比較好的方法。 • 密碼部分要記得使用單向加密函數 • coding style 部分要記得邏輯判斷放上面 • 既然學了 CSS ,你可以考慮將登入介面美化一下