[教學] 看到板上有人發PDO的文,我來寫個登入的吧

看板PHP作者 (mingtsay〃小喵)時間12年前 (2013/07/14 16:52), 編輯推噓7(7019)
留言26則, 12人參與, 最新討論串1/2 (看更多)
請各位多指教囉! <?php $db = new PDO("mysql:host=localhost;dbname=web", "username", "password"); if (isset($_POST['username']) && isset($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT `id`, `password` FROM `users` " . "WHERE `username` = :username LIMIT 1"; $login = $db->prepare($sql); $login->bindParam(":username", $username); $login->execute(); $user = $login->fetch(); if ($user && $user['password'] == $password) { $_SESSION['login'] = true; $_SESSION['uid'] = $user['id']; header("location: /"); } else { header("location: /login.php"); } } else { $html = '<!DOCTYPE html> <form action="login.php" method="post"> <input type="text" name="username" /> <input type="password" name="password" /> <input type="submit" value="登入" /> </form>'; header("Content-Type: text/html;charset=utf-8"); header("Content-Length: " . strlen($html)); echo($html); } ?> -- 〞` ◥◣◢◣◢◣ ◢▏。 ○ ο ° ██◤ █◤◥◤█ o ° ◤ ◥ █ █ ╱﹋ ˍ ◤◤ ◢◤ ◢◤██◣ ◢ ◢◤ ◤ingsay ◢███ ζ ) ) mt.rmstudio.tw mt@moztw.org ◤◤ wnqui -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.67.27

07/14 22:52, , 1F
沒習慣用PDO,看到 $_POST 直接拿來用會抖一下...XD
07/14 22:52, 1F

07/14 23:01, , 2F
db存明碼更抖~
07/14 23:01, 2F

07/15 00:43, , 3F
哎呦,這只是個PDO的應用範例咩~(搖尾#
07/15 00:43, 3F

07/15 08:04, , 4F
其實有bindParam還好,不過password用明碼存?
07/15 08:04, 4F

07/15 08:04, , 5F
而且怎麼不是丟進sql去比對而直接比,這樣一樣有問題
07/15 08:04, 5F

07/15 09:49, , 6F
不管是pdo、原生mysql、mysqli或是active record......
07/15 09:49, 6F

07/15 09:50, , 7F
第一件事,都是先過濾掉所有造成sql injection的原因。
07/15 09:50, 7F

07/15 20:45, , 8F
五樓指的問題是??
07/15 20:45, 8F

07/15 21:26, , 9F
問題就在於用明碼存
07/15 21:26, 9F

07/15 21:33, , 10F
五樓的說法感覺除了密碼沒做hash 還有其它問題@@
07/15 21:33, 10F

07/15 21:37, , 11F
你寫的這個有漏洞,POST的值沒有經過任何處理,有注入漏洞
07/15 21:37, 11F

07/15 21:47, , 12F
樓上,bindParam就處理了喔~
07/15 21:47, 12F

07/15 22:19, , 13F
bindParam 只能防first order sql injection喔
07/15 22:19, 13F

07/15 22:31, , 14F
可以請樓上和五樓舉個例子,破這個範例嗎? 謝謝~
07/15 22:31, 14F

07/15 22:39, , 15F
或是其他人有破解例子,也可分享嗎,我對這蠻好奇,謝謝~
07/15 22:39, 15F

07/15 22:39, , 16F
:)樓上可否以上述SQL語法舉例?
07/15 22:39, 16F

07/16 02:40, , 17F
應該說是比對機制不好吧 直接codition 密碼就好,不用拿
07/16 02:40, 17F

07/16 02:40, , 18F
出來
07/16 02:40, 18F

07/16 02:42, , 19F
比對user跟passwd之後拿id或其它detail出來,passwd比較
07/16 02:42, 19F

07/16 02:43, , 20F
少人會特別抽出來比對
07/16 02:43, 20F

07/16 11:34, , 21F
抽出來比對是屬於第二層防護,作用在於怕今天有什麼bug時至少
07/16 11:34, 21F

07/16 11:35, , 22F
不會出現被 injection 的情況...是屬於較為安全(龜毛)的做法
07/16 11:35, 22F

07/16 21:29, , 23F
同意樓上
07/16 21:29, 23F

07/18 17:44, , 24F
使用者註冊的時候username不小心打成 bency' or username='a
07/18 17:44, 24F

07/18 17:45, , 25F
在你其他會撈username資料的地方就會出問題了
07/18 17:45, 25F

07/18 18:06, , 26F
不會啊,bindParam處理過了。
07/18 18:06, 26F
文章代碼(AID): #1HucR8iG (PHP)
文章代碼(AID): #1HucR8iG (PHP)