0

表内のパスワードを更新するためのコードのセットがあります。ここでは、CGI::AJAX モジュールを使用してパスワードを更新し、対応する実行時にポップアップ画面を取得しています。アプリケーションでそのコードを使用すると、正しく実行されますが、実行しませんでした'出力を取得しない (use.password を取得する JavaScript 関数がテーブルに更新されていない場合、Perl サブルーチンが呼び出されないことを意味します)。エラーも出ません。

#!/usr/bin/perl -w
use strict;
use CGI;
use DBI;
use Data::Dumper;
my $p = new CGI qw(header start_html end_html h1 script link);
use Class::Accessor;
use CGI::Ajax;
my $create_newuser;
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);

print $ajax->build_html($p,\&Show_html,{-charset=>'UTF-8', -expires=>'-1d'});

sub Show_html
        {
        my $html = <<EOHTML;
<html>
<body bgcolor="#D2B9D3">
<IMG src="karvy.jpg" ALT="image">
<form name='myForm'>
<center><table><tr><td>
<div style="width:400px;height:250px;border:3px solid black;">
<center><h4>Create New Password's</h4>

<p>&nbsp User Name</b>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<INPUT TYPE="text" NAME="user" id = "user" size = "15" maxlength = "15" tabindex = "1"/></p>
<p>&nbsp Password:</b>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<INPUT TYPE=PASSWORD NAME="newpassword" id = "newpassword" size = "15" maxlength = "15" tabindex = "1"/></p>
<p>&nbsp Re-Password:</b>&nbsp&nbsp&nbsp<INPUT TYPE=PASSWORD NAME="repassword" id = "repassword" size = "15" maxlength = "15" tabindex = "1"/></p>
<input type="submit" id="val" value="Submit" align="middle"  method="GET" onclick="fetch_javaScript(['user','newpassword','repassword']);"/><INPUT TYPE="reset" name = "Reset" value = "Reset"/>
<p>Main Menu <A HREF = login.pl>click here</A>
</center>
</div>
</td></tr></table></center>
</form>
</body>
</html>

EOHTML

return $html;
        }


$create_newuser =sub
                {

                my @input = $p->params('args');
                my $user=$input[0];
                my $password=$input[1];
                my $repassword=$input[2];

                my $DSN = q/dbi:ODBC:SQLSERVER/;
                my $uid = q/123/;
                my $pwd = q/123/;
                my $DRIVER = "Freetds";
                my $dbh = DBI->connect($DSN,$uid,$pwd) or die "Coudn't Connect SQL";
                if ($user ne '')
                        {
                        if($password eq $repassword)
                                {
                                        my $sth=$dbh->do("insert into rpt_account_information (user_id,username,password,user_status,is_admin) values(2,'".$user."','".$password."',1,1)");
                                        my $value=$sth;
                                        print $value,"\n";
                                        if($value == 1)
                                        {
                                                print 'Your pass has benn changed.<a href="login.pl">Return</a> to the main page';
                                        }
                                }
                        else
                                {
                                        print "<script>alert('Password and Re-Password does not match')</script>";
                                }
                        }

                else
                        {
                                print "<script>alert('Please Enter the User Name')</script>";

                        }

                }
4

1 に答える 1

0
my $create_newuser;
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);
...;
$create_newuser =sub { ... };

CGI::Ajax新しいオブジェクトを作成した時点では、$create_newuser変数はまだundefです。それに coderef を割り当てるのはずっと後のことです。

を作成する$create_newuser に、次のいずれかを割り当てることができますCGI::Ajax

my $create_newuser =sub { ... };
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);
...;

または、通常の名前付きサブルーチンを使用して coderef を渡します。

my $ajax = new CGI::Ajax('fetch_javaScript' => \&create_newuser);
...;
sub create_newuser { ... }

この主なエラー以外にも、スクリプトにはさらに多くの問題があります。

use strictオプションの代わりにする必要があり-wます。

デバッグのみを目的としており、場合によっては非常に役立つuse CGI::Carp 'fatalsToBrowser'場合もあります。warningsToBrowserそれ以外の場合は、エラー ログを注意深く監視する必要があります。

my $p = new CGI qw(header start_html end_html h1 script link)意味がありません。my $p = CGI->new十分なはずです。

use Class::Accessorここでは少しランダムに見えます。

の HTMLShow_htmlは不注意です。まず、ヒアドキュメントでは変数補間とエスケープ コードが許可されます。これには、二重引用符文字列のセマンティクスがあります。ほとんどの場合、それは望ましくありません。<<'END_OF_HTML'補間などを避けるために、ヒアドキュメントを開始します。
次に、作成しているタグ スープを見てください。ここに私を驚かせるいくつかのスニペットがあります:

  • bgcolor="#D2B9D3"align="middle"– CSS がまだ発明されていないためです。
  • <center>– CSS はまだ発明されておらず、この要素はまったく廃止されていないためです。
  • <table><tr><td><div ... </div></td></tr></table>– 単一のセルを含むテーブルには何の問題もないからです。(何のために? これはレイアウト上の理由でさえありません!) この表のセルには 1 つのdiv…</li>
  • …これには別のcenter. まじめな話、不要な DOM 要素の素晴らしいところは、CSS が選択肢にさえないということです。
  • style="width:400px;height:250px;border:3px solid black;"–レスポンシブデザインがまだ発明されていないため.
  • <p> ... </b>– なんておいしいタッグスープ!
  • &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp– これはタイプライターではありません。レイアウトには CSS と適切なマークアップを使用してください。空白を含むテキストとレイアウト内の空の領域には違いがあります。
  • tabindex = "1"tabindex = "1"… – 私はあなたがtabindex = "1"をするかわからないと思います.tabindex
  • <A HREF = login.pl>– あなたの属性を小文字化または引用するのは弱者のためです!!1
  • onclick="fetch_javaScript(['user','newpassword','repassword']);"– CGI::Ajaxのドキュメントを読みましたか? これは動作方法ではありません: 回答 HTML が表示される要素の ID で別の引数を定義する必要があります。

create_newuser、SQL インジェクションの脆弱性があります。それを解決するには、プレースホルダーを使用します。$sth->do("INSERT INTO ... VALUES('$foo')")使用する代わりに$sth->do('INSERT INTO ... VALUES(?)', $foo)

print ...– Ajax ハンドラーは出力を出力するのではなくreturn、HTML 文字列を出力する必要があります。HTML 文字列は、JS 関数が指定した場所で DOM にフックされます。あなたは次のようなものが欲しい

use HTML::Entities;

sub create_newuser {
  my ($user, $password, $repassword) = $p->params('args');
  my ($e_user, $e_password) = map { encode_entities($_) } $user, $password;
  # DON'T DO THIS, it is a joke
  return "Hello <em>$e_user</em>, your password <code>$e_password</code> has been successfully transmitted in cleartext!";
}

そしてあなたのJSで:

fetch_javaScript(['user','newpassword','repassword'], ['answer-element'], 'GET');

HTML ドキュメントのどこかに<div id="answer-element" />.

于 2013-09-09T07:42:23.333 に答える