1

私は perl を初めて使用します。私がやりたいことは、すべてのユーザーが少なくとも 7 日に 1 回パスワードを変更し続けるようにすることです。そうでない場合、システムはパスワードを変更するか、ログアウトするように促します。しかし、私の場合、すべてのユーザー ID とパスワードを含むファイルが file にあるとしますuserid_passwd.txt。そのため、1 人のユーザーが自分のパスワードを修正または変更すると、ファイルスタンプuserid_passwd.txtが変更されます。そのため、1 人のユーザーが 1 週間に 1 回パスワードを変更するという規範に従い、残りはそれを避けたとしても、ログインできるようになります。

open WORDSLIST, $filename
    or die "can't open wordlist: $!";

if (-M WORDSLIST < 7.0) {  

    while ($name = <WORDSLIST>) {
        \\Do Something
    }
}
close WORDSLIST
    or die "couldn't close wordlist: $!";

しかし、ファイルには各ユーザーのユーザーIDとパスワードが順番に含まれており、後でハッシュ変数に割り当てられるため、コード部分if (-M WORDSLIST < 7.0) { は私が望むものではありません。

4

3 に答える 3

3

ユーザーが最後にパスワードを変更した時期をどこかで追跡する必要があります。または、1 日から 7 日経過したパスワード ファイルの 7 つのコピーを保持し、ユーザーのパスワードが以前と同じかどうかを確認します。

于 2012-10-31T08:50:53.097 に答える
3

あなたのファイルは現在 と の両方usernameを保持していると思います。日時として apasswordを追加し、last_changedそれに基づいてロジックを実行することもできます。

于 2012-10-31T09:38:20.257 に答える
2

より柔軟で成熟したソリューションを構築したい場合は、単純なSQLiteデータベースをORLiteと一緒に使用して、パスワード (ソルト付きハッシュ! ) と最終更新日時のタイム スタンプの両方を次のように保存できます (不完全ですが、開始するためだけに):

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use FindBin '$Bin';
use Crypt::SaltedHash;
use ORLite {
    file    => "$Bin/login.db",
    create  => sub { shift->do('
        CREATE TABLE login (
            user            TEXT    NOT NULL PRIMARY KEY,
            salted_hash     TEXT    NOT NULL,
            last_modified   INTEGER NOT NULL
        )
    ')},
};

# ...

my $login = Login->load($name);
say 'password ok' if $crypter->validate($login->salted_hash, $password);
say 'password change ok' if time - $login->last_modified < 60 * 60 * 24 * 7;
于 2012-10-31T10:46:05.003 に答える