web-dev-qa-db-ja.com

パスワードをプレーンテキストでphp変数またはphp定数に保存しても大丈夫ですか?

質問によると、次のようなphpページにパスワードを保存するのは安全ですか?

$password = 'pa$$w0rd';

ユーザーがそれを見ることができない場合、それは安全ですよね?

編集:実際にハッシュを使用することを提案した人もいますが、データベースサーバーの接続パスワードに問題がありますね。

29
Hao Wooi Lim

簡単な答えは「いいえ」であり、それは状況によって異なります。

no単純なサーバーの設定ミスや間違った場所でのエコー以外の理由でパスワードが世界に公開される可能性がある場合は、パスワードをプレーンテキストで、特にWebアクセス可能な場所に保存することはほとんどありません。 。

パスワードを保存する必要がある場合(可能です)、Webルートの外部に保存してみてください。例:/var/www/public_html/ここにcodezを入力
/var/www/includes/ここにパスワードを入力してください

それよりもさらに良いのは、パスワードが必要なシステム(データベースラッパーなど)が、すでにインスタンス化されているオブジェクトを返すようにすることです。したがって、$databasepasswordを要求するのではなく、PDOオブジェクトを要求し、データベースクラスをWebルートの外部に格納します。

It Dependsは、攻撃ベクトルによって誰かがそのパスワードテキストにアクセスできるようになるものであり、ファイルシステム内にすでに存在している必要がある場合は、とにかく失敗している可能性があります。

また、supa-secritサブスクライバーコンテンツのパスワードである場合、失ったのはサブスクリプション料金だけです。データベースの場合は、問題が発生する可能性があります。オンラインバンキングの詳細の場合は、問題が発生する可能性があります。

パスワードが保護しているものはどれほど価値がありますか?

34
garrow

安全をどのように定義するかに応じて、どのアプローチにもプラス面とマイナス面があります。

本当にパスワードをソースに保存したい場合は、次のようなことを行うことをお勧めします。

ファイル:config.php

if( ! defined('IN_CODE') ) die( 'Hacking attempt' );

define( 'PASSWORD_HASH', '098f6bcd4621d373cade4e832627b4f6' );

ファイル:index.php

define( 'IN_CODE', '1' );

include( 'passwd.php' );

if( md5($password) == PASSWORD_HASH )
...

プレーンテキストは決して良い考えではありません。保存したいパスワードのハッシュを常に保存してください。

さらに、このような定義をメインのソースファイルから分離してみてください。

9
Yannick Motton

通常、彼らはそれを見ることができません。しかし、サーバーで何か問題が発生した場合、サーバーが実行せずにPHPコードをプレーンテキストで返す可能性が高いため、ユーザーにはそのファイルのすべてのソースとパスワードが表示されます。

パスワードをドキュメントルート以外の場所に保存し(ブラウザで開くことはできません)、そのファイルをphpで開いて、内容(パスワード)を読み取ります。または、複数のパスワード/ユーザーがある場合は、高速アクセスのためにデータベースに保存します。

ファイルメソッドを使用する場合、ディレクトリレイアウトは次のようになります(サーバー上で依存)

/public_html/index.php

/password.txt

$myFile = $_SERVER['DOCUMENT_ROOT'] + "/../password.txt";
if file_exists($myFile) { 
   $fh = fopen($myFile, 'r');
   $password = fgets($fh);
   fclose($fh);
} else die("No password file");
if ($user_input == $password) {
   ...... Authentication succeeded ..........
   ......your relatively protected code .....
} else die("Wrong password");

パスワードをテキストとしてそのテキストファイルに保存する代わりに、さらにセキュリティを強化したい場合。ハッシュです。ユーザー入力と比較する場合は、ユーザー入力からハッシュを生成し、テキストファイルからロードしたパスワードのハッシュと比較します。

sha1($user_input) == $password_from_txt
7
Maiku Mori

PHPインストールが正常に機能する限り、これは他の方法よりも安全性が低くありません。変数よりも名前付き定数(define)の方が望ましいです。さらに、のハッシュを保存することを検討してください。プレーンパスワードの代わりにパスワード。これにより、サイトが侵害された場合でもパスワードが盗まれるのを防ぎます。

悪い習慣であるということに関しては、それは異なります。パスワードを1つだけ保存する必要がある場合は、このアプローチで問題ありません。それらをドキュメントルートの外部に保存すると、セキュリティが強化されているという誤った感覚を与える可能性があります。ドキュメントルートは、サーバーの他の設定よりも絶対的ではありません。

2
Joonas Pulakka

サイト自体が侵害されていない限り、そして今ではそれらのパスワードがアクセスを許可するすべてのもの(おそらくあなたのDB?)も侵害されています。

0
Lawrence Dol

'safe'をどのように定義するかによって異なります。

あなたは、一般ユーザーには表示されないという点で正しいです。

しかし、それは間違いなく悪い習慣です。あなたのサイトが危険にさらされた場合、これらのパスワードは他に何にアクセスを許可しますか?最低限、平文ではなく、パスワードのハッシュを保存する必要があると思います。

0
DanSingerman

MySQLは認証用のハッシュを受け入れないため、ほとんどの場合、プレーンテキストのパスワードはデータベースのパスワードになると思います。

前に述べたように、最善の解決策は、PHP構成ファイルとパスワードをwebrootの外部に保持することです。

ファイルの表示中に誰かがパスワードを見る可能性があるのではないかと心配している場合は、base64関数を使用してパスワードを人間が読めないようにすることができます。

詳細については この投稿 を参照してください。Windows、Linux、Mac用の小さなユーティリティでさえ簡単にできます。

0
Mahtar

時々それはただf.eでなければなりません。プレーンパスワードでのみログインでき、ハッシュではログインできないメールアプリケーションの場合。また、アプリケーションにセキュリティの問題がない場合は、影響はありません。

0
Thomaschaaf