こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PHP ログインシステムについて

お世話になります
現在ローカルで下記PHPのテストを行っています
PHP初心者の為、セキュリティ面並びに不具合が心配で書き込みさせて頂きました
恐れ入りますがおかしな点がないかチェックして頂けませんでしょうか
宜しくお願いいたします
データベースのバージョンはMySQL 5.5です

*****************************************

<?php

session_start();

$error_message = "";

if (isset($_POST["login"])) {

$id = htmlspecialchars($_POST['id']);
$password = htmlspecialchars(base64_encode(pack('H*', sha1($_POST['password']))));

$_SESSION['id'] = $_POST['id'];
$_SESSION['password'] = $_POST['password'];

$db = mysql_connect("***","***","***");
if (!$db) {
die('接続失敗です。'.mysql_error());
}
mysql_set_charset("utf8");

$db_selected = mysql_select_db("***", $db);
if (!$db_selected){
die('データベース選択失敗です。'.mysql_error());
}

$result = mysql_query("SELECT * FROM ***");
if (!$result) {
die('クエリーが失敗しました。'.mysql_error());
}

function x($result) {
return mysql_real_escape_string($result);
}

while ($row = mysql_fetch_assoc($result)) {
if($id == $row['id'] && $password == $row['password']){
header("Location:./instance.php");
}
}

$_SESSION = array();

if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}

session_destroy();


$error_message = "ユーザ名もしくはパスワードが違っています。";
}

?>
<html>
<head><title>ログイン</title>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
</head>
<body>

<?php
if ($error_message) {
print '<font color="red">'.$error_message.'</font>';
}
?>

<form action="login.php" method="post">
ID:<input type="text" name="id"><br />
PASS:<input type="password" name="password"><br />
<input type="submit" name=login value="認証">
</form>
</body>
</html>

投稿日時 - 2012-04-11 19:16:41

QNo.7415744

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.2

たぶん、セキュリティ云々の前に誰もが突っ込むと思いますが、htmlspecialcharsはいらないですね。
かわりにmysql_real_escape_string通して、ID名でDBからそのIDのレコードだけSELECTしてください。
その方法だとユーザー数毎ループなので、無駄が多すぎます。

あとpostしてきたパスとIDにtrim通して空白排除してやる気遣いもほしいです。

セキュリティ面ですが、何重にも変換すれば安全てわけじゃないです。
sha1で変換するときにはsaltと一緒に変換してやりましょう。

$hashed_password = sha512($_POST['password'].'固定の秘密文字列');

こんな感じです。とりあえずそれ以上はあんまり意味がないです。

参考:
http://blog.ohgaki.net/sha1a_sa_a_a_ma_ya_a_a_a_a_sa_ma_fa_a_ma
http://blog.ohgaki.net/espcs_if_a_fa_ia_a_pa_e_oa_a_sa_da_ca_sa

投稿日時 - 2012-04-13 19:25:46

お礼

参考URL有難うございます
こちらを参考に書き直ししてみます

投稿日時 - 2012-04-13 20:45:23

ANo.1

>セキュリティ面並びに不具合

セキュリティに関しては前提としてhttpsでやってないなら
所詮IDもパスワードもダダ漏れです

不具合についてはhtmlspecialcharsを使用していますが
画面に出力しないのであれば不要です
入力データの規則チェックがされていませんが
どんな文字もつかえる仕様はいただけません
なんらかのバリデートが必要でしょう

それとざっとしか見ていませんが、POSTしたIDとパスワードを
ユーザーデータベースへ問合せをする方法が変じゃないですか?

投稿日時 - 2012-04-12 10:29:36

お礼

ご指摘有難うございます
早速htmlspecialcharsを削除しました
ユーザーデータベース問合せ方法についてはもう書き直してみます

httpsについては頭になかったので、調べて対応しようと思います
ありがとうございました

投稿日時 - 2012-04-13 20:08:43

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-