ユーザーにユーザー名/パスを入力してログインさせ、この情報をファイルに保存するWebサイトがあります。これが私の現在のコードです:
function getPassword( $user )
{
$passwords= array
(
'Admin' => '123456',
'Moderator' => 'abcde'
);
eval(file_get_contents('./login.info')); //<--- THIS is where usernames/passwords are stored
$password = $passwords[ $user ];
if ( NULL == $password )
return NULL;
return array( $user, $password );
}
これは、新しいアカウントを作成するユーザー用のコードです。
<?php
if((isset($_POST['username']))and(isset($_POST['password']))){
$file = "login.info";
$fh = fopen($file, 'a');
//prevent sql injection
function check_field($fh)
{
if(!preg_match("/[^a-zA-Z0-9\.\-\_\@\.\+\~]/",$fh))
return TRUE;
else
return FALSE;
}
if(!check_field($_POST[username]))
{
header("Location:illegalchars.html");
break;
}
if(!check_field($_POST[password]))
{
header("Location:illegalchars.html");
break;
}
fwrite($fh, '$passwords["'.$_POST['username'].'"]="'.$_POST['password'].'";');
fclose($fh);
header("Location:success.html");
break;
}
?>
私のコードがきれいではなく、大きな問題があることはわかっています。
そのうちの 1 つ: 誰かがユーザー名 x でアカウントを作成した場合、誰もが新しいパスワードを使用して x を作成し、制御を得ることができます。
私が持っていた簡単な解決策eval(file_get_contents('./login.info'));は、管理者アカウントの上に移動し、新しいユーザー/パスのリストの一番上に新しいアカウントを追加することでした. ただし、配列の上に eval を配置しても機能しない理由がわかりません。また、コードをリストの一番上に追加する方法。どんな助けでも大歓迎です。
==編集== このコードには多くの批判があることは承知していますが、誰か質問に答えていただけませんか? 現時点では、セキュリティ/パフォーマンスを向上させようとしているわけではありません (これは概念実証ゲームのためのものであり、最終的には、とにかくこの全体を書き直す必要があります)。機能的なスクリプトが欲しいだけです。質問に答えてください。:]