「PHPでセキュリティに弱いログインシステムを作ってみる」の編集履歴(バックアップ)一覧はこちら

PHPでセキュリティに弱いログインシステムを作ってみる」(2015/12/07 (月) 19:08:47) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

攻撃方法を知っておかないとセキュリティは保てないということで、自分でシステムを作り自分で攻撃してみます。 悪用は厳禁です。攻撃方法は各自学習してみてください。12月7日記事 ~ ~ 目次 #contents ~ ~ ---- ~ *テーブル作成 DDL CREATE TABLE Vul_account( id INT NOT NULL AUTO_INCREMENT, email VARCHAR(255) NOT NULL, passwd VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id), INDEX multi(email,passwd) ) DML INSERT INTO Vul_account(email,passwd,name) VALUES('hoge@hoge.com','password','taro'); INSERT INTO Vul_account(email,passwd,name) VALUES('fuga@hoge.com','password','hanako'); INSERT INTO Vul_account(email,passwd,name) VALUES('piyo@hoge.com','password','jiro'); INSERT INTO Vul_account(email,passwd,name) VALUES('foo@hoge.com','password','saburo'); *mysql_queryという昔のクエリ方法を使う 今では&color(red){非推奨}となっており、PDOを使う方法が推奨されています。 ~ ~ *コード ログインフォームを作り、IDとPASSWORDが一致していれば、ログインする仕組みを作る。 ~ index.php <?php require ('config.php'); $link = mysql_connect($db_host, $db_user, $db_password); mysql_select_db($db_name) or die(mysql_error()); $result = mysql_query('set character set utf8') or die(mysql_error()); $message = NULL; if (isset($_POST['submit'])) { $sql = "SELECT * FROM Vul_account WHERE email = '" . $_POST['id'] . "' AND passwd = '" . $_POST['pass'] . "'"; //パスワード認証のクエリ print $sql; //どんなクエリが投げられているかを見るために残しておきます。 $result = mysql_query($sql); //クエリ投げる $user = mysql_fetch_array($result); //認証できた場合受け取る //print_r($user); if ($user == NULL) { $message = 'IDまたはパスワードが違います。'; } else { session_set_cookie_params(60 * 1); //1分間のlifetime session_start(); $_SESSION["name"] = $user["name"]; header("Location: home.php"); //ホーム画面へリダイレクト } } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="../reset.css"> <link rel="stylesheet" type="text/css" href="style.css"> <title>SQLインジェクションしてみる</title> </head> <body> <form action="index.php" method="post"> <ul> <li>email<input type="text" name="id"></li> <li>PASSWORD<input type="password" name="pass"></li> <li><input type="submit" name="submit" value="ログイン"></li> </ul> </form> <?php echo $message; ?> </body> </html> home.php <?php session_start(); ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="../reset.css"> <link rel="stylesheet" type="text/css" href="style.css"> <title>ホーム画面</title> </head> <body> <p><?php echo $_SESSION["name"] ?>さんこんにちは。</p> </body> </html> ~ ~ *攻撃方法 passwordというパスワードを知らなくてもログインすることができます。各自調べてみてください。 ~ ~ *色々なセキュリティ対策 +PDOを使う +生パスワードは格納しない。何かでハッシュ化する +saltを設ける
攻撃方法を知っておかないとセキュリティは保てないということで、自分でシステムを作り自分で攻撃してみます。 悪用は厳禁です。攻撃方法は各自学習してみてください。12月7日記事 ~ ~ 目次 #contents ~ ~ ---- ~ *テーブル作成 DDL CREATE TABLE Vul_account( id INT NOT NULL AUTO_INCREMENT, email VARCHAR(255) NOT NULL, passwd VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id), INDEX multi(email,passwd) ) DML INSERT INTO Vul_account(email,passwd,name) VALUES('hoge@hoge.com','password','taro'); INSERT INTO Vul_account(email,passwd,name) VALUES('fuga@hoge.com','password','hanako'); INSERT INTO Vul_account(email,passwd,name) VALUES('piyo@hoge.com','password','jiro'); INSERT INTO Vul_account(email,passwd,name) VALUES('foo@hoge.com','password','saburo'); *mysql_queryという昔のクエリ方法を使う 今では&color(red){非推奨}となっており、PDOを使う方法が推奨されています。 ~ ~ *コード ログインフォームを作り、IDとPASSWORDが一致していれば、ログインする仕組みを作る。 ~ index.php <?php require ('config.php'); $link = mysql_connect($db_host, $db_user, $db_password); mysql_select_db($db_name) or die(mysql_error()); $result = mysql_query('set character set utf8') or die(mysql_error()); $message = NULL; if (isset($_POST['submit'])) { $sql = "SELECT * FROM Vul_account WHERE email = '" . $_POST['id'] . "' AND passwd = '" . $_POST['pass'] . "'"; //パスワード認証のクエリ print $sql; //どんなクエリが投げられているかを見るために残しておきます。 $result = mysql_query($sql); //クエリ投げる $user = mysql_fetch_array($result); //認証できた場合受け取る //print_r($user); if ($user == NULL) { $message = 'IDまたはパスワードが違います。'; } else { session_set_cookie_params(60 * 1); //1分間のlifetime session_start(); $_SESSION["name"] = $user["name"]; header("Location: home.php"); //ホーム画面へリダイレクト } } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="../reset.css"> <link rel="stylesheet" type="text/css" href="style.css"> <title>SQLインジェクションしてみる</title> </head> <body> <form action="index.php" method="post"> <ul> <li>email<input type="text" name="id"></li> <li>PASSWORD<input type="password" name="pass"></li> <li><input type="submit" name="submit" value="ログイン"></li> </ul> </form> <?php echo $message; ?> </body> </html> home.php <?php session_start(); ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="../reset.css"> <link rel="stylesheet" type="text/css" href="style.css"> <title>ホーム画面</title> </head> <body> <p><?php echo $_SESSION["name"] ?>さんこんにちは。</p> </body> </html> ~ ~ *攻撃方法 メールアドレスやpasswordというパスワードを知らなくてもログインすることができます。各自調べてみてください。 ~ ~ *色々なセキュリティ対策 +PDOを使う +生パスワードは格納しない。何かでハッシュ化する +saltを設ける

表示オプション

横に並べて表示:
変化行の前後のみ表示: