0

我在表中有一组用于更新密码的代码,这里我使用 CGI::AJAX 模块来更新密码并在相应的执行时获取弹出屏幕。当在我的应用程序中使用该代码时,它可以正确执行但我没有'没有得到输出(意味着当 JavaScript 函数获取 use.password 时没有调用 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很粗心。首先,您的 heredocs 允许变量插值和转义码——它具有双引号字符串的语义。大多数时候,你不希望这样。开始一个heredoc,<<'END_OF_HTML'以避免插值等。
其次,看看你正在生产的标签汤!以下是一些令我惊讶的片段:

  • bgcolor="#D2B9D3", align="middle"– 因为 CSS 还没有被发明出来。
  • <center>– 因为 CSS 还没有被发明出来,而且这个元素根本没有被弃用
  • <table><tr><td><div ... </div></td></tr></table>– 因为包含单个单元格的表格没有任何问题。(为什么?这甚至不是出于布局原因!)这个表格单元格包含一个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 字符串,然后在你的 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 回答