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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Помогите разобраться!
Vanya777
Отправлено: 25 Января, 2014 - 16:45:30
Post Id


Новичок


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


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




Всем привет, только начал учить PHP и MySQLi. Вот есть код
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. defined('PROTECTOR') or die('Error: restricted access');
  3.  
  4. function InitVars() {
  5. }
  6.  
  7. # Метод конвентирует суперглобальные массивы $_POST, $_GET в перемнные
  8. # Например : $_GET['psw'] будет переобразовано в $psw с тем же значением
  9. function convertArray2Vars () {
  10.  
  11.         foreach($_GET as $_ind => $_val) {
  12.                 global $$_ind;
  13.                 if(is_array($$_ind)) $$_ind = mysqli_real_escape_string($_val);
  14.        
  15.                 }
  16.  
  17.         foreach($_POST as $_ind => $_val) {
  18.                 global $$_ind;
  19.                 if(is_array($$_ind)) $$_ind = mysqli_real_escape_string($_val);
  20.  
  21.         }
  22. }
  23.  
  24. # Метод проверяет $_GET и $_POST переменные на наличие опасных данных и SQL инъекций
  25. function checkVars() {
  26.         //Проверка опасных данных.
  27.                 foreach($_GET as $_ind => $_val) {
  28.                         $_GET[$_ind] = mysqli_real_escape_string($_val);
  29.  
  30.                         $exp = explode(" ",$_GET[$_ind]);
  31.                         foreach($exp as $ind => $val) {
  32.                                 if(in_array($val,$this->deny_words)) $this->antihack("Запрещено!Доступ закрыт!<br> Ваш ip адресс и браузер помечен! Админу отправлено сообщение!");
  33.                         }
  34.         }
  35.  
  36.         foreach($_POST as $_ind => $_val) {
  37.                         $_POST[$_ind] = mysqli_real_escape_string($_val);
  38.  
  39.                         $exp = explode(" ",$_POST[$_ind]);
  40.                         foreach($exp as $ind => $val) {
  41.                                 if(in_array($val,$this->deny_words)) $this->antihack("Запрещено!Доступ закрыт!<br> Ваш ip адресс и браузер помечен! Админу отправлено сообщение!");
  42.                         }
  43.         }
  44.  
  45. }
  46.  
  47. function antihack($msg) {
  48.     echo '<font color="red"><b>АНТИХАК: </b></font>'.$msg.'';
  49.  
  50. $brauser=mysqli_real_escape_string($_SERVER['HTTP_USER_AGENT']);
  51. $ip=mysqli_real_escape_string($_SERVER['REMOTE_ADDR']);
  52. mysqli_query("INSERT INTO `antihak` SET `ip` = '$ip', `brauser` = '$brauser'");
  53. mysqli_query("INSERT INTO `msg_r` SET `user_from` = 'antihak', `user_to` = 'Admin', `time` = '222', `read` = 1, `mail_msg` = 'Сайт пытались взломать! ип:$ip браузер: $brauser'");
  54.     die;
  55. }
  56. }
  57. ?>

Скажите, он правильно написан? И будет работать в полной мере, т.е. защищать от инъекций и вредный данных??
Если не правильно, напишите как сделать правильно. Только не надо кидать ссылку на литературу, там все так написано, что пока толком ничего не пойму, лучше напишите что вставить вместо чего и почему. Заранее спасибо)))
P.S. Мне просто легче когда объясняют люди, а не книжка со стандартными выражениями!


Отредактировано модератором: OrmaJever, 25 Января, 2014 - 17:05:14
 
 Top
green_man
Отправлено: 25 Января, 2014 - 17:20:40
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Июль 2012  


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




функцию правильную выбрал, но зачем все эскейпить?
Очищай то что базе отдаешь.

Vanya777 пишет:
Мне просто легче когда объясняют люди, а не книжка со стандартными выражениями!

А вот это плохо.
 
 Top
Vanya777
Отправлено: 25 Января, 2014 - 17:44:50
Post Id


Новичок


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


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




А можно поконкретнее? Что очистить надо и как это сделать! Просто насколько я понял этот скрипт проверяет все данные проходящие через базу и массив и если что то находит, отправляет админу письмо и заносит взломщика в таблицу!
 
 Top
Мелкий Супермодератор
Отправлено: 25 Января, 2014 - 18:10:41
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Вы знаете, что такое SQL-инъекция? И почему они вообще опасны?

Ваш нерабочий фрагмент кода - всё худшее, что было в PHP когда-либо, ещё с добавлением других глупостей. Тут и register_globals, и magic quotes, и глобальные переменные напропалую.


-----
PostgreSQL DBA
 
 Top
Vanya777
Отправлено: 25 Января, 2014 - 18:17:55
Post Id


Новичок


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


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




Код писал не я, я только учусь и пытаюсь разобраться! Чем инъекции опасны знаю! Подскажите, где именно и на что исправить. Пожалуйста!
 
 Top
green_man
Отправлено: 25 Января, 2014 - 18:31:15
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Июль 2012  


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




Гы ну все грузанулиУлыбка

Vanya777 пишет:
Что очистить надо и как это сделать!

Я вообще то ответил
green_man пишет:
функцию правильную выбрал

Я говорил про mysqli_real_escape_string

Что чистить?
green_man пишет:
Очищай то что базе отдаешь.


Так же еще прочитай что написал Мелкий.

Vanya777 пишет:
Подскажите, где именно и на что исправить.

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

(Отредактировано автором: 25 Января, 2014 - 18:32:07)

 
 Top
Vanya777
Отправлено: 25 Января, 2014 - 18:47:08
Post Id


Новичок


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


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




А можете сами написать и мне показать, а я тогда сравню и увижу в чем ошибки и что нужно вставлять в дальнейшем? Просто мне понятнее когда разбираю в скрипте, а в книгах часть написана и не поймешь что куда вставлять(( Пожалуйста, не проигнорируйте мое сообщение, никто не соглашается помогать, а мне очень надо!
 
 Top
green_man
Отправлено: 25 Января, 2014 - 18:53:53
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Июль 2012  


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




Ну ты и написал, у меня прям слеза навернулась Улыбка

Vanya777 пишет:
Просто мне понятнее когда разбираю в скрипте

Ну вот у тебя есть скрипт, разбирай мы сказали куда копать почитай в гугле.

Не я не занимаюсь обучением, тем более бесплатно Улыбка

(Отредактировано автором: 25 Января, 2014 - 18:54:23)

 
 Top
Мелкий Супермодератор
Отправлено: 25 Января, 2014 - 20:16:13
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Vanya777 пишет:
Чем инъекции опасны знаю!

Vanya777 пишет:
Что очистить надо

Я так и предположил, что вы понятий не имеете, что же такое sql-инъекция, только слышали где-то там, что это великий ужас и надо нагородить полмегабайта непонятного (а непонятный - гораздо хуже, чем плохой) кода, чтобы их не избежать.
Жаль, что у вас не хватило смелости в этом признаться самому.

СУБД получает запрос, строку текста. Никаких переменных какого-то там PHP она не видит. Ей вообще всё равно, кто там к ней подключился.
Если есть запрос на приложении: (на деньгах все понимают лучше, потому списывается 1000р.)
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE users SET balance=balance-1000 WHERE username="$uid"

Как БД должна различить следующие запросы после подстановки значений:
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE users SET balance=balance-1000 WHERE username="melkij"

CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE users SET balance=balance-1000 WHERE username="melkijfooo" OR username="Vanya777" /*с кого деньги спишутся?*/

Но если запрос будет выглядеть так:
CODE (SQL):
скопировать код в буфер обмена
  1. UPDATE users SET balance=balance-1000 WHERE username="melkijfooo\" or username=\"Vanya777"

То запрос просто не затронет ни одной строки. Тоже неверно, но это гораздо лучше, чем что-то случилось, а мы понятий не имеем, что же.
А мы всего лишь оставили согласно синтаксису SQL подсказки, что является данными в запросе, а что - управляющими конструкциями.
Особое внимание на "согласно синтаксису". У того же HTML - синтаксис другой. Возьмите JSON - там свои синтаксические конструкции. Возьмите CSV - там свой синтаксис.
Потому какие-то неизвестные полмегабайта универсальной защиты не только бесполезны, но вредны и неудобны впоследствии.


-----
PostgreSQL DBA
 
 Top
green_man
Отправлено: 25 Января, 2014 - 20:32:30
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Июль 2012  


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




Че за объяснение... проще надо тут похоже человек неделю только как начал.

Sql injection - возможность выполнения сторонего sql кода. Такая возможность возникает из-за плохой фильтрации переменных.

Как защититься:
1. Если целочисленное значение подставляется то можно (int)$param. Если $param не число то приведение типа вернет 0.
2. mysqli_real_escape_string - экранировать строки и числа. Я предпочитаю pdo.

Очищать надо те данные которые отдаешь базе.

С тебя 5$ Улыбка
Теперь понятно?
 
 Top
Мелкий Супермодератор
Отправлено: 25 Января, 2014 - 20:41:01
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




green_man пишет:
проще надо

На мой взгляд проще понять, в чём заключается сама проблема. А не её следствия.

Как защититься - не подставлять в запрос переменные, которые вы не контролируете полностью. Вообще не подставлять. Использовать препарированные запросы.


-----
PostgreSQL DBA
 
 Top
green_man
Отправлено: 25 Января, 2014 - 20:43:36
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Июль 2012  


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




Да не в обиду написал, просто по опыту общения могу предположить что он хотел ответ который я дал.
Назовем это интуицией.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB