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
Форумы портала PHP.SU :: Версия для печати :: Защита БД
Форумы портала PHP.SU » » Вопросы новичков » Защита БД

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

1. Vanya777 - 25 Января, 2014 - 16:45:30 - перейти к сообщению
Всем привет, только начал учить 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. Мне просто легче когда объясняют люди, а не книжка со стандартными выражениями!
2. green_man - 25 Января, 2014 - 17:20:40 - перейти к сообщению
функцию правильную выбрал, но зачем все эскейпить?
Очищай то что базе отдаешь.

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

А вот это плохо.
3. Vanya777 - 25 Января, 2014 - 17:44:50 - перейти к сообщению
А можно поконкретнее? Что очистить надо и как это сделать! Просто насколько я понял этот скрипт проверяет все данные проходящие через базу и массив и если что то находит, отправляет админу письмо и заносит взломщика в таблицу!
4. Мелкий - 25 Января, 2014 - 18:10:41 - перейти к сообщению
Вы знаете, что такое SQL-инъекция? И почему они вообще опасны?

Ваш нерабочий фрагмент кода - всё худшее, что было в PHP когда-либо, ещё с добавлением других глупостей. Тут и register_globals, и magic quotes, и глобальные переменные напропалую.
5. Vanya777 - 25 Января, 2014 - 18:17:55 - перейти к сообщению
Код писал не я, я только учусь и пытаюсь разобраться! Чем инъекции опасны знаю! Подскажите, где именно и на что исправить. Пожалуйста!
6. green_man - 25 Января, 2014 - 18:31:15 - перейти к сообщению
Гы ну все грузанулиУлыбка

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

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

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

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


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

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

Читай книги, тут кроме как написать все самому и показать тебе не получиться.
Есть конкретные вопросы задавай.
7. Vanya777 - 25 Января, 2014 - 18:47:08 - перейти к сообщению
А можете сами написать и мне показать, а я тогда сравню и увижу в чем ошибки и что нужно вставлять в дальнейшем? Просто мне понятнее когда разбираю в скрипте, а в книгах часть написана и не поймешь что куда вставлять(( Пожалуйста, не проигнорируйте мое сообщение, никто не соглашается помогать, а мне очень надо!
8. green_man - 25 Января, 2014 - 18:53:53 - перейти к сообщению
Ну ты и написал, у меня прям слеза навернулась Улыбка

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

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

Не я не занимаюсь обучением, тем более бесплатно Улыбка
9. Мелкий - 25 Января, 2014 - 20:16:13 - перейти к сообщению
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 - там свой синтаксис.
Потому какие-то неизвестные полмегабайта универсальной защиты не только бесполезны, но вредны и неудобны впоследствии.
10. green_man - 25 Января, 2014 - 20:32:30 - перейти к сообщению
Че за объяснение... проще надо тут похоже человек неделю только как начал.

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

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

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

С тебя 5$ Улыбка
Теперь понятно?
11. Мелкий - 25 Января, 2014 - 20:41:01 - перейти к сообщению
green_man пишет:
проще надо

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

Как защититься - не подставлять в запрос переменные, которые вы не контролируете полностью. Вообще не подставлять. Использовать препарированные запросы.
12. green_man - 25 Января, 2014 - 20:43:36 - перейти к сообщению
Да не в обиду написал, просто по опыту общения могу предположить что он хотел ответ который я дал.
Назовем это интуицией.

 

Powered by ExBB FM 1.0 RC1