Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите чуть исправить скрипт, скрипт не так работает, не пойму в чем д 
:(
    Опции темы
sveya
  Дата 18.5.2011, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.5.2011

Репутация: нет
Всего: нет



Здравствуйте, помогите подкорректировать скрипт.
Скрипт должен при правильном вводе пароля и логина из БД выдавать "Добро пожаловать", иначе "неверные логин и/или пароль"
При работе с БД все отлично работает, но при вводе пустых значений(логина и/или пароля) тоже срабатывает на "Добро пожаловать"
В чем прорблема?

Присоединённый файл ( Кол-во скачиваний: 63586 )
Присоединённый файл  ____.rar 1,29 Kb
PM MAIL   Вверх
bugmenot1
Дата 18.5.2011, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



☻ Вставляйте свой код в сообщение. Думаете людям заняться больше нечем чем качать ваши архивы, распаковывать и открывать?
PM MAIL   Вверх
sveya
Дата 18.5.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.5.2011

Репутация: нет
Всего: нет



Скрипт
Код

#!/usr/bin/perl
print "Content-type:text/html\n\n";
use DBI;
print "<html>";
print "<title> ";
print "Авторизация";
print "</title>";
print "<head> ";
print "<h1><i>Проверка данных</i></h1>  ";
print "</head> ";
print "<body>";

$string=$ENV{'QUERY_STRING'};
@line=split(/&/,$string);
print "<br>";



foreach $item (@line) {
($n, $val)=split(/=/,$item);
 if ($n eq "log"){
   $name=$val;
   }

   if ($n eq "pas"){
   $pasw=$val;
   }
}

$dbh=DBI->connect("DBI:mysql:test","","") || print "Connect ERROR";
$sth=$dbh->prepare("SELECT `id` FROM `login` WHERE `name`='$name';") || print "ERROR PREPARE!!!";
$sth->execute || print "ERROR EXE";

@base=$sth->fetchrow();

$id=@base[0];

$sth=$dbh->prepare("SELECT `pas` FROM `pas` WHERE `id`='$id';") || print "ERROR PREPARE!!!";
$sth->execute || print "ERROR EXE";

@base=$sth->fetchrow();
$pas=@base[0];
$sth=$dbh->prepare("SELECT `pas.pas` FROM `pas` ;") || print "ERROR PREPARE!!!";

if ($pas==$pasw)  {

print " Здравствуйте, $name! Авторизация произведена успешно! <br>\n";
}  else {
  print " Неверный логин или пароль! <br>\n";
}

print "</body>";
print "</html>";


$sth->finish;
$dbh->disconnect;



Форма

Код

<html>
<title>
Авторизация
</title>
<head>
<h1><i>Авторизация</i></h1>
</head>
<body>
<i>Для входа в систему введите логин и пароль.</i> <br><br>

<PRE>
<form action=http://localhost/cgi-bin/mybase.cgi>
Логин: &nbsp; <input type=text name=log><br>
Пароль: <input type=password name=pas><br><br>
<input type=submit>
</pre>
</body>
</html>




Сама БД=>

CREATE DATABASE `test` ;

CREATE TABLE login(id int, name varchar(30));
INSERT INTO login (id, name) values ("1", "adm");

INSERT INTO login (id, name) values ("2", "user");

INSERT INTO login (id, name) values ("3", "user1");

CREATE TABLE pas(id int, pas int);
INSERT INTO pas(id, pas) values ("1", "000");

INSERT INTO pas(id, pas) values ("2", "111");

INSERT INTO pas(id, pas) values ("3", "222");

PM MAIL   Вверх
NuINu
Дата 18.5.2011, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 19.7.2008

Репутация: 1
Всего: 6



учитесь работать с лог файлами, весь ошибочный вывод должн выводиться в stderr, а он в свою очередь должен быть перенаправлен в лог файл

поэтому вот это должно быть переделано: $sth=$dbh->prepare("SELECT `pas.pas` FROM `pas` ;") || print "ERROR PREPARE!!!";

кроме того ваш код представляет собой идеальную мишень для SQL-injection

как только научитесь выводить все в лог файл, выведите туда все что к вам пришло с запросом, и все что вы получили при выполнении SQL запроса, вообщем то вопросы должны отпасть сами собой.
PM MAIL   Вверх
EcSYZ
Дата 19.5.2011, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



Может стоит хотя бы начать с БД, в которой логин и пасс будут в одной таблице, ибо от этого разделения нет никакого толка.
PM MAIL WWW   Вверх
infarch
Дата 19.5.2011, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Да и CGI неплохо бы освоить вместо ручного ковыряния квери стринга...
PM MAIL   Вверх
sveya
  Дата 20.5.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.5.2011

Репутация: нет
Всего: нет



Спасибо, у меня получилось! smile 
Только теперь вот нужно сделать, так, чтобы при успешной авторизации, выходило сообщение "Неверный логин и/или пароль" (типа обманывалка) и снова выходила форма для авторизации, но на этот раз в случае правильного ввода, чтоб появлялось сообщение "Добро пожаловать", а иначе "Неверный логин и/или пароль"
 smile Пытаюсь сделать, но только запутываюсь все больше и больше smile Помогите.


Кстати, вот правильный .cgi для авторизации=>

Код

#!/usr/bin/perl
print "Content-type:text/html\n\n";
use DBI;
$dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
use CGI;
my $q=CGI->new;
$step1=$q->param ("step1");
if ($step1) {
    $login=$q->param('login');
    $pas=$q->param('pas');
    $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
    $a->execute;
    $id=$a->fetchrow();
    if ($id)
         { print "Добро пожаловать" }
         else { print "Неверный логин или пароль
         <form>
         <input type=hidden name=step1 value=yes> <br>
         Логин <input type=text name=login> <br>
         Пароль <input type=text name=pas> <br>
         <input type=submit>
         </form>";};
       }

else {
print "<form>
<input type=hidden name=step1 value=yes> <br>
Авторизация   <br>

Логин  <input type=text name=login> <br>
Пароль <input type=text name=pas> <br>
<input type=submit>
</form>";
}


PM MAIL   Вверх
sveya
Дата 21.5.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.5.2011

Репутация: нет
Всего: нет



Пытаюсь написать...по логике вроде построено правильно, но почему-то при втором разе ввода правильного пароля выдает не "добро подаловать", а заново "авторизация". Что я упустила??
Код

#!/usr/bin/perl
print "Content-type:text/html\n\n";
use DBI;
$dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
use CGI;
my $q=CGI->new;
$step1=$q->param ("step1");
$step2=$q->param ("step2");
if ($step1) {
    $login=$q->param('login');
    $pas=$q->param('pas');
    $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
    $a->execute;
    $id=$a->fetchrow();
    if ($id)
    { 
      if ($step2) {
           $login=$q->param('login');
           $pas=$q->param('pas');
           $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
           $a->execute;
           $id=$a->fetchrow();
           if ($id)
              { print "Добро пожаловать" }
           else { print "Неверный логин или пароль
              <form>           
              Логин <input type=text name=login> <br>
              Пароль <input type=text name=pas> <br>
              <input type=submit>
              </form>";
              }
         }
        
       else   {
            print "Неверный логин или пароль
            <form>
            <input type=hidden name=step2 value=yes>
            Логин  <input type=text name=login> <br>
            Пароль <input type=text name=pas> <br>
            <input type=submit>
            </form>";
             }     
      } 

   else { 
      print "Неверный логин или пароль
      <form> 
      Логин <input type=text name=login> <br>
      Пароль <input type=text name=pas> <br>
      <input type=submit>
      </form>";
         }
}
       
else {
print "<form>
<input type=hidden name=step1 value=yes> <br>
Авторизация   <br>
Логин  <input type=text name=login> <br>
Пароль <input type=text name=pas> <br>
<input type=submit>
</form>";
}


PM MAIL   Вверх
EcSYZ
Дата 22.5.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



1)предлагаю начать с добавления:
Код

use strict;
use warnings;


2)в чём заключается тайный смысл step1 и step2, которые делают одно и тоже ?

3)
Код

...
my $login=$q->param('login');
my $pas=$q->param('pas');
unless(defined $login && defined $pas){
   #показываем страницу для ввода логина и паса
}
#проверяем авторизацию
my $user_info = $dbh->selectrow_hashref(q{SELECT login.id FROM login,pas where login.name=? and pas.pas=? and login.id=pas.id}, undef, $login, $pass);
unless(defined $user_info){
   #показываем страницу для ввода логина и паса
}
#авторизация прошла успешно ... мутим кукисы и прочее
...


PS: В случае если никакую инфу получать из БД не надо, то можно заюзать:
Код

my $count = $dbh->do(q{SELECT login.id FROM login,pas where login.name=? and pas.pas=? and login.id=pas.id}, undef, $login, $pass);
if($count==0){
   #показываем страницу для ввода логина и паса
}


Это сообщение отредактировал(а) EcSYZ - 22.5.2011, 12:46
PM MAIL WWW   Вверх
sveya
Дата 22.5.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.5.2011

Репутация: нет
Всего: нет



EcSYZ
"PS: В случае если никакую инфу получать из БД не надо, то можно заюзать"...Что-то не очень поняла, мне нужны логин и пароль из БД

и скрипт ваш совсем не понимаю smile мы только только начали изучать Perl.
Задание вот такое-чтобы при успешной авторизации, выходило сообщение "Неверный логин и/или пароль" (типа обманывалка) и снова выходила форма для авторизации, но на этот раз в случае правильного ввода, чтоб появлялось сообщение "Добро пожаловать", а иначе "Неверный логин и/или пароль"
с этой целью я ввожу еще и step 2, т.е. при определении существующего id чтоб шло на цикл с step2, но почему-то он туда не заходит.Вот скрипт вроде правильный по логике, но не идет он в step2 и все((
Код

#!/usr/bin/perl
print "Content-type:text/html\n\n";
use DBI;
$dbh=DBI->connect("DBI:mysql:test","","") or print "Error connect base";
use CGI;
my $q=CGI->new;
$step1=$q->param ("step1");
$step2=$q->param ("step2");
if ($step1) {
    $login=$q->param('login');
    $pas=$q->param('pas');
    $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
    $a->execute;
    $id=$a->fetchrow();
    if ($id)
    { 
        if ($step2) {
            $login=$q->param('login');
            $pas=$q->param('pas');
            $a=$dbh->prepare("SELECT login.id FROM login,pas where login.name=\"".$login."\" and pas.pas=\"".$pas."\" and login.id=pas.id;");
            $a->execute;
            $id=$a->fetchrow();
            if ($id)
               { print "Добро пожаловать" }
            else { 
               print "неверный логин или пароль
               <form>  <input type=hidden name=step1 value=yes>         
               Логин   <input type=text name=login> <br>
               Пароль  <input type=text name=pas> <br>
               <input type=submit>
               </form>";
               }
         }
        
        else   {
            print "Неверный логин или пароль
            <form>
            <input type=hidden name=step2 value=yes>
            Логин   <input type=text name=login> <br>
            Пароль  <input type=text name=pas> <br>
            <input type=submit>
            </form>";
             }     
    } 

   else { 
       print "неверный логин или пароль
       <form> <input type=hidden name=step1 value=yes>
       Логин  <input type=text name=login> <br>
       Пароль <input type=text name=pas> <br>
       <input type=submit>
       </form>";
         }
    }
       
else {
print "<form>
<input type=hidden name=step1 value=yes> <br>
Авторизация   <br>
Логин  <input type=text name=login> <br>
Пароль <input type=text name=pas> <br>
<input type=submit>
</form>";
}




Этот скрипт нельзя никак иначе переделать? для меня ваш скрипт сложен smile  точнее я не смогу его переделать сама

Это сообщение отредактировал(а) sveya - 22.5.2011, 13:09
PM MAIL   Вверх
shamber
Дата 22.5.2011, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



Цитата(sveya @  22.5.2011,  13:06 Найти цитируемый пост)
"PS: В случае если никакую инфу получать из БД не надо, то можно заюзать"...Что-то не очень поняла, мне нужны логин и пароль из БД

смысл в том что prepare используют как правило, если хотят в дальнейшем использовать подобный запрос. А do для однократных запросов.
PM MAIL Jabber   Вверх
sveya
Дата 22.5.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.5.2011

Репутация: нет
Всего: нет



shamber,  а поняла...ток ниче не выходит у  меня smile Господииии 
PM MAIL   Вверх
sveya
Дата 22.5.2011, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 18.5.2011

Репутация: нет
Всего: нет



получилось, получилось!!!!!!! smile 
PM MAIL   Вверх
EcSYZ
Дата 22.5.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 21.6.2007

Репутация: нет
Всего: 1



Ну я под do подразумевал слегка другой смысл: так как в коде нигде не используется логин, из селекта, то можно просто заюзать do для проверки, есть ли данный юзер с указанным пасом.

Это сообщение отредактировал(а) EcSYZ - 22.5.2011, 17:53
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.1417 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.