Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2010, 18:41   #441
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
1. Закрывая канал юзера я вызываю на клиенте Disconnect и запускаю таймер для переподлючения. Если юзер не допущен до чата и сидит с запущеной прогой, переподключаясь через каждые 5 секунд, он тем самым будет ддосить сервер?

Код:
procedure TForm1.ConnectTimerTimer(Sender: TObject);
begin
  if AccessDenied = False then
    ClientSocket.Active := True;
end;
Нефиг дятлам делать в чате, при коннекте сразу проверка по списку и закрытие канала, без отправления сообщений, он (пользователь) знает за что его выкидывают, а простой пользователь такого не натворит, у него все корректно при подключении, стало быть ничего отсылать не нужно. Нормальный пользователь в список бана не попадет.

Цитата:
Сообщение от Shouldercannon
2. Внутренний интегер i убрал и разбан заработал, но после того как сервер отошлёт личку на клиента бан/разбан и дать/забрать админку рушатся в хлам. Во всех ошибка List index out of bounds (-1) вот здесь

Код:
// Отошлём команду бана
      ServerSocket.Socket.Connections[i - 1].SendText('20');
      // Получим IP забаненого
      GetBannedIP := ServerSocket.Socket.Connections[i - 1].RemoteAddress;
Полный расклад в Блоки в которых возникает ошибка.txt. Самое интересное, когда заходит новый юзер всё работает до тех пор, пока сервер снова не отошлёт личку.
Если i внутренний вы убрали, то циклы по-i в BanYes и UnbanYes по прежнему на месте ...это сбивает внешний цикл таймера по-i, в результате может быть что-угодно. Рекомендую в каждой процедуре создавать свою переменную в var для счетчика, если циклы принадлежат только этой процедуре, ...особенно на отправку пакетов.

Цитата:
Сообщение от Shouldercannon
Выставил len := length(text) - 2; и на клиенте стал виден только ник сервера. Полный расклад в прикреплённом файле. Но, однако оно работает с тем же самым кодом в таком виде len := length(text) - 1; нормально.
Нужно понять одно, что len - переменная длины вырезки, если из строки вырезать длину символов больше чем там есть, то в конец результата пойдет неопределенный добавочный символ, т.к. String - не ограничен и расширяется автоматически. Если вы запишете s: String[10] и вылезете за рамки, будет ошибка. В вашем случае идет пустой символ, который не виден, может это пробел, я не знаю, ...вот и видно, что результат одинаковый, но len := length(text) - 2; математически корректен.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 15.06.2010, 19:53   #442
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

1.
Цитата:
Сообщение от Shouldercannon
1. Закрывая канал юзера я вызываю на клиенте Disconnect и запускаю таймер для переподлючения. Если юзер не допущен до чата и сидит с запущеной прогой, переподключаясь через каждые 5 секунд, он тем самым будет ддосить сервер?
Код:
procedure TForm1.ConnectTimerTimer(Sender: TObject);
begin
  if AccessDenied = False then
    ClientSocket.Active := True;
end;
Нефиг дятлам делать в чате, при коннекте сразу проверка по списку и закрытие канала, без отправления сообщений, он (пользователь) знает за что его выкидывают, а простой пользователь такого не натворит, у него все корректно при подключении, стало быть ничего отсылать не нужно. Нормальный пользователь в список бана не попадет.
Немонго не правильно меня поняли. Юзер открыл программу в которой чат и плюс мониторинг игр. В чат его не пускает либо по диапазонам, либо IP занят и пока он сидит, программа постоянно делает Reconnect, так как сервер закрывает канал по причинам описанным ранее. Вопрос: этот Reconnect на клиенте способен сервер чата заддосить, если интервал переподключения 5 секунд.
Код:
if AccessDenied = False then
    ClientSocket.Active := True;
2.
Цитата:
Сообщение от Shouldercannon
Выставил len := length(text) - 2; и на клиенте стал виден только ник сервера. Полный расклад в прикреплённом файле. Но, однако оно работает с тем же самым кодом в таком виде len := length(text) - 1; нормально.

Нужно понять одно, что len - переменная длины вырезки, если из строки вырезать длину символов больше чем там есть, то в конец результата пойдет неопределенный добавочный символ, т.к. String - не ограничен и расширяется автоматически. Если вы запишете s: String[10] и вылезете за рамки, будет ошибка. В вашем случае идет пустой символ, который не виден, может это пробел, я не знаю, ...вот и видно, что результат одинаковый, но len := length(text) - 2; математически корректен.
Тогда вообще ничего не понятно. пусть пока будет так. Если начнёт ругаться, то тогда буду принимать меры.

P.S. Забыл написать, что если серверу личку отправить всё нормально.

Последний раз редактировалось Shouldercannon; 15.06.2010 в 22:00.
Shouldercannon вне форума Ответить с цитированием
Старый 15.06.2010, 22:05   #443
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
1. Немонго не правильно меня поняли. Юзер открыл программу в которой чат и плюс мониторинг игр. В чат его не пускает либо по диапазонам, либо IP занят и пока он сидит, программа постоянно делает Reconnect, так как сервер закрывает канал по причинам описанным ранее. Вопрос: этот Reconnect на клиенте способен сервер чата заддосить, если интервал переподключения 5 секунд.
Код:
if AccessDenied = False then
    ClientSocket.Active := True;
Ддос атакой считается загрузка запросами сервера от нескольких десятков раз в секунду, UDP-протокол этому способствует, его заткнуть нельзя, а TCP/IP защищенный, без установки канала связи не будет, и переподключение требует времени несколько больше, уже ослабляя нагрузку на сервер и он свободно справляется с отсеиванием дятлов, просто отключая их по мере подключения. Еще, ддос атакой считается создание по одному IP-адресу множества сокетов, которые коннектятся на один сервер, вызывая множество пустых подключений без ответа, до той поры пока сервер не переполнится соединениями и не падет. Если вы правильно создадите отсеивание по IP, то такого не произойдет.
Кроме того, ддос атакой считается и загрузка сервера запросами по одному каналу, так, что он не успевает выполнять команды. В программе я применил таймер, который не позволяет обрабатывать приходящие пакеты немедленно, а лишь спустя время в своей очереди. Приходящие пакеты затираются и сервер берет только последние. Вы можете так же создать систему, где будете контролировать интервал поступления пакетов от конкретного пользователя, чтобы выявлять нарушителей.

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
2. Тогда вообще ничего не понятно. пусть пока будет так. Если начнёт ругаться, то тогда буду принимать меры.
Почему ничего не понятно? ...вот строка: "qwerty" , если я вы режу с позиции 3 длиной 5, я получу подстроку: "erty ", на конце либо пробел, либо символ с кодом 0, он не отображается. Позволяет проделать операцию автоматическое удлинение строки типа String. Правильно будет вырезать с позиции 3 длиной 4! ...поскольку символов в строке осталось 4, а не 5! ...это и в len заложено.

...проверил специально некорректную вырезку, ...она проходит, но оставляет только хвост, оставшийся в строке, ...очевидно добавления символов нет, есть проверка на переполнение, я чрезмерно понадеялся на руки программиста, которые не допускают ошибок в коде, тем самым не вызывая проверок на переполнение. Можете поступать как-угодно.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 15.06.2010 в 22:18.
Beermonza вне форума Ответить с цитированием
Старый 15.06.2010, 22:36   #444
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Если i внутренний вы убрали, то циклы по-i в BanYes и UnbanYes по прежнему на месте ...это сбивает внешний цикл таймера по-i, в результате может быть что-угодно. Рекомендую в каждой процедуре создавать свою переменную в var для счетчика, если циклы принадлежат только этой процедуре, ...особенно на отправку пакетов.
Как я понял там i берётся общая только для получения IP и отправки в нужный канал. И здесь используется i типа Byte, а я думал Integer;
Код:
ServerSocket.Socket.Connections[i - 1].ReceiveText();
1. Уже больше нет сил. i (Byte) в бан/разбан, добавить/удалить админа юзается общая. И всёравно ошибка. Теперь когда в чате трое или больше юзеров, то ошибка уже List index out of bounds (-количество игроков) (Сервер = игнор, два юзера = -1, три юзера = -2 и тд).

2. При бане кого-то из юзеров (с клиента) в бан попадаю сам, но IP при этом заносится нужный (того кого забанил),

3. При бане первого юзера банится второй, тоже самое при разбане. Если баню второго, то банится первый. Проверял только с двумя юзерами.

Последний раз редактировалось Shouldercannon; 16.06.2010 в 11:32.
Shouldercannon вне форума Ответить с цитированием
Старый 16.06.2010, 16:45   #445
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Shouldercannon, включаем зрение! ...вот таймер:

Код:
procedure TForm1.ServerTimerTimer(Sender: TObject);
var
  a, e, i, m, n, Index: Integer;
  BannedIP, UnbannedIP: string;
begin
  TempName := '';

  // Условие на наличие установленных каналов
  if ServerSocket.Socket.ActiveConnections <> 0 then
    begin
      // Цикл по существующим каналам
      for i := 1 to ServerSocket.Socket.ActiveConnections do
        begin

        ...

        end;
    end;
end;
Это внешняя i, она считается от 1 !!! Теперь смотрим одну из процедур управления:

Код:
procedure TForm1.BanYes;
// var ???????????
begin
  if UserListView.Items.Count > 1 then
    begin
      
      ...

      // Отправляем сообщение с сервера всем пользователям
      for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
        begin
          ...
        end;
    end;
end;
Здесь вы снова применили для цикла i, причем внешнюю (структуры var в процедуре нет), которую трогать категорически запрещено.
Что происходит? ...основной таймер проверяет каналы по номеру i - 1, как только срабатывает процедура, например, BanYes, переменная i (внешняя) переназначается, поскольку счет в процедуре от 0 до ServerSocket.Socket.ActiveConnectio ns - 1 (внешний от 1 до ServerSocket.Socket.ActiveConnectio ns). Любое действие приводит с обращению к каналу с номером на 1 меньше, а если пользователь один, то вовсе к -1 каналу, о чем говорит Delphi в сообщениях.

Повторяю, замените в циклах рукописных процедур переменные на другие, например j1, j2, j3, j4, обязательно описанные в var секции процедуры, пусть они носят разные имена всегда, даже если Delphi различает внешние и внутренние переменные с одинаковым именем, ...это больше нужно для программиста, чтобы он видел различие и не делал ошибок.

Было:

Код:
procedure TForm1.BanYes;
// var ???????????
begin
  if UserListView.Items.Count > 1 then
    begin
      
      ...

      // Отправляем сообщение с сервера всем пользователям
      for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
        begin
          ...
        end;
    end;
end;
станет:

Код:
procedure TForm1.BanYes;
var
  j1: Integer;
begin
  if UserListView.Items.Count > 1 then
    begin
      
      ...

      // Отправляем сообщение с сервера всем пользователям
      for j1 := 0 to ServerSocket.Socket.ActiveConnections - 1 do
        begin
          ServerSocket.Socket.Connections[j1].SendText....

          ...

        end;
    end;
end;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 16.06.2010 в 16:55.
Beermonza вне форума Ответить с цитированием
Старый 16.06.2010, 17:38   #446
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Сделал откат до момента, где после отправки лички с сервера не работает бан/разбан, дать/забрать админку внеся в процедуры ban/Unban
Код:
var
i2: Integer;
...
      // Отправляем сообщение с сервера всем пользователям
      for i2 := 0 to ServerSocket.Socket.ActiveConnections - 1 do
        begin
          ServerSocket.Socket.Connections[i2].SendText('00' + '! .''. ' + Form2.ENick.Text + ' .''. !' + Chr(140) + ': забанил '
          + UserListView.Items[UserListView.ItemIndex].Caption + '. Причина: ' + Form6.EReason.Text + '.');
        end;
2.
Цитата:
Если i внутренний вы убрали, то циклы по-i в BanYes и UnbanYes по прежнему на месте ...это сбивает внешний цикл таймера по-i, в результате может быть что-угодно. Рекомендую в каждой процедуре создавать свою переменную в var для счетчика, если циклы принадлежат только этой процедуре, ...особенно на отправку пакетов.
Такой вариант не катит. Ошибка List index out of bounds 4430863. Снова в ауте.
Код:
procedure TForm1.BanYes;
var
  i2, i3: Integer;
begin
...
      // Получим IP забаненого
      GetBannedIP := ServerSocket.Socket.Connections[i3 - 1].RemoteAddress;
      // Отошлём команду бана
      ServerSocket.Socket.Connections[i3 - 1].SendText('21');
...
      // Отправляем сообщение с сервера всем пользователям
      for i2 := 0 to ServerSocket.Socket.ActiveConnections - 1 do
        begin
          ServerSocket.Socket.Connections[i2].SendText('00' + '! .''. ' + Form2.ENick.Text + ' .''. !' + Chr(140) + ': забанил '
          + UserListView.Items[UserListView.ItemIndex].Caption + '. Причина: ' + Form6.EReason.Text + '.');
        end;
3. Когда пытаюсь узнать IP юзера
Код:
ServerSocket.Socket.Connections[i - 1].RemoteAddress;
, то показывается у любого игрока IP последнего кто зашёл в чат, при условии, что i используется общий.

Последний раз редактировалось Shouldercannon; 16.06.2010 в 20:16.
Shouldercannon вне форума Ответить с цитированием
Старый 16.06.2010, 20:17   #447
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Shouldercannon, зачем нужно менять все i на другие? ...я же пояснил где и как, а у вас снова:

Код:
procedure TForm1.BanYes;
var
  i2, i3: Integer: Integer;
begin
...
      // Получим IP забаненого
      GetBannedIP := ServerSocket.Socket.Connections[i3 - 1].RemoteAddress;
      // Отошлём команду бана
      ServerSocket.Socket.Connections[i3 - 1].SendText('21');
...
      // Отправляем сообщение с сервера всем пользователям
      for i2 := 0 to ServerSocket.Socket.ActiveConnections - 1 do
        begin
          ServerSocket.Socket.Connections[i2].SendText('00' + '! .''. ' + Form2.ENick.Text + ' .''. !' + Chr(140) + ': забанил '
          + UserListView.Items[UserListView.ItemIndex].Caption + '. Причина: ' + Form6.EReason.Text + '.');
        end;
...что делает i3 в этом коде, можете объяснить? ...откуда идет заполнение? ...ниоткуда!!!
Замене подлежат переменные только циклов на отправку, ...популярно:

Код:
procedure TForm1.BanYes;
var
  i2: Integer;
begin
...
      // Получим IP забаненого
      GetBannedIP := ServerSocket.Socket.Connections[i - 1].RemoteAddress;
      // Отошлём команду бана
      ServerSocket.Socket.Connections[i - 1].SendText('21');
...
      // Отправляем сообщение с сервера всем пользователям
      for i2 := 0 to ServerSocket.Socket.ActiveConnections - 1 do
        begin
          ServerSocket.Socket.Connections[i2].SendText('00' + '! .''. ' + Form2.ENick.Text + ' .''. !' + Chr(140) + ': забанил '
          + UserListView.Items[UserListView.ItemIndex].Caption + '. Причина: ' + Form6.EReason.Text + '.');
        end;
...вот так - правильно! ...внимательно нужно подходить к коду, не просто так все менять, а потом говорить "не катит", типа, я дал неправильный совет и вариант.
Посмотрите внимательно на код и напишите почему так.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 16.06.2010 в 20:20.
Beermonza вне форума Ответить с цитированием
Старый 16.06.2010, 20:23   #448
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
3. Когда пытаюсь узнать IP юзера

Код:
ServerSocket.Socket.Connections[i - 1].RemoteAddress;
, то показывается у любого игрока IP последнего кто зашёл в чат, при условии, что i используется общий.
Ну, так нужно передавать индекс нужного канала в проверку.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 16.06.2010, 20:28   #449
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Тогда я вообще не понимаю, почему до отправки личного сообщения с сервера всё нормально работает, а потом рушится. Это я про бан/разбан и админку.

Рассуждаем. Для получения IP и отправки пакета мы используем общую переменную i типа Byte. Я решил посмотреть какие значения принимает i в этом месте
Код:
              // Создаем цикл поиска приватного пользователя
              for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
                begin
                  // Если пользователь найден
                  if UserMas[i + 1].Name = addressee then
                    begin
                      // Отсылаем сообщение в канал приватного пользователя
                      RVEMessage.SelectAll;
                      ServerSocket.Socket.Connections[i].SendText('01' + addressee + Chr(152) + '! .''. '
                      + Form2.ENick.Text + ' .''. !' + Chr(161) + ': ' + RVEMessage.GetSelText);
и увидел следующее: до создания цикла i = 1, после i = 0, далее после отправки второго приватного сообщения i = 0, после i = 0. Это тестировалось с одним юзером. С двумя следующая картина: до создания цикла i = 2, после i = 0, далее после отправки второго приватного сообщения i = 0, после i = 0. Но при этом снова проблемы с баном и разбаном. Дальше я сделал следующее: в процедурах бан/разбан и добавить/удалить админа в самом начале сделал запись
Код:
i := 1;
после чего ошибок не стало при бан/разбан и добавить/удалить админа. Не знаю правильный ли выход из данной ситуации.

Последний раз редактировалось Beermonza; 17.06.2010 в 00:17.
Shouldercannon вне форума Ответить с цитированием
Старый 17.06.2010, 00:32   #450
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Вы просто как бы "выпили таблетку от головной боли", но не нашли причину. Правильнее будет найти ошибку и устранить. Опишу основной таймер:

Код:
procedure TForm1.ServerTimerTimer(Sender: TObject);
begin
// условие на наличие установленных каналов
  If ServerSocket.Socket.ActiveConnections > 0 then
    Begin
// цикл по существующим каналам
      For i := 1 to ServerSocket.Socket.ActiveConnections do
        Begin

          // ни один цикл внутри этого не должен использовать внешнюю
          // переменную i, это системная переменная от нее зависит опрос каналов.
          // Любые рукописные процедуры должны использовать в циклах
          // собственные переменные, и если нужно брать внешнюю i для вычислений.

        end;
    end;

// разрешение выполнения процедуры обновления массива

// разрешение выполнения процедуры обновления списка

// восстанавливаем заголовок формы
end;
Если вы выбираете пользователя, то должны знать его индекс, ...несколько раз говорил про взятие со списка, или через поиск по массиву, ...только после этого отправлять бан кому-то, а не последнему i - 1 пользователю.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17