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

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

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

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

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

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

...продолжение

Смотрим тот же код, но более наглядный:

Код:
{Обработка забаненого удалённым администратором}
8: begin
       {Заполняем AdminNick, BannedUnbannedNick, AdminReason}
       a := Pos(Chr(156), text);
       AdminNick := Copy(text, 2, a - 2);
       text2 := Copy(text, a + 1, length(text));
       b := Pos(Chr(161), text2);
       BannedUnbannedNick := Copy(text2, 1, b - 1);
       AdminReason := Copy(text2, b + 1, length (text2));

       {Поиск IP по нику}
       for m := 0 to UserListView.Items.Count - 1 do
          if Pos(BannedUnbannedNick, UserListView.Items.Item[m].Caption) <> 0 then
            begin
               BanIP.Add(Copy(UserListView.Items.Item[m].SubItems.Text, 1, length(UserListView.Items.Item[m].SubItems.Text) - 2));
               ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections - 1].SendText('4');

               ...

               {Разошлем сообщение пользователям (кроме того, кто прислал)}
               for j := 0 to ServerSocket.Socket.ActiveConnections - 1 do
                 begin
                    if (j + 1) <> i then ServerSocket.Socket.Connections[j].SendText('0' + AdminNick + Chr(140) + ': забанил '
                                              + BannedUnbannedNick + '. Причина: ' + AdminReason + '.');
                 end;

            end;
   end;
Цикл по-m не имеет у вас визуального тела Begin..End, ориентироваться довольно сложно, что в него попадает, а что нет. Смотрим дальше. Условие:

Код:
if Pos(BannedUnbannedNick, UserListView.Items.Item[m].Caption) <> 0 then
...оно срабатывает чаще, чем хотелось бы, и пропускает каждый раз в каждом такте цикла по m, где выполняется это:

Код:
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections - 1].SendText('4');
...заблокировать ПОСЛЕДНЕГО пользователя. Картина: входит пользователь забаненый ранее по списку и следом не забаненый, ...первый шлет "8", ...второго в блок, хотя он не виновен ни в чем. Может ошибка?

Далее:

Код:
{Разошлем сообщение пользователям (кроме того, кто прислал)}
               for j := 0 to ServerSocket.Socket.ActiveConnections - 1 do
                 begin
                    if (j + 1) <> i then ServerSocket.Socket.Connections[j].SendText('0' + AdminNick + Chr(140) + ': забанил '
                                              + BannedUnbannedNick + '. Причина: ' + AdminReason + '.');
                 end;
...если условие if Pos(BannedUnbannedNick, UserListView.Items.Item[m].Caption) <> 0 then пропускает всех, то придут как раз слепленные пакеты, каждому по разу с этой рассылки и по числу записей в списке UserListView.Items.Count.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 03.06.2010 в 16:49.
Beermonza вне форума Ответить с цитированием
Старый 07.06.2010, 16:36   #412
indie
Новичок
Джуниор
 
Регистрация: 17.01.2009
Сообщений: 1
По умолчанию

Добрый день.
Добавил функцию запроса личных данных. Всё работает: отправка запроса, обработка на сервере, отправка ответа запросчику.
Тест: один сервер и 4 клиента.

Сервер запрашивает данные клиента, отсылается запрос клиенту. Клиент, приняв запрос, отправляет ответ серверу. У сервера появляется окно, в котором отображаются пришедшие данные клиента. По закрытию этого окна выходит ошибка list index out of bounds (5). На запрос у последнего клиента (у которого индекс 5) ошибка не выходит.

Так же ошибка происходит при запросе клиента у клиента, но более интересным способом. 4 клиента. Ошибка list index out of bounds (4!) у сервера пройдёт в таких случаях запросов клиентов:
1ый клиент =>Запрос у 3го и 4го клиентов.
2 => 4
3 => 1
4 => 1 и 2

Т.к. данные приходят и фатальных ошибок не возникает, у меня вопрос: можно ли скрыть сообщение об этих ошибках а-ля Errorcode:=0 ?
Если да, то в каком событии.
indie вне форума Ответить с цитированием
Старый 07.06.2010, 17:32   #413
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ошибки нужно не скрывать, их нужно смывать кро...., в смысле устранять.
Переводим на русский язык, то что нам в помощь сообщил Delphi
"list index out of bounds (5)" - индекс выходит за пределы списка (индекс 5). Вы пытаетесь обратиться к индексу списка, которого не существует. Например, список имеет Count равный 3, т.е. 3 записи, вы обращаетесь к 5-му, фактически это 6-й индекс, список нумеруется по индексам от 0, Count показывает фактическое количество записей: Count = 3, индексы - 0,1,2. Ищите ошибку в цикле перебора записей.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 07.06.2010, 19:10   #414
morfey
 
Регистрация: 18.05.2010
Сообщений: 7
По умолчанию

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

Применить шифрование пакетов недопущение отладки программ недопущение переполнения буфера

на сервере постоянно имеется поток который отслеживает возможные атаки атаками считаются все соединения которые не сменяют ник с ника по-умолчанию вот как то так а может вы предложите более легкий путь и надежней жду ответа
morfey вне форума Ответить с цитированием
Старый 07.06.2010, 19:25   #415
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
народ смайлы делайте через веб браузер самый лучший метод
ничего не лучший...просто он довольной простой.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.06.2010, 04:02   #416
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос

В посте #410 везде цикл
Код:
For i := 0 to 15 do
Это как пример?
Цитата:
Код:
if Pos(BannedUnbannedNick, UserListView.Items.Item[m].Caption) <> 0 then
...оно срабатывает чаще, чем хотелось бы, и пропускает каждый раз в каждом такте цикла по m, где выполняется это:
Код:
ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections - 1].SendText('4');
...заблокировать ПОСЛЕДНЕГО пользователя. Картина: входит пользователь забаненый ранее по списку и следом не забаненый, ...первый шлет "8", ...второго в блок, хотя он не виновен ни в чем. Может ошибка?
Далее:
Код:
{Разошлем сообщение пользователям (кроме того, кто прислал)}
               for j := 0 to ServerSocket.Socket.ActiveConnections - 1 do
                 begin
                    if (j + 1) <> i then ServerSocket.Socket.Connections[j].SendText('0' + AdminNick + Chr(140) + ': забанил '
                                              + BannedUnbannedNick + '. Причина: ' + AdminReason + '.');
                 end;
...если условие
Код:
if Pos(BannedUnbannedNick, UserListView.Items.Item[m].Caption) <> 0 then
пропускает всех, то придут как раз слепленные пакеты, каждому по разу с этой рассылки и по числу записей в списке
Код:
UserListView.Items.Count.
Что делать, как быть?
И как правельно отослать юзеру команду бана, пользуясь удалённым администированием. Это явно бред
Код:
 ServerSocket.Socket.Connections[ServerSocket.Socket.ActiveConnections - 1].SendText('4');
RichView рулит в плане смайлов

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

morfey, вы бот что ли? ...не могу понять ваше последнее сообщение, ни предложений, ни запятых, ни вопросительных знаков, ...я не понимаю этот набор слов, где чего я должен ответить? ...или это мысли вслух?
Большая просьба, задайте вопрос по человечески, ...если вы экономите свое время таким способом, почему я должен тратить свое, чтобы разбирать что от меня хотят? ...замечание принимается? )

Shouldercannon, какое значение содержит переменная BannedUnbannedNick? ...в списке UserListView ники Caption все разные, или состоят из одинаковых + номер соединения?
Pos() возвращает позицию с которой начинается фрагмент, который ищется в строке.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.06.2010, 16:58   #418
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Shouldercannon, какое значение содержит переменная BannedUnbannedNick? ...в списке UserListView ники Caption все разные, или состоят из одинаковых + номер соединения?
Pos() возвращает позицию с которой начинается фрагмент, который ищется в строке.
В BannedUnbannedNick находится Caption (ник) пользователя, взятый из UserListView на клиенте.
Shouldercannon вне форума Ответить с цитированием
Старый 08.06.2010, 18:42   #419
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Вот ваш код на обработку бана пользователя удаленным администратором:
Код:
{Обработка забаненого удалённым администратором}
8: begin
       {Заполняем AdminNick, BannedUnbannedNick, AdminReason}
       a := Pos(Chr(156), text);
       AdminNick := Copy(text, 2, a - 2);
       text2 := Copy(text, a + 1, length(text));
       b := Pos(Chr(161), text2);
       BannedUnbannedNick := Copy(text2, 1, b - 1);
       AdminReason := Copy(text2, b + 1, length (text2));
text - это пришедший пакет. a - позиция символа разделения, AdminNick сохранит все символы, что после кода команды, длиной - 2 символа. Т.е. сервер доверяет клиенту, и определит имя "админа" из пакета, что "он" прислал. А если я Миша, а прислал пакет "я Женя, блокировать Колю" ? ...имя приславшего пакет, любой, уже хранится на сервере, оно там записано со времени идентификации при входе, обмануть сервер, благодаря этой записи, невозможно. Эта запись лежит в массиве UserMas[i].Name, поэтому, если переменная AdminNick потом используется в кодах, ее нужно заполнить так:
Код:
AdminNick := UserMas[i].Name
...или не использовать AdminNick совсем, а сразу писать вместо него UserMas[i].Name.

Идем дальше.
Код:
text2 := Copy(text, a + 1, length(text));
b := Pos(Chr(161), text2);
BannedUnbannedNick := Copy(text2, 1, b - 1);
AdminReason := Copy(text2, b + 1, length (text2));
text2 - копия хвоста пакета, после разделительного символа от первой части, но почему-то длина этого куска числится как длина полного пакета, без вычета первой части. b - хранит позицию второго разделения. BannedUnbannedNick будет хранить кусок имени того, кого нужно банить, ...в файле txt, приложенном ранее в качестве лога, можно видеть как после имени идет непонятный символ, это огрехи вырезки, как они влияют на условие я не знаю, поскольку не проверял, и не могу создать у себя те же условия теста.

Предложу иной метод создания пакета для удаленного админа. Думаем, ...имя любого пользователя на сервере уже есть, нам нужно знать код команды, код действия админа, и, собственно, провинившийся.
Что за код действия? ...ну, например, удаленный админ хочет послать предупреждение пользователю, оно кодируется например числом 1, ...может он хочет заблокировать пользователя, значит пусть код будет 2, ...может он хочет выпнуть пользователя из чата, пусть будет 3. Таким образом пакеты будут такие:

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

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

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

Система хороша, но будет сразу бан даваться без предупреждений. Снова запара с админкой, чтоб ей не ладно было. Может сделать отлов команды 82 и через case пустить, ведь кровь из носу админка должна автоматом присваиваться. Последовал вашему совету, AdminNick заменил на UserMas[i].Name. Также пофиксил цикл команды 8 и теперь при бане одного нет месива, который вы видели в прикреплённом мною файле.
Цитата:
в каждом пункте 1:, 2:, 3: будет свое действие с пользователем, имя которого вырезается как Copy(text,3,len-1) (len - переменная, хранящая длину пакета минус код команды, смотрите код таймера), и проверяется в цикле по массиву UserMas.
Тоесть ник хранящийся в BannedUnbannedNick нужно сравнить с UserMas и при совпадении отправть в канал совпавшего ника команду?
Вложения
Тип файла: txt Code.txt (4.5 Кб, 150 просмотров)

Последний раз редактировалось Shouldercannon; 08.06.2010 в 21:35.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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