「PHPでセキュリティに弱いログインシステムを作ってみる」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
攻撃方法を知っておかないとセキュリティは保てないということで、自分でシステムを作り自分で攻撃してみます。
悪用は厳禁です。攻撃方法は各自学習してみてください。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を設ける