

PHPの初心者です。

－質問その１－  
私の対応しようとしている方針が、一般的なことか教えてください。そうでない場合、例を示して頂けると非常に助かります。

【採用しようとしている方針】  
1.ログイン画面を用意し、予め登録されたログインID・PWであり、『相応の認証が達成できた場合のみ』  
遷移先画面で利用していくため、このログインIDを、クッキー変数に格納（8時間有効）  
また、相応の認証が達成できた場合のみheder関数で、次画面へ遷移。（formのactionは自身を指定）

2.遷移先画面で、先のクッキー変数の内容を取得できれば、当該画面の処理を継続。取得できない場合は上記1.のログイン画面へ遷移させてしまう。尚、この画面からその他画面への遷移も行えるシステム構成を検討。全画面にて、クッキーからのログインID取得（=前回ログインから8時間以上経過していないこと）が達成されなければ1.のログイン画面へ遷移させてしまう。

3.セッション変数の有効期限を変えたり、タグ内にhiddenで記述するのも（ブラウザのソース表示で見える？？）、違和感を感じてクッキーが良いのかな？？と思いました。

－質問その２－  
上記のクッキーを利用した方針を前提に、インターネットの記事を読んでいると、setcookie関数の利用はHTML記述前、という記事ばかりを目にします。  
私がやろうとしていることは、ログオン認証が達成できた場合にのみsetcookie関数を動作させることになるので、達成できないような気がして非常に混乱しています。  
私の採用しようとしてる方針があながち間違いでない場合、どのように対応すればよろしいのでしょうか？

皆様のご支援をお待ち申しあげております、よろしくお願い致します。


CC BY-SA 3.0
2017-10-17T03:33:28.640
38775
2017-10-18T09:33:05.140
25696
question
php
PHP構築のWebシステムのログイン画面、遷移先画面でのログインID共有、常識的な達成方法は？


そもそもCookieとはサーバーからの読み書きだけでなく、ブラウザ、あるいはその他HTTPクライアントから任意に設定してリクエストに載せることが出来ます。

質問文を読む限りではCookieに平文でユーザーのIDを置こうと言うのでしょうか、もしそうであれば **ユーザーIDが分かれば誰でも**
そのユーザーを偽ってアクセスできてしまいます。非常に危険です。また、これは安全ではないストレージの一種です。

セッション変数〜と仰っているのでSessionの存在は認識されているようですが、この呼び方はPHPのセッションの認識をかえって難しくするかもしれません……

さておき、PHPの[セッション](https://secure.php.net/manual/ja/session.examples.basic.php)は一般的にCookieを利用します。Cookieに記録されるのは「セッションID」です。サーバーはブラウザから送られたセッションIDを基にセッションを読み込みます。セッションはサーバー上に存在し、ユーザーが直接アクセスすることはできないので「比較的安全なストレージ」です。セッションハイジャックされれば元も子もありませんが、少なくとも浅はかな考えで甘すぎるログイン認証をCookieを直接使って作ることに比べればセッションを活用したほうが幾分マシでしょう。

セッションは有効期限を切れても残っていたり、あるいは(多分特殊なケースですが)期限前に消えてしまうかもしれません。前者について厳密に設定したいならばセッション内に有効期限、あるいは最終利用時を記録しておいて、それを基にアクセス時に判定させればいいのでは。

* * *

なお、setcookieがHTML以前〜というのはsetcookieはヘッダーなのでHTTPのbodyを返す前に送出する必要があるということです。単純には

[code]

    <?php
    if(認証ok) {
      setcookie(……);
    }
    ?><!doctype html>
    <html>
    ...
    
[/code]

のようになればいいだけです。


CC BY-SA 3.0
2017-10-17T04:34:43.913
38777
2017-10-18T09:33:05.140
2017-10-18T09:33:05.140
2376
2376
38775
answer


> 遷移先画面で利用していくため、このログインIDを、クッキー変数に格納（8時間有効）

この時点で良くないことはすでについている回答の通りです。

そもそも、ベタなPHPで「Hello
world」以上のプログラムを作ろうとすると簡単に脆弱性を作り込んでしまいますし、認証を安全に実装するのはまず不可能です。

Webアプリケーションフレームワークを使うと、認証や基本的なセキュリティをライブラリに任せることができるので、それを使ってアプリを作ることをおすすめします。


CC BY-SA 3.0
2017-10-17T08:12:01.400
38796
2017-10-17T08:12:01.400
5793
38775
answer