作者a60301 (mingtsay〃小喵)
看板PHP
標題[教學] 看到板上有人發PDO的文,我來寫個登入的吧
時間Sun Jul 14 16:52:20 2013
請各位多指教囉!
<?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 ° ∥★
★∥ 。 ● ● ◤ ◥ █ █ ∥ ◢╱﹋◣ 。 ∣★
★∣ ◥ˍ ◤◤ ◢◤ ◢◢◤██◤ ◣ ◢╱ ● ︶ ( ∥★
★∥ ( ◢◤ ◤ing ∥say ◢███ ╰ ◤ ζ ) ∣★
★│ ) mt.rmstudio.tw ︾ [email protected] ◤ ◥◢ ◤◤ wnqui ∥★
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.42.67.27
1F:→ gname:沒習慣用PDO,看到 $_POST 直接拿來用會抖一下...XD 07/14 22:52
2F:推 yukang:db存明碼更抖~ 07/14 23:01
3F:→ a60301:哎呦,這只是個PDO的應用範例咩~(搖尾# 07/15 00:43
4F:→ johnny1972:其實有bindParam還好,不過password用明碼存? 07/15 08:04
5F:→ johnny1972:而且怎麼不是丟進sql去比對而直接比,這樣一樣有問題 07/15 08:04
6F:推 tkdmaf:不管是pdo、原生mysql、mysqli或是active record...... 07/15 09:49
7F:→ tkdmaf:第一件事,都是先過濾掉所有造成sql injection的原因。 07/15 09:50
8F:推 carlcarl:五樓指的問題是?? 07/15 20:45
9F:→ bibo9901:問題就在於用明碼存 07/15 21:26
10F:推 carlcarl:五樓的說法感覺除了密碼沒做hash 還有其它問題@@ 07/15 21:33
11F:→ see7di:你寫的這個有漏洞,POST的值沒有經過任何處理,有注入漏洞 07/15 21:37
12F:→ chaoms:樓上,bindParam就處理了喔~ 07/15 21:47
13F:推 johnny1972:bindParam 只能防first order sql injection喔 07/15 22:19
14F:→ xxxzzz:可以請樓上和五樓舉個例子,破這個範例嗎? 謝謝~ 07/15 22:31
15F:→ xxxzzz:或是其他人有破解例子,也可分享嗎,我對這蠻好奇,謝謝~ 07/15 22:39
16F:→ chaoms::)樓上可否以上述SQL語法舉例? 07/15 22:39
17F:→ dlikeayu:應該說是比對機制不好吧 直接codition 密碼就好,不用拿 07/16 02:40
18F:→ dlikeayu:出來 07/16 02:40
19F:→ dlikeayu:比對user跟passwd之後拿id或其它detail出來,passwd比較 07/16 02:42
20F:→ dlikeayu:少人會特別抽出來比對 07/16 02:43
21F:→ gname:抽出來比對是屬於第二層防護,作用在於怕今天有什麼bug時至少 07/16 11:34
22F:→ gname:不會出現被 injection 的情況...是屬於較為安全(龜毛)的做法 07/16 11:35
23F:推 carlcarl:同意樓上 07/16 21:29
24F:推 bency:使用者註冊的時候username不小心打成 bency' or username='a 07/18 17:44
25F:→ bency:在你其他會撈username資料的地方就會出問題了 07/18 17:45
26F:→ a60301:不會啊,bindParam處理過了。 07/18 18:06