2013-04-18 2 views
1

Я очень новичок в Perl. Я сделал простой сценарий входа, который должен установить cookie перед перенаправлением на мою страницу формы. Я пробовал все, что мог, но cookie не установлен в Safari. Несколько сообщений показывают небольшие вариации, и я пробовал их все.Perl CGI :: Cookie не установлен в Safari

мой код:

my $userQuery = "SELECT user_name , password FROM egi_users WHERE user_name = '$username' AND password = '$cryptword'"; 
my $result = $dbh->prepare($userQuery); 
$result->execute()or die "MYSQL ERROR : $DBI::errstr\n"; 

my $rows = $result->rows; 

if($rows == 1){ 

    #login is valid. Create cookie and send to patient_data page.                       
    #print("success\n");                                 

    my $c = CGI::Cookie->new(-name=>'login_access', 
          -value=>$username, 
          -expires=>'+1h'); 

    print $q->redirect(-uri=>'http://mytestserver.com/cgi/patient_data.pl' , -status => '301' , -cookie => $c); 


}else{ 

    print $q->redirect(-uri=>'http://mytestserver.com/); 
} 

Я реализовал все, что кажется необходимым сюда CGI;

использование CGI; использование CGI :: Carp ... использование CG :: Session; использование CGI :: Cookie;

Сценарий правильно проверяет и перенаправляет, но cookie никогда не устанавливается. Я не уверен, что делаю. Если у вас есть лучшее предложение в подходе, , это тоже здорово.

Спасибо за внимание

+0

Почему вы печатаете свои собственные заголовки вместо использования модуля CGI? И зачем использовать перенаправление JavaScript вместо перенаправления HTTP? – friedo

+0

Я пробовал использовать перенаправления http, и они, похоже, не работают после того, как заголовок был напечатан, поэтому, если перенаправление необходимо в середине страницы, я считаю, что метод JS является единственным вариантом. Что касается печати заголовка с CGI, я только что увидел это вчера в первый раз. – Miek

+0

HTTP-перенаправление * - это заголовок. – friedo

ответ

2

Статус 301 является постоянной переадресацией. Вы проверяете, зарегистрирован ли пользователь или нет, а затем дайте им постоянную переадресацию, если они дают правильное имя пользователя/пароль? Как они выходят из системы или регистрируются как кто-то еще? Это будет невозможно.

Для этого вам необходимо очистить кеш Safari и использовать Status 303, 'See Other'.

Кроме того, ваш код уязвим для атаки SQL-инъекций. Попробуйте:

my $userQuery = "SELECT user_name , password FROM egi_users WHERE user_name = ? AND password = ?"; 
my $result = $dbh->prepare($userQuery); 
$result->execute($username, $cryptword)or die "MYSQL ERROR : $DBI::errstr\n"; 

Кроме того, он, казалось бы, кто-то может войти в приложение, просто делая печенье с именем пользователя в нем. Кому нужны пароли ...

+0

Спасибо за советы – Miek

Смежные вопросы