开始还满怀信心的打算拿 Perl 写一个文件上传管理程序,可是在写完了登陆部分之后就泄气了。原因很简单,服务器不支持 CGI::Session,而我又不想花时间去研究 Perl Cookie。

login.cgi
  1. #!/usr/bin/perl -w
  2. # ***********************************************
  3. # *  Handle User Login                          *
  4. # ***********************************************
  5. use strict;
  6.  
  7. use DBI;
  8. #use CGI::Session;
  9. use CGI;
  10. use Digest::MD5 qw(md5_hex);
  11.  
  12. # Get the CGI form data
  13. my $cgi = new CGI;
  14. # Fetch login username and password
  15. my $user_name = $cgi->param('username');
  16. my $user_pass = $cgi->param('password');
  17. $user_name =~ s/(?:\012\015|\012|\015)//g;
  18. $user_pass =~ s/(?:\012\015|\012|\015)//g;
  19. $user_pass = md5_hex($user_pass);
  20. my $user_login = 0
  21.  
  22. require "config.pm"
  23.  
  24. # Import Database configuration
  25. our $db_host;
  26. our $db_use;
  27. our $db_user;
  28. our $db_pass;
  29. our $db_table;
  30.  
  31. # Connect to database
  32. my $db_conn = DBI->connect("DBI:mysql:database=$db_use;host=$db_host","$db_user","$db_pass", {'RaiseError' => 1});
  33. print "Location: /error-503\n\n" unless $db_conn;
  34.  
  35. # Check if we have such password in database
  36. my $sql = $db_conn->prepare("SELECT username FROM `$db_table` WHERE user_password='$user_pass'");
  37. $sql->execute() or print "Location: /error-503\n\n";
  38.  
  39. # Process query result
  40. while(my @result = $sql->fetchrow_array()) {
  41.   if($user_name eq $result[0]) {
  42.     # Here we go. A user is found with the same username and password.
  43.     $user_login = 1
  44.     last;
  45.   }
  46. }
  47.  
  48. # Disconnect from database
  49. $db_conn->disconnect();
  50.  
  51. # Not pass user check? Kick it out!
  52. print "Location: /error-401\n\n" unless $user_login;
  53.  
  54. # User check successful! Log it in!
  55. print "Content-type: text/plain\n\nYes !";
  56.  
  57. exit(0);

其中登陆部分采用了《突发奇想,小改动解决安全问题》其中的方法。

看来要重操 PHP 旧业了……