作者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