プロが教える店舗&オフィスのセキュリティ対策術

この教えてgooみたいに ユーザ名、パスワードで認証して
そのそのユーザ名のページに飛んでいくと言うのを作りたいのですが
どのようにしたらいいでしょうか?

携帯電話の利用も考慮に入れて作りたいと思っています。

*php + mysql の利用を予定しています。

いつも質問ばかりでスミマセン。。

宜しくお願いいたします。

A 回答 (9件)

header("Location:

http://" . $_SERVER["SERVER_NAME"] . dirname($_SERVER["REQUEST_URI"]) . "/list/111.php?" . SID);

これではうまくいきませんか?
認証さえ通過すればうまくいけるような気がしますが・・・。

PHPみたいなインタプリタの言語のデバッグの方法としては、
header("Location: http://hoge.com/list/".$id.".php);
とやってみて、少しずつ、発展していくとどの部分でエラーがでているのかわかりやすいです。

それより心配なのは、100人ユーザーがいたら100個も個別にPHPスクリプトを作る手間です。一つのスクリプトで、プログラム内で個別に表示する項目を変えたほうがいいと思いますが・・・
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。。。
ようやく教えてもらったことを少しずつ理解しながら
ようやく完成いたしました!!

セッションのことが全く分かっていなかったので
教えていただいている事が全く分かりませんでした。

で、ひとつずつ解明していったら
id を持ちまわることが出来て、セキュリティもきちんとクリアして
いいものが出来ました。

本当に親切に教えていただいて
ありがとうございました。

お礼日時:2006/04/08 00:38

Warning: mysql_num_rows():


Warning: mysql_fetch_array():
これらのエラーは、SQL文が間違っているときにでます。
これはデータベース構造とスクリプトを見せていただくしか方法はないですね。

>ヒントで頂いたように、各ページに認証ページを読み込むようにしていたらアクセスできないようなので、今回はそちらにしようかなと思います。
うまく動かないとのことですが、各ページでチェックしないとブックマーク対策はできませんので可能であれば行っておいたほうが無難でしょう。

あと、
>一番下にある(スミマセン、字数制限で書けそうに無いのでm(__)m)ように認証することは出来るので、認証の時に入れたID(数字で3桁)を
認証ごに出てくる画面に id.php と言うリンクが出来ないかなと思っています。
ここの部分の意味がよくわかりません。

認証後にここの部分で飛ばすことを言っているのかな?
header("Location: http://" . $_SERVER["SERVER_NAME"] . dirname($_SERVER["REQUEST_URI"]) . "/list/111.php?" . SID);

ひとつ疑問なのは、header&Locationであえて別のページに飛ばす必要があるのかどうか。認証後のphpが生成するページに
<a href=http://".$_SERVER["SERVER_NAME"].dirname($_SERVER["REQUEST_URI"])."/list/111.php?".SID>あなたのページはこちら</a>";
とリンクタグを素直に書いてはだめですか?

月末までのオープン、がんばってください。

この回答への補足

スミマセン、知識が無い上に説明下手で。。。

ID PASS で認証してもらう時の ID で

その方の専用のページを作りたいのです^^;

なので、入力してもらったID が 100 なら

****/100.php と言う具合にです。


**login.php**
ID PASS 入力

**login_check**

チェックする
で、とんだ先に 自分専用(****/100.php)のページのアドレスがある。

そこまで受け渡しする方法は無いでしょうか?

スミマセン、もう一度だけ助けてください。

お願いいたします。

***お勧め頂いた本、アマゾンにも新品は売ってませんでした。
  当方の住む地方都市の大きな本屋さんにも在庫がありませんでした。
    (明日、出向いて注文してみるつもりです)

補足日時:2006/03/29 00:29
    • good
    • 0

本を何冊も読んでいるとのことですが、参考URLの本はとてもオススメです。


おそらく質問者さんのやりたいことがそのまま記載されていると思います。
プログラム上達の近道は、本を読むよりも、自分のやりたいことのプログラムを人に書いてもらって、見て勉強したほうがいいと思います。

参考URL:http://www.amazon.co.jp/exec/obidos/ASIN/4844314 …

この回答への補足

どうしてもこのエラーが出ます。

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /virtual/wave/public_html/login-test/pass_check.php on line 22

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /virtual/wave/public_html/login-test/pass_check.php on line 23
会員ではありません


テーブル名 フィールド名など 気をつけてみましたが分かりません。
少し、敷居が高かったのかな? と思っています。。
早速、本を買いに行ってきます。

そこで、これだけ教えていただけませんか?

一番下にある(スミマセン、字数制限で書けそうに無いのでm(__)m)ように
認証することは出来るので、認証の時に入れたID(数字で3桁)を
認証ごに出てくる画面に id.php と言うリンクが出来ないかなと思っています。

ヒントで頂いたように、各ページに認証ページを読み込むようにしていたら
アクセスできないようなので、今回はそちらにしようかなと思います。

勝手なことばかり言ってスミマセン、
月末までに作らないといけないので。。
(ただ、その後のこともありますので 再度ソースを勉強させて頂きます)

どうか宜しくお願いいたします。

補足日時:2006/03/28 17:16
    • good
    • 0

pass_check.php なのですが、データベース情報は入れなくて良いのでしょうか?



必要です。書き忘れました。

あとIDとpassのチェックは pass_check.phpのelseif文の方でチェックしています。これもpass='$pass'を書き忘れていますね。すいません。

}elseif($id <> ""){//idとpassを入力してきた場合
$sql_check_id = "SELECT* FROM mem WHERE id='$id' AND pass='$pass' AND (from_date <= '$today' AND to_date >= '$today')";
}
    • good
    • 0

あと自分のPR文を編集できるようにするためには、SELECT文で抜き出したデータを入れてやればいいだけです。




pr.php
htmlは省いてあります。

<?php
//しつこいが必ず読み込む
require_once('pass_check.php');


if($err == '1'){
//pass_check.phpで$err = 1だったら会員ではないので、はじく
echo "会員ではありません";
}else{

echo "<FORM method=post action=pr_henko.php>";

echo "<TABLE BORDER=1>";
echo "<TR>"
echo "<TD>ハンドルネーム</TD>";
echo "<TD><input type=text name=user_name value=$user_name_gloval></TD>";
echo "<TD>住所</TD>";
echo "<TD><input type=text name=adress value=$user_adress_gloval></TD>";
echo "</TR>";
echo "<TR>";
echo "<TD colspan=2><input type=submit value=登録></TD>";
echo "</TR>";
echo "</TABLE>";

echo "</FORM>";

}

?>


pr_henko.php

<?php

//しつこいが必ず読み込む
require_once('pass_check.php');

if($err == '1'){
//pass_check.phpで$err = 1だったら会員ではないので、はじく
echo "会員ではありません";
}else{
if($user_name == "" OR $adress == ""){
echo "名前とアドレスは入力してください。";
}else{
//データベース関連のデータをインクルードします
require_once("dbini.php");
//MySQLに接続します
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
//データベースを選択します
$selectdb = mysql_select_db($DBNAME, $con);

$sql_shusei = "UPDATE mem SET user_name='$user_name', user_adress='$adress' WHERE temp_id = '$temp_id_global'";
$result_shusei = mysql_query($sql_shusei);
if(!$result_shusei){
echo "更新失敗";
}else{
echo "更新成功";
}
}
}

?>



あと、memに住所など個人情報がある場合は、分けておいたほうがいいです。
理由は、SQLインジェクションにより、個人データを抜かれる可能性があるからです。
どのようなものかは
http://www.atmarkit.co.jp/fsecurity/rensai/webho …
こちらをご覧ください。
    • good
    • 0

私がやっている携帯電話着メロの商用サイトでの話です。



ユーザーが登録すると、http://hoge.com/login_check.php?temp_id=b9650f36 …
のようにメールにログインURLやID、PASSを添付して送ります。
ちなみにtemp_id=の部分は、md5ハッシュ値で、ほとんど重複がないのでランダムID発行には便利です。
md5の説明:(http://www.php.net/manual/ja/function.md5.php
携帯電話ではキーが打ちにくいので、ユーザーがいちいちIDとPASSを入力しなくてもよいというメリットがあります。

私はtemp_idを判断して、若しくは入力されたIDとPASSを見て判定しています。

やり方としては
1.login.phpはそのままでいいと思います。
2.login_check.php等全てのページに、認証チェック用のプログラム(pass_check.php)をインクルードします。
インクルード文を全てのページに書くことで、ブックマーク等は不可能になります。


インクルード用プログラム例:
pass_check.php

<?php
//会員期間をチェックするために利用
$today = date("Y-m-d");
//エラー初期化
$err = 1;

if($temp_id <> ""){//メールについたtemp_idで接続してきた場合
$sql_check_id = "SELECT * FROM mem WHERE temp_id = '$temp_id' AND (from_date <= '$today' AND to_date >= '$today')";
}elseif($id <> ""){//idとpassを入力してきた場合
$sql_check_id = "SELECT* FROM mem WHERE id='$id' AND (from_date <= '$today' AND to_date >= '$today')";
}

$result_check_id = mysql_query($sql_check_id);
$num_rows_check_id = mysql_num_rows($result_check_id);
$row_check_id = mysql_fetch_array($result_check_id);

if($num_rows_check_id > '0'){
$err = 0;
//このようにすることで、どのプログラムにおいても,$user_name_globalと書くと表示されるようになる。
$user_name_global = $row_check_id[user_name];
$user_adress_global = $row_check_id[adress];
$user_temp_id_global = $temp_id;

}else{
$err = 1;
}

?>


プログラム例:login_check.php
htmlは省いてあります。

<?
//ここで認証プログラムを読み込みます。
require_once('pass_check.php');

if($err == '1'){
//pass_check.phpで$err = 1だったら会員ではないので、はじく
echo "会員ではありません";
}else{
echo "こんにちは、".$user_name_global."さん<BR><BR>";

echo "1.<a href=./bbs.php?temp_id=$user_temp_id_global>掲示板</a><BR>";
echo "2.<a href=./chat.php?temp_id=$user_temp_id_global>チャット</a><BR>";
echo "3.<a href=./pr.php?temp_id=$user_temp_id_global>PR文編集</a><BR>";
}

?>

こんな感じでしょうか
セキュリティ万全にするとこれだけでは足りませんので承知ください。

参考URL:http://fixenmelody.com

この回答への補足

とてもご親切な回答ありがとうございます。

スミマセン、いくつか質問させてください。*多分超初歩的なことです。。

pass_check.php なのですが、データベース情報は入れなくて良いのでしょうか?
僕はおまじないのように必ず入れているのですが

//データベース関連のデータをインクルードします
require_once("dbini.php");

//MySQLに接続します
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
//データベースを選択します
$selectdb = mysql_select_db($DBNAME, $con);


それから、ID と PASS はどこでチェックしているのでしょうか?
**私の場合はほとんどこちらだと思います。

お手数かけますが、宜しくお願いいたします。

補足日時:2006/03/28 13:38
    • good
    • 0

basic認証の延長でmysqlによる認証が可能です。


dbの方でカレントページなど保持しておけば、
それなりのユーザーページも運営できると
おもいます。

参考URL:http://tsuttayo.sytes.net/apache/access/db/
    • good
    • 0

先の方が答えている通り、設計次第です。



以下の条件により設計はかなり変わります。
1.IDとPASSはデータベースで管理するか、否か
2.ユーザー期間は管理するか、否か
3.認証を受けた後の全てのページでチェックするか、否か
(ユーザー期間が切れた後はどの箇所にもブックマークをしていても入れない)
4.ユーザー名のページは一人一人それぞれ作るのか、それとも「kiyomidesuyoのページ」のような表示だけでいいのか。
(せっかくPHPを使うならそれぞれ作るようなことは避けた方が無難)
その他色々あると思います。
また何を行いたいかによって感じも変わってくると思います。

簡単な認証でしたら、作成もしますのでよかったらどうぞ

この回答への補足

皆さんのご指摘通り、ちょっと甘えすぎていると思い
本を何冊も読むのですが、なかなか回答に行き着きません。

お言葉に甘えて、アドバイスをお願いします。

1 id pass は mysql で管理します。
2 携帯電話でも利用できるようにする(cookieの利用無し)
3 100名ほどの利用を考えています
4 認証を受けた後の全てのページでチェック
5 それぞれのユーザーが自分のPR分を編集できる

出来の悪い脳みそで一生懸命考えていますが。。

このテーブルだけ分けた方がいいのでしょうか?

現在は 'mem' と言うテーブルに id int(11) pass varchar(8)
**他にもユーザー名や住所なども入って居ます。

お手数かけますが、宜しくご指導お願いいたします。

補足日時:2006/03/27 18:01
    • good
    • 0

こんにちは。



設計次第でいろいろあると思います。
それをココでどのように作るかは回答しきれないと思います。

手順としては、

ユーザ名とパスワードを受け取る
ユーザ名とパスワードでレコードが取得する
取得できたらユーザのページを表示する
取得できない場合はエラーページなりを表示する

ユーザのページでは認証されたユーザ名を使用して、必要な情報を取得し表示等を行う。

まずは、ログインのページと認証処理を行うスクリプトを作ってみてはいかがでしょうか。

この回答への補足

いつも回答ありがとうございます。

一つ一つやってみました。(SESSIONを利用)
ユーザ名 パスワードで認証したら特定のページへ
エラーはエラーを表示。

ここまでは出来るのですが、認証後に表示したページに

更新するページはこちらですとリンクを張りたいのですが
どのようにリンクを張ればいいのか仕組みが見当付きません、
(そのまま更新ページに飛んでもかまいませんが)

どうか、再度アドバイスをお願いいたします。

login.php
<?php
session_start();
$_SESSION['login'] = 0;
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>ユーザー認証</title>
</head>
<body>
<p>ユーザー認証</p>
<form action="login_check.php?<?=SID ?>" method="post">
<table>
<tr>
<td>ID: </td><td><input name="id" type="text"></td>
</tr>
<tr>
<td>PASS: </td><td><input name="pass" type="password"></td>
<tr>
<td colspan="2" align="center"><input type="submit" value="送信"></td>
</tr>
</tr>
</table>
</form>
</body></html>

login_check.php
<?php
session_start();

//データベース関連のデータをインクルードします
require_once("dbini.php");
//MySQLに接続します
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
//データベースを選択します
$selectdb = mysql_select_db($DBNAME, $con);

$sql = "select name from members where uid = '{$_POST['id']}' and password = '{$_POST['pass']}'";
$rs = mysql_query($sql);

if (mysql_num_rows($rs) > 0) {
$_SESSION['login'] = 1;
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://" . $_SERVER["SERVER_NAME"] . dirname($_SERVER["REQUEST_URI"]) . "/list/111.php?" . SID);
exit;
}
mysql_close($con);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>認証失敗</title>
</head>
<body>
認証に失敗しました。<br />
<a href="login.php?<?=SID ?>">戻る</a>
</body>
</html>

補足日時:2006/03/27 19:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!