-1

ユーザーがログインする必要がある割り当てに取り組んでいます(ファイルに対してユーザー名/パスワードを確認してください)。ユーザーが正常にログインした場合は、IN-accounting.dataという名前の別のファイルに保存されている給与データを印刷する必要があります。iveはユーザーログインの一部を機能させることができましたが、「給与」の部分を印刷するのに問題があります。現在、会計ファイルのすべての部分が印刷されます。データのみを印刷する方法を理解するのに役立ちます。ユーザーは何か提案にログインしましたか?これらのファイルとコードに含まれるすべての社会保障番号、電話番号、住所、人物は偽物であり、割り当てを行うために提供されたデータにすぎません。


11-6-12は、提案された変更を反映するように更新され、当初の希望どおりに実行されるようになりました。


#!/usr/bin/perl
use warnings;
use strict;
use Digest::MD5 'md5_hex';

open (PSWD, '<', 'password.passwd');
#getting username and password
#converting username to lowercase if username is entered in CAPS
print "Please enter your username: ";
chomp(my $userN = <STDIN>);
my $username = lc($userN);
############################################
print "Please enter your password: ";
chomp(my $password = <STDIN>);
my $passwd=md5_hex($password);
###############################################
my $matchCount = 0;#used later to make sure username and password match file
#reading password.passwd and assigning values
while (my $lines = <PSWD>){
my($user,$pswd,$userID,$groupID,$info,$home,$shell) = split ':', $lines;

#checking username entered vs that in the passwd file
if ($username eq $user){
print "Checking username... MATCH\n";
$username=$info;
#keeps track if username matches or not
$matchCount+=1;

#checking password entered vs that in the passwd file
if ($passwd eq $pswd){
    print "Checking password... MATCH\n";
        my ($first,$last)=split(" ", $info);
        accounting($first,$last);
}
else{
        print "Password does not match!\n";
    }
    last;


}
}

# if matchcount did not change, username did not match killing the program
if ($matchCount == 0){
    die ("\"$username\" does not match any users in our database!\n");
}





sub accounting{
   my $first_name=shift;
   my $last_name=shift;
   open(my $fh, '<', 'IN-accounting.data') or die "cannot open accounting file $!";
    while (my $lines = <$fh>){
    chomp $lines;
        my @fields = split(/\|/, $lines);

        push @data2, \@fields;



    my($Lname,$Fname,$ssn,$address)=($fields[0],$fields[1],$fields[2],$fields[3]);
        my($city,$state,$zip,$payDate)=($fields[4],$fields[5],$fields[6],$fields[7]);
        my($hours,$rate,$taxes,$deductions,$notes)= ($fields[8],$fields[9],$fields[10],$fields[11],$fields[12]);

        next if $Lname ne $last_name and $Fname ne $first_name;

    my ($Gpay)= eval($hours)*eval($rate);#gross pay
    my ($Tpay)=$Gpay-($taxes+$deductions);#total pay
    my $Essn=substr($ssn,+-4);#edited ssn
    print "$Fname $Lname\n";
    print "$address\n";
    print "$city $state $zip\n";
    print "SSN: xxx-xx-$Essn\n";
    print"\n";
    print "Pay Date: $payDate";
    print"\n";
    print"You had $hours hours at \$$rate/hour\n";
    print"Gross Pay: $Gpay\n";
    print"Taxes:\$-$taxes\n";
    print"Deductions:\$-$deductions\n";
    print"Total Pay: $Tpay\n";
    print"\n";
    print"Notes:$notes\n\n";



}
print"press enter to quit: ";
       my $quit=<>;     
       if ($quit){ exit;}
}

password.passwd

amon9640:4cb9c8a8048fd02294477fcb1a41191a:500:25:Alexander月曜日:/ home / payroll:/ bin / payroll iart1373:4cb9c8a8048fd02294477fcb1a41191a:501:25:Inigo Arterbury:/ home / payroll:/ bin / payroll wher :/ home / payroll:/ bin / payroll

会計ファイル

月曜日|Alexander| 815-19-9640 | 4662 Dewy Subdivision | Owltown | Oregon | 97434-8480 | 1/18/1998 | 19 | 21.68 | 60.28 | 2.24 | Payrollがアカウントを監査しており、レポートの期限が近づいています。

Arterbury | Inigo | 037-30-1373 | 987 Rocky Island Byway | Christmas City | New Mexico | 88023-3889 | 4/1/1993 | 9 | 7.02 | 17.75 |12.71|監査が完了しました。欠陥が見つかりました。

Herman | Wardell | 114-29-0210 | 5555 Cinder Forest Wynd | White Eyes Town | Washington | 98707-5628 | 10/0/2003 | 37 | 3.07 | 41.90 |20.89|監査が完了しました。欠陥が見つかりました。

4

2 に答える 2

0

セキュリティの問題についてはスキップします。いくつか見てみましょう。

あなたのaccountingサブルーチンは何をすると思いますか? ユーザーの給料を印刷しますか? サブルーチンにデータを渡していません。サブルーチンはどのユーザーの給料を印刷するかをどのように知るのでしょうか?

なぜこのようなことをしないのですか?

 accounting($Fname, $Lname); 

sub accounting {
   my $first_name = shift;
   my $last_name = shift;

   if (not $first_name or not $last_name) {
      die "You need a first name and a last name...)
   }

これで、アカウンティング ファイルを 1 行ずつループして、$first_nameとが一致する行を探すことができます$last_name

while (my $lines = <$fh>){
    chomp $lines;

    my ( $Lname, $Fname, $ssn,  $address,
        $city,  $state, $zip,  $payDatek,
        $hours, $rate,  $taxes,$deductions, $notes) = split /\|/, $lines;

        #Skip over non matching lines
        next if $Lname ne $last_name and $Fname ne $first_name;

コードに偽のエラーがあります。私が気づいたいくつかの簡単なもの:

  • push @data2, \@fields;配列の参照を配列にプッシュしています。
  • my ( $Lname, $Fname, ... $notes) = %fields;フィールドはハッシュではなく配列です。

あなたのプログラムがこれらの問題を抱えてコンパイルされていることに驚いています。

また、コード内でスペースを使用してください。これにより、読みやすく、フォローしやすくなります。

于 2012-11-16T02:09:45.160 に答える
0

うわー、ここであなたのアプローチには深刻なセキュリティ上の問題がいくつかあります。コメントでいくつか指摘してみます。

特定の質問に焦点を当てるには、ユーザーをアカウンティング データにリンクし、ユーザーごとにフィルター処理する何らかの方法が必要です。理想的には、これを容易にするために、リレーショナル制約を使用して生データをデータベースに取り込みます。しかし、現在のアプローチでは、次のようなことができます。

next unless "$Fname $Lname" eq $username;

返された正規表現フィールドへの変数名のマッピングの後にこれを配置します。

于 2012-11-15T22:50:23.020 に答える