Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.05.2017, 10:45
Асяу Асяу вне форума
Прохожий
 
Регистрация: 08.05.2017
Сообщения: 7
Версия Delphi: RAD Studio 10.1
Репутация: 10
Вопрос Считывание и проверка строки

Имеем:
Текстовый файла, в нем данные в формате
Петров Петр группа: 111 1
ФИО-Группа№ Пароль
Данный фал хранит в себе данные для авторизации и сохраняет новые при регистрации.
Задача:
Проверить, имеются ли в файле введенные данные.
Это успешно реализовано так:
Код:
LogAndGruppa_Regis:=Register_Familiya.Text+'   группа: '+Register_Gruppa.Text+'     '+Register_Password.Text;
  for iterIntCount:=0 to SaveTxt1.Count -1 do
      begin
        if LogAndGruppa_Regis = SaveTxt1[iterIntCount] then
          begin
          Application.MessageBox('Вы уже зарегистрированы!'+#13#10+'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING);
          Exit;
          end
          end;
             if (Register_Familiya.Text = '') or (Register_Gruppa.Text = '') or (Register_Password.Text = '') then
               begin
               Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING);
               end else
                  begin
                  Registr_Familiya_P:=Trim(Register_Familiya.Text);
                  Registr_Gruppa_P:=Trim(Register_Gruppa.Text);
                  Registr_Password_P:=Trim(Register_Password.Text);
                  SaveTxt1.Add(Register_Familiya.Text+'   группа: '+Register_Gruppa.Text+'     '+Register_Password.Text);
                  SaveTxt1.Add('______________________________________________________');
                  SaveTxt1.Add(' ');
                  SaveTxt1.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt');
                  Register_Familiya.clear;
                  Register_Gruppa.clear;
                  Register_Password.clear;
                  Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK);
                  end;
  end;
НО! Код целиком вытаскивает строку, поэтому, если вписать в ЕДИТы данные как в строке - скажет, что такой юзер уже есть, а вот если поменять пароль - нет.
Нужно реализовать проверку по Фамилии Имени и группе, отсекая пароль.
Т.е. Если в какой то строке подряд идут данные ФИО Группа и они совпадают с введенным в ЕДИТы - сказать, что юзер уже есть.

Битые сутки над этим бьюсь, сил уже нет!
Как можно реализовать такое в рамках данного кода?
Ответить с цитированием
  #2  
Старый 08.05.2017, 18:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Проще через TStringList разбить строку по пробелам и сравнить элементы.
Код:
sl.Delimiter     := ' ';
sl.DelimitedText := S;

if (Register_Familiya.Text = sl[0]) and (Register_Gruppa.Text = sl[3]) then  { зарегистрирован };

lmikle: Bargest, скобАчки не забывай
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 08.05.2017 в 19:59.
Ответить с цитированием
  #3  
Старый 08.05.2017, 19:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Можно еще примерно так:
Код:
if Pos(AnsiUpperCase(Register_Familiya.Text + ' группа: ' + Register_Gruppa.Text),AnsiUpperCase(S)) > 0 Then {зарегистрирован}
Тут не нужен доп. объект, просто ищем есть ли такая подстрока (без пароля).

ЗЫ. А вообще, хранить такие данные в текстовом файле как-то не айс. Либо нужно делать бинарный файл, либо БД, либо текстовый, но немного другого формата. Ну и пароль хранить в открытом виде - явный моветон
Ответить с цитированием
  #4  
Старый 09.05.2017, 15:26
Асяу Асяу вне форума
Прохожий
 
Регистрация: 08.05.2017
Сообщения: 7
Версия Delphi: RAD Studio 10.1
Репутация: 10
По умолчанию

lmikle, я не могу сообразить, как это воткнуть в текущую конструкцию кода?
Я так понимаю, что S -это строка с данными, но ведь ее номер заранее неизвестен..
Ответить с цитированием
  #5  
Старый 09.05.2017, 17:59
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

S - это строка из файла. Тебе надо проверить все строки в файле.
Смысл кода - просто формируется частитчная строка тем же способом, что и для записи в файл (кроме пароля) и просто в каждой строке из файла ищется - не входит ли эта строка как подстрока. Если да, то такой пользователь уже есть. Ну и сделано, что бы искала без учета регистра, но это так, на всякий случай.
Ответить с цитированием
  #6  
Старый 09.05.2017, 19:00
Асяу Асяу вне форума
Прохожий
 
Регистрация: 08.05.2017
Сообщения: 7
Версия Delphi: RAD Studio 10.1
Репутация: 10
По умолчанию

lmikle, я совсем новичок в этом деле..
Код:
procedure TFORM_LOGIN.Register_ButtonClick(Sender: TObject);
  var
  S:string;
  begin
  Load_From_File_Passw:=TStringList.Create;
  Load_From_File_Passw.LoadFromFile(ExtractFilePath(Application.ExeName)+'lgn.tnt');
  LogAndGruppa_Regis:=Register_Familiya.Text+'   группа: '+Register_Gruppa.Text+'     '+Register_Password.Text;
  for iterIntCount:=0 to Load_From_File_Passw.Count -1 do
      begin
      if Pos(AnsiUpperCase(Register_Familiya.Text + '   группа: ' + Register_Gruppa.Text),AnsiUpperCase(S)) > 0 Then
          begin
          Application.MessageBox('Вы уже зарегистрированы!'+#13#10+'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING);
          Login_Familiya.Text:= Register_Familiya.text;
          Login_Gruppa.Text:= Register_Gruppa.text;
          Register_Familiya.clear;
          Register_Gruppa.clear;
          Register_Password.clear;
          Exit;
          end
          end;
             if (Register_Familiya.Text = '') or (Register_Gruppa.Text = '') or (Register_Password.Text = '') then
               begin
               Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING);
               end else
                  begin
                  Registr_Familiya_P:=Trim(Register_Familiya.Text);
                  Registr_Gruppa_P:=Trim(Register_Gruppa.Text);
                  Registr_Password_P:=Trim(Register_Password.Text);
                  Load_From_File_Passw.Add(Register_Familiya.Text+'   группа: '+Register_Gruppa.Text+'     '+Register_Password.Text);
                  Load_From_File_Passw.Add('______________________________________________________');
                  Load_From_File_Passw.Add(' ');
                  Load_From_File_Passw.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt');
                  Login_Familiya.Text:= Register_Familiya.text;
                  Login_Gruppa.Text:= Register_Gruppa.text;
                  Register_Familiya.clear;
                  Register_Gruppa.clear;
                  Register_Password.clear;
                  Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK);
                  end;
  end;
Вроде так пишу, а не работает - сразу регистрирует..
Ответить с цитированием
  #7  
Старый 10.05.2017, 01:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну а S-то где инициализируется???
либо
Код:
if Pos(AnsiUpperCase(Register_Familiya.Text + '   группа: ' + Register_Gruppa.Text),AnsiUpperCase(Load_From_File_Passw[iterIntCount])) > 0 Then
либо перед строкой 10 вставь:
Код:
S := Load_From_File_Passw[iterIntCount];
Ответить с цитированием
  #8  
Старый 10.05.2017, 23:30
Асяу Асяу вне форума
Прохожий
 
Регистрация: 08.05.2017
Сообщения: 7
Версия Delphi: RAD Studio 10.1
Репутация: 10
По умолчанию

lmikle, разобрался, спасибо
НО теперь он не проверяет поля (если поля пустые - должен говорить, что их необходимо заполнить, а он говорит, что уже зарегистрирован)
Ответить с цитированием
  #9  
Старый 11.05.2017, 00:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну да. Если поля пустые, то, как ты думаешь, есть ли в файле где-то строка с подстрокой ' группа: '? Вот что-то мне подсказывает, что точно есть, если только файл не пустой.

Просто проверку пустых полей надо делать первой.
Ответить с цитированием
  #10  
Старый 11.05.2017, 00:49
Асяу Асяу вне форума
Прохожий
 
Регистрация: 08.05.2017
Сообщения: 7
Версия Delphi: RAD Studio 10.1
Репутация: 10
Печаль

lmikle, если я делаю проверку первой - он проверяет нормально, но если ввожу данные, которые уже есть в документе - List index out bounds (55) - такая ошибка.
Код:
 begin
  Load_From_File_Passw:=TStringList.Create;
  Load_From_File_Passw.LoadFromFile(ExtractFilePath(Application.ExeName)+'lgn.tnt');
  for iterIntCount:=0 to Load_From_File_Passw.Count -1 do
      begin
      if (Register_Familiya.Text = '') or (Register_Gruppa.Text = '') or (Register_Password.Text = '') then
          begin
          Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING);
          Exit;
          end
          end;
            if Pos(AnsiUpperCase(Register_Familiya.Text + '   группа: ' + Register_Gruppa.Text),AnsiUpperCase(Load_From_File_Passw[iterIntCount])) > 0 Then
               begin
               Application.MessageBox('Вы уже зарегистрированы!'+#13#10+'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING);
               Login_Familiya.Text:= Register_Familiya.text;
               Login_Gruppa.Text:= Register_Gruppa.text;
               Register_Familiya.clear;
               Register_Gruppa.clear;
               Register_Password.clear;
               end else
                  begin
                  Registr_Familiya_P:=Trim(Register_Familiya.Text);
                  Registr_Gruppa_P:=Trim(Register_Gruppa.Text);
                  Registr_Password_P:=Trim(Register_Password.Text);
                  Load_From_File_Passw.Add(Register_Familiya.Text+'   группа: '+Register_Gruppa.Text+'     '+Register_Password.Text);
                  Load_From_File_Passw.Add('______________________________________________________');
                  Load_From_File_Passw.Add(' ');
                  Load_From_File_Passw.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt');
                  Login_Familiya.Text:= Register_Familiya.text;
                  Login_Gruppa.Text:= Register_Gruppa.text;
                  Register_Familiya.clear;
                  Register_Gruppa.clear;
                  Register_Password.clear;
                  Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK);
                  end;
  end;
Ответить с цитированием
  #11  
Старый 11.05.2017, 02:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
var
iterIntCount: integer;
Load_From_File_Passw: TStrings;
flg: boolean;
begin
 if (Register_Familiya.Text = '') or
    (Register_Gruppa.Text = '') or
    (Register_Password.Text = '') then
      begin
       Application.MessageBox('Вход невозможен!' + #13#10 +
        'Заполните все поля', 'Внимание!', + MB_ICONWARNING);
       Exit;
      end;

  Load_From_File_Passw:= TStringList.Create;
try
  Load_From_File_Passw.LoadFromFile(
   ExtractFilePath(Application.ExeName)+'lgn.tnt');
  flg:= false;
  for iterIntCount:= 0 to Load_From_File_Passw.Count-1 do
  if Pos(AnsiUpperCase(Register_Familiya.Text + '   группа: ' +
       Register_Gruppa.Text),
       AnsiUpperCase(Load_From_File_Passw[iterIntCount])) > 0 then
         flg:= true;

  if flg then
   begin
    Application.MessageBox('Вы уже зарегистрированы!' + #13#10 +
     'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING);
   end else
    begin
     Registr_Familiya_P:=Trim(Register_Familiya.Text);
     Registr_Gruppa_P:=Trim(Register_Gruppa.Text);
     Registr_Password_P:=Trim(Register_Password.Text);
     Load_From_File_Passw.Add(Register_Familiya.Text+'   группа: '+
     Register_Gruppa.Text+'     '+Register_Password.Text);
     Load_From_File_Passw.Add(
     '______________________________________________________');
     Load_From_File_Passw.Add(' ');
     Load_From_File_Passw.SaveToFile(
      ExtractFilePath(Application.ExeName)+'lgn.tnt');

     Application.MessageBox('Регистрация успешно завершена!'+#13#10+
     'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK);
    end;
  end;
    Login_Familiya.Text:= Register_Familiya.text;
    Login_Gruppa.Text:= Register_Gruppa.text;
    Register_Familiya.clear;
    Register_Gruppa.clear;
    Register_Password.clear;
 finally
  Load_From_File_Passw.Free;
 end;
end;
не запускал, ошипки вылазят (компонентов некоторых нету)
Ответить с цитированием
  #12  
Старый 14.05.2017, 11:34
Асяу Асяу вне форума
Прохожий
 
Регистрация: 08.05.2017
Сообщения: 7
Версия Delphi: RAD Studio 10.1
Репутация: 10
Вопрос

Alegun, безмерно благодарен!
Но... я реальный дурак
Как и говорилось раньше - нужно все это дело прятать от лишних глаз.

Люди знающие, как думаете, возможно ли в рамках кода
Код:
begin
                 Registr_Familiya_P:=Trim(Register_Familiya.Text);
                 Registr_Gruppa_P:=Trim(Register_Gruppa.Text);
                 Registr_Password_P:=Trim(Register_Password.Text);
                 Load_From_File_Passw.Add(Register_Familiya.Text+'   группа: '+Register_Gruppa.Text+'     '+Register_Password.Text);
                 Load_From_File_Passw.Add('______________________________________________________');
                 Load_From_File_Passw.Add(' ');
                 Load_From_File_Passw.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt');
                 Login_Familiya.Text:= Register_Familiya.text;
                 Login_Gruppa.Text:= Register_Gruppa.text;
                 Register_Familiya.clear;
                 Register_Gruppa.clear;
                 Register_Password.clear;
                 Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK);
                 end;

Зашифровать Register_Gruppa.Text и только после этого внести его в файл.
Ну и соответственно в рамках кода
Код:
 Load_From_File_Login:=TStringList.Create;
  Load_From_File_Login.LoadFromFile(ExtractFilePath(Application.ExeName)+'lgn.tnt');
  LogAndGruppa_Login:=Login_Familiya.Text+'   группа: '+Login_Gruppa.Text+'     '+Login_Password.Text;
  for iterIntCount:=0 to Load_From_File_Login.Count -1 do
      begin
        if LogAndGruppa_Login = Load_From_File_Login[iterIntCount] then
          begin
          FORM_LOGIN.hide;
          FORM_TEST.Show;
          Exit;
          end
          end;
             if (Login_Familiya.Text = '') or (Login_Gruppa.Text = '') or (Login_Password.Text = '') then
               begin
               Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING);
               end else
                  begin
                  Application.MessageBox('Неверные данные!'+#13#10+'Проверьте корректность ввода данных и повторите попытку', 'Внимание!',+ MB_ICONWARNING);
                  end;
Расшифровать сравнить и если расшифрованное совпадает с введенным в поле - авторизовать.

Я думаю в сторону EncodeXXE и DecoderXXE, но это ненадежно...
А что, если заставить пользователя создавать пароль только из цифр и при сохранении умножать на 2 и прибавлять 16, при обратной процедуре - делить на 2 и вычитать 16... Глупо наверное, но в мою голову ничего больше не идет.
Буду рад помощи
Ответить с цитированием
  #13  
Старый 14.05.2017, 15:07
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Обычно это делается совсем по-другому.
Самый простой, и при этом более-менее надежный вариант - создать базу данных (например, легковесную SQLite), с таблицей вида
Код:
Имя;Фамилия;Группа;ХешПароля
И хранить там MD5-хеш от пароля. Соответственно, при входе считать хеш от введенного пароля и сравнивать с тем, что лежит в базе. Смысл в том, что при нормальном пароле хеш-функция не обратима. То есть имея пароль, можно получить его хеш, но имея хеш, невозможно узнать пароль.
Поиск/проверка будет проходить не конструированием сложных строк, а обычным SQL запросом (... where name = 'Вася' and surname = 'Пупкин' and group = 5 and password_hash = ...)
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 14.05.2017 в 15:15.
Ответить с цитированием
  #14  
Старый 14.05.2017, 17:38
Асяу Асяу вне форума
Прохожий
 
Регистрация: 08.05.2017
Сообщения: 7
Версия Delphi: RAD Studio 10.1
Репутация: 10
По умолчанию

Шел девятый час работы...
Я написал авторизацию:
Код:
if (Login_Familiya.Text = '') or (Login_Gruppa.Text = '') or (Login_Password.Text = '') then
               begin
               Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING);
               exit
               end else
                    DataModule5.ADOQuery1.Sql.Clear;
                        DataModule5.ADOQuery1.Sql.Add('SELECT Password From Users Where NameAndSurname='+#39+Login_Familiya.Text+#39);
                        DataModule5.ADOQuery1.Open;
                            if DataModule5.ADOQuery1.IsEmpty then
                            ShowMessage('Пользователь '+Login_Familiya.Text+' не найден!')
                                else
                                if DataModule5.ADOQuery1.FieldByName('Password').Value<>Login_Password.Text
                                then
                                ShowMessage('Учетная запись найдена, но введен неверный пароль!')
                                    else
                                    FORM_TEST.Show;

Но что делать с регистрацией - не знаю.. Я не разбираюсь в БД


Я знаю, что везде туплю с этим кодом, но что в этом не так?
Код:
if (Registration_Familiya.Text = '') or (Registration_Gruppa.Text = '') or (Registration_Password.Text = '') then
              begin
               Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING);
               exit
               end else
                        DataModule5.ADOQuery1.Sql.Clear;
                        DataModule5.ADOQuery1.Sql.Add('SELECT Password From Users Where NameAndSurname='+#39+Login_Familiya.Text+#39);
                        DataModule5.ADOQuery1.Open;
                            if DataModule5.ADOQuery1.IsEmpty then
                            begin
                            ShowMessage('Пользователь '+Login_Familiya.Text+' не найден!');
                            begin
                            With DataModule5.ADOQuery1 do begin
                            Connection:=DataModule5.ADOConnection1;
                            Insert;
                            FieldByName('1').Value:=Registration_Familiya.Text;
                            FieldByName('edit2').Value:=Registration_Gruppa.Text;
                            FieldByName('edit3').Value:=Registration_Password.Text;
                             Post;
                            end;
                            end;
                            end
                                else
                                if DataModule5.ADOQuery1.FieldByName('Password').Value<>Registration_Password.Text
                                then
                                ShowMessage('Учетная запись найдена, но введен неверный пароль!')
                                    else
                                    FORM_TEST.Show;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter