Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вопрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
IncOness
Отправлено: 17 Октября, 2015 - 17:12:34
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Дело обстоит так: на сайте если пользователь попытался обойти систему, он должен получить бан через JS код. Во всем этом деле я уже просто запутался, ибо не знаю как поступить.

Есть код:
CODE (javascript):
скопировать код в буфер обмена
  1. var params = 'user=' + banUser +'&time=' + banTime + '&reason=' + banReason;
  2. var xhttp = new XMLHttpRequest();
  3. xhttp.open("POST", "ban.php", true);
  4. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  5. xhttp.send(params);

1. Почему-то он перестал работать после того, как вместе прямого кода типа:
CODE (javascript):
скопировать код в буфер обмена
  1. xhttp.send('user=user&time=time&reason=reason');

заменил на:
CODE (javascript):
скопировать код в буфер обмена
  1. var params = 'user=' + banUser +'&time=' + banTime + '&reason=' + banReason;
  2. xhttp.send(params);

Почему?
2. Может ли реально пользователь подделать подобный запрос, например чтобы ограничиться 1 часом бана и т.д. вместо года/месяца?

Спасибо.
 
 Top
Viper
Отправлено: 17 Октября, 2015 - 17:32:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




IncOness пишет:
заменил на:
в чём профит от введения ещё одной переменной кроме гемороя?

IncOness пишет:
Может ли реально пользователь подделать подобный запрос, например чтобы ограничиться 1 часом бана и т.д. вместо года/месяца?

может. Никогда не доверяйте тому, что получаете с клиентской части. Всегда дублируйте проверку на стороне сервера.

PS! Ваш запрос можно банально подделать отправив левые данные минуя javascript.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
IncOness
Отправлено: 17 Октября, 2015 - 17:37:44
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Viper пишет:
может. Никогда не доверяйте тому, что получаете с клиентской части. Всегда дублируйте проверку на стороне сервера.

PS! Ваш запрос можно банально подделать отправив левые данные минуя javascript.

Как же тогда поступить, чтобы данные нельзя было подделать? Т.к. эти данные обязательно должны поступить через скрипт, поскольку проверить например время на серверной части я не могу, поскольку во всех скриптах оно разное. Как тогда быть?
 
 Top
Viper
Отправлено: 17 Октября, 2015 - 17:57:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




IncOness пишет:
Т.к. эти данные обязательно должны поступить через скрипт
неважно как они поступаю, важно как вы их обрабатываете. У вас время бана и данные юзера храниться должны в БД. Если забаненый заходит, то вы проверяете эти данные и отправляете ответ. А сам запрос может быть послан как напрямую, так и через ajax.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
IncOness
Отправлено: 17 Октября, 2015 - 18:01:53
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Viper пишет:
неважно как они поступаю, важно как вы их обрабатываете. У вас время бана и данные юзера храниться должны в БД. Если забаненый заходит, то вы проверяете эти данные и отправляете ответ. А сам запрос может быть послан как напрямую, так и через ajax.

Вы меня наверно не совсем поняли. Дело в том, что мне обязательно нужно, чтобы данные отправлялись на сервер через скрипт (клиентскую часть), который, как Вы сами сказали можно подделать. Мне необходимо передавать на сервер через скрипт 3 значения: логин пользователя, которого нужно забанить, время бана, которое указывается в скрипте и причина, которая также указывается скриптом. Я хочу найти решение, как поступить, чтобы пользователь не мог подделать данные и отправить этот скрипт на сервер. Сами посудите, я не могу проверить на серверной части, какой пользователь должен быть забанен, на какое время и по какой причине, поскольку на сайте таких скриптов несколько, и у каждого свое время и причина. А таким образом получится, что пользователь может подделать скрипт и таким образом отправить в бан невинного пользователя или отправить в бан себя, но например на 1 секунду. ПОнимаете о чем я?
CODE (javascript):
скопировать код в буфер обмена
  1. var banUser = <? echo $_SESSION['login']; ?>;
  2. var banTime = 86400 * 365;
  3. var banReason = 'Причина';
  4. var params = 'user=' + banUser +'&time=' + banTime + '&reason=' + banReason;
  5. var xhttp = new XMLHttpRequest();
  6. xhttp.open("POST", "ban.php", true);
  7. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  8. xhttp.send(params);

Вот получается мой скрипт, как мне уже сказали, этот код просто ужасен. Что Вы можете посоветовать, если можете конечно?

(Отредактировано автором: 17 Октября, 2015 - 18:03:24)

 
 Top
Viper
Отправлено: 17 Октября, 2015 - 18:30:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




IncOness пишет:
Вы меня наверно не совсем поняли.
я вас понял. Вы не совсем поняли как это сделать ;)
Время бана нужно хранить в БД. Тогда вы сможете сделать проверку истекло ли время бана или нет.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
IncOness
Отправлено: 17 Октября, 2015 - 18:37:57
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Viper пишет:
я вас понял. Вы не совсем поняли как это сделать ;)
Время бана нужно хранить в БД. Тогда вы сможете сделать проверку истекло ли время бана или нет.

Вернее это я неправильно пояснил Улыбка Скрипт, который я кинул, отправляет данные через POST запрос в файл ban.php, который в свою очередь обрабатывает присланные POST'ы и заносит данные в БД.
PHP:
скопировать код в буфер обмена
  1. include_once("include/include_db.php");
  2. if(isset($_POST["user"]) && isset($_POST["time"]) && isset($_POST["reason"]))
  3.     {
  4.         $user = $_POST["user"]; $time = $_POST["time"]; $reason = $_POST["reason"];
  5.         $date = time(); $unban = $date + $time;
  6.         if($insert = mysqli_query($connection, "INSERT INTO `banlist` (`login`, `moderator`, `date`, `unban`, `reason`) VALUES ('$user', 'System', '$date', '$unban', '$reason')"))
  7.         {
  8.                 mysql_close($connection);
  9.         }
  10.         else
  11.         {
  12.                 exit("Access denied");
  13.         }
  14. }
  15. else
  16. {
  17.         exit("Access denied");
  18. }

Вопрос тот же: ну как мне обезопасить данный скрипт, если это вообще возможно?
(Добавление)
Т.е. как видите, обработчик на сервере заносит присланные скриптом логин, время и причину, которые, как мы выяснили, можно подделать на клиенте. Например пользователь может подделать логин и забанить другого пользователя, а может забанить себя например всего-лишь на 1 секунду, мног овариантов. Как сделать подобный скрипт безопасным и работоспособным?

(Отредактировано автором: 17 Октября, 2015 - 18:40:19)

 
 Top
Viper
Отправлено: 17 Октября, 2015 - 19:03:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




IncOness расскажу "на пальцах".
Когда юзер банится в БД в талицу юзеров заносится время на сколько забанен, время последнего логина и флаг is_banned(это поле в бд) устанавливается в 1. Неважно какое время у клиента, важно какое время на сервере. Далее вы проверяете
PHP:
скопировать код в буфер обмена
  1. // $last_login_time - время последнего успешного логина в unix_timestamp
  2. // $ban_time - время бана в unix_timestamp
  3. // $current_time - текущее время на сервере в unix_timestamp
  4. // $unban_time - время разбана в unix_timestamp
  5. $unban_time = $last_login_time + $ban_time;
  6.  
  7. if ($is_banned == 1 && $unban_time < $current_time) {
  8.         // юзер вышел из бана
  9. }
  10. else
  11. {
  12.         header('HTTP/1.0 403 Forbidden');
  13.         header('Content-type: application/json');
  14.  
  15.         echo 'Вы забанены!';
  16. }

примерно так.

Этот код у вас в ban.php и вы его запрашиваете через ajax и выводите юзеру телегу.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
IncOness
Отправлено: 17 Октября, 2015 - 19:14:42
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Viper, не совсем понимаю для чего мне к примеру $last_login_time. Данные обработчиком заносятся в БД в таблицу banlist, а не в таблицу users. А при попытке входа сервер проверяет наличие такого логина в таблице banlist. Возможно Вы меня все-таки неправильно поняли, возможно я Вас, т.к. я Вам скинул 2 кода: один - JS (скрипт, отсылающие логин, время и причину на сервер), второй - PHP, который обрабатывает присланные данные. Вопрос был не в том, как мне забанить пользователя, т.к. эту систему я уже написал, а как обезопасить выполнение этого скрипта, т.е. защитить его от подделки логина или времени в частности. Т.е. мы с Вами говорили о том, что на клиенте можно подделать эти данные:
CODE (javascript):
скопировать код в буфер обмена
  1. var banUser = <? echo $_SESSION['login']; ?>;
  2. var banTime = 86400 * 365;
  3. var banReason = 'Причина';

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

Другими словами: должно быть к примеру так:
CODE (javascript):
скопировать код в буфер обмена
  1. var banUser = User;
  2. var banTime = 86400 * 365;
  3. var banReason = 'Причина';

но хакер подделывает переменные к примеру на:
CODE (javascript):
скопировать код в буфер обмена
  1. var banUser = Admin;
  2. var banTime = 86400 * 365;
  3. var banReason = 'Причина';

в итоге эти данные отправляются на сервер, но исходя из моего кода:
PHP:
скопировать код в буфер обмена
  1.     include_once("include/include_db.php");
  2.     if(isset($_POST["user"]) && isset($_POST["time"]) && isset($_POST["reason"]))
  3.         {
  4.             $user = $_POST["user"]; $time = $_POST["time"]; $reason = $_POST["reason"];
  5.             $date = time(); $unban = $date + $time;
  6.             if($insert = mysqli_query($connection, "INSERT INTO `banlist` (`login`, `moderator`, `date`, `unban`, `reason`) VALUES ('$user', 'System', '$date', '$unban', '$reason')"))
  7.             {
  8.                     mysql_close($connection);
  9.             }
  10.             else
  11.             {
  12.                     exit("Access denied");
  13.             }
  14.     }
  15.     else
  16.     {
  17.             exit("Access denied");
  18.     }

обработчик не может проверить настоящие ли пришли данные. Т.е. злоумышленник может вместо себя например отправить в бан админа. Я это имел в виду. Вот и не знаю что с этим делать, как защитить скрипт от поддельных данных.

(Отредактировано автором: 17 Октября, 2015 - 19:15:12)

 
 Top
Viper
Отправлено: 17 Октября, 2015 - 20:02:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




IncOness пишет:
например подделать логин, указав имя другого пользователя, или время бана, а затем отправить этот скрипт на сервер, который по моим соображениям никак не может обработать "подлинность" данных, которые пришли с клиента.
и? Опять тот же вопрос - зачем брать время с клиента?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
IncOness
Отправлено: 17 Октября, 2015 - 20:07:13
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Viper пишет:
и? Опять тот же вопрос - зачем брать время с клиента?

Потому что этот скрипт используется на разных страницах с разным временем. Например сутки/месяц/год и т.д.
CODE (javascript):
скопировать код в буфер обмена
  1. var banTime = 86400 * 365; // 1 год

Затем это время передается на сервер для обработки:
PHP:
скопировать код в буфер обмена
  1. $date = time(); // текущее серверное время
  2. $unban = $date + $time; // дата разбана ($date - текущее время, $time - время бана)

Т.е. имеется в виду срок бана, а не время бана. Понимаете?
 
 Top
andrewkard
Отправлено: 17 Октября, 2015 - 21:51:33
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




IncOness пишет:
Потому что этот скрипт используется на разных страницах с разным временем

разницы то нет, шлете на сервер - забанить на год, сервер пишет свое время + год,
проверка, если время сервера + год уже меньше текущего, разбанить Улыбка
 
 Top
IncOness
Отправлено: 17 Октября, 2015 - 22:35:01
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Ребята, по-моему мы уходим в сторону. Я и сам прекрасно знаю как задать время, внести данные в базу и т.д. Вопрос в том, как защитить подобный код от возможной подмены переменных. Например чтобы нельзя было подменить свой логин и отправить в бан другого пользователя, чтобы нельзя было подделать срок бана и т.д.
CODE (javascript):
скопировать код в буфер обмена
  1.     var banUser = <? echo $_SESSION['login']; ?>; // получение текущего логина пользователя для отправки в бан
  2.     var banTime = 86400 * 365; // срок бана (т.е. игрок будет разбанен через 1 год)
  3.     var banReason = 'Причина';
  4.     var params = 'user=' + banUser +'&time=' + banTime + '&reason=' + banReason;
  5.     var xhttp = new XMLHttpRequest();
  6.     xhttp.open("POST", "ban.php", true);
  7.     xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  8.     xhttp.send(params);

Ну вот кто может подсказать, как можно защитить этот код от подмены? По коду выше видно, что в бан должно отправить пользователя с логином, который указан в сессии "login" и именно на 1 год. Как избежать того, чтобы какой-нибудь хакер, возможно отправил в бан не себя или не уменьшил например срок бана?
 
 Top
lastdays
Отправлено: 18 Октября, 2015 - 01:47:07
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




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

Передать дополнительный параметр, аля
md5 ( $login . $time . $id) и смерить на сервере, да как угодно, так и делай.
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Октября, 2015 - 01:54:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




IncOness пишет:
Как же тогда поступить, чтобы данные нельзя было подделать?
Ответ: CSRF token.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB