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 :: Защита от SQL инъекций

 PHP.SU

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


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

> Без описания
xTODx
Отправлено: 13 Марта, 2015 - 20:55:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2013  
Откуда: Киев/Шостка


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




Всем доброго дня!
Прежде всего, скажу что уже почитал много по этому поводу, но проблема вылезла, я ничего не понял.
Сделал

PHP:
скопировать код в буфер обмена
  1.  
  2. function strips(&$el) {
  3.   if (is_array($el))
  4.     foreach($el as $k=>$v)
  5.       strips($el[$k]);
  6.   else $el = stripslashes($el);
  7. }
  8.   strips($_GET);
  9.   strips($_POST);
  10.   strips($_COOKIE);
  11.   strips($_REQUEST);
  12.   if (isset($_SERVER['PHP_AUTH_USER'])) strips($_SERVER['PHP_AUTH_USER']);
  13.   if (isset($_SERVER['PHP_AUTH_PW']))   strips($_SERVER['PHP_AUTH_PW']);
  14. }
  15.  
  16.  


в начале скрипта написал
- но оно выдало ошибку

(Отредактировано автором: 13 Марта, 2015 - 21:00:19)



-----
Был Ламером, пытался чему-то научится, спустя 2 года так и остался ламером.
 
My status
 Top
Ts.Saltan
Отправлено: 13 Марта, 2015 - 21:05:37
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


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




Зачем это всё? От инъекций спасут подготовленные выражения
https://php.net/manual/ru/mysqli.prepare.php
https://php.net/manual/ru/pdo.prepare.php
 
 Top
xTODx
Отправлено: 13 Марта, 2015 - 21:12:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2013  
Откуда: Киев/Шостка


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




Ts.Saltan пишет:
Зачем это всё? От инъекций спасут подготовленные выражения
https://php.net/manual/ru/mysqli.prepare.php
https://php.net/manual/ru/pdo.prepare.php

То есть нужно переделывать все запросы?
(Добавление)
Ts.Saltan пишет:
Зачем это всё? От инъекций спасут подготовленные выражения
https://php.net/manual/ru/mysqli.prepare.php
https://php.net/manual/ru/pdo.prepare.php

Можете показать пример?

Есть такой вот запрос, в нём переменная $id.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT * FROM `block` WHERE `col`='{$id}' ORDER BY `pos`
  3.  

(Отредактировано автором: 13 Марта, 2015 - 21:16:33)



-----
Был Ламером, пытался чему-то научится, спустя 2 года так и остался ламером.
 
My status
 Top
OrmaJever
Отправлено: 13 Марта, 2015 - 21:30:37
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Господи 2015 год на дворе, а тут ещё заводят темы про sql иньекции. prepared statement и всё, забыли навсегда! я не удивлюсь если вы ещё mysql_query пользуетесь


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
xTODx
Отправлено: 13 Марта, 2015 - 21:48:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2013  
Откуда: Киев/Шостка


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




OrmaJever пишет:
Господи 2015 год на дворе, а тут ещё заводят темы про sql иньекции. prepared statement и всё, забыли навсегда! я не удивлюсь если вы ещё mysql_query пользуетесь

её самою.
Тогда уж простите, скиньте ссылки на информацию, чтобы я стал на уровень выше в этом деле!
Я понял что sql_execute нужно использовать, и связанные переменные, так?
это решит все проблемы?

(Отредактировано автором: 13 Марта, 2015 - 21:53:00)



-----
Был Ламером, пытался чему-то научится, спустя 2 года так и остался ламером.
 
My status
 Top
exlant
Отправлено: 13 Марта, 2015 - 22:52:24
Post Id



Посетитель


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


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




библиотека mysql deprecated, в следующей версии php будет удалена! http://php.net/manual/ru/functio...ysql-connect.php

сейчас используют mysqli и pdo, гуглятся легко. и про подготовленные запросы тоже погуглите!

Инфы просто море на эти темы!
 
 Top
xTODx
Отправлено: 14 Марта, 2015 - 00:20:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2013  
Откуда: Киев/Шостка


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




exlant пишет:
библиотека mysql deprecated, в следующей версии php будет удалена! http://php.net/manual/ru/functio...ysql-connect.php

сейчас используют mysqli и pdo, гуглятся легко. и про подготовленные запросы тоже погуглите!

Инфы просто море на эти темы!

Спасибо, читаю!
http://phpclub[dot]ru/detail/article/mysqli
Вот такие вопросы,
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $mysqli = new mysqli('localhost', 'user', 'password', 'world');
  4.  
  5. /* Проверка соединения */
  6.     printf("Подключение невозможно: %s\n", mysqli_connect_error());
  7.     exit();
  8. }
  9.  
  10. $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
  11. $stmt->bind_param('sssd', $code, $language, $official, $percent);
  12.  
  13. $code = 'DEU';
  14. $language = 'Bavarian';
  15. $official = "F";
  16. $percent = 11.2;
  17.  
  18. /* выполнение подготовленного выражения  */
  19. $stmt->execute();
  20.  
  21. printf("%d Row inserted.\n", $stmt->affected_rows);
  22.  
  23. /* Закрытие соединения и выражения*/
  24. $stmt->close();
  25.  
  26. /* Очистить таблицу CountryLanguage */
  27. $mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
  28. printf("%d Row deleted.\n", $mysqli->affected_rows);
  29.  
  30. /* Закрыть подключение */
  31. $mysqli->close();
  32. ?>
  33.  

А если у меня несколько значений, и я заранее не знаю сколько у меня будет ?
в смысле мне нужно сделать функцию, в которую я буду передавать запрос, идентификаторы, и параметры.
как быть с
PHP:
скопировать код в буфер обмена
  1. stmt->bind_param('sssd', $param[1], $param[2])
?

Функция должна возвращать данные к тому-же.
Раньше, в, как оказалось древней, CMS была функция с запросом

PHP:
скопировать код в буфер обмена
  1. function ret_set(){    
  2.                 $sql = "SELECT * from `set`  LIMIT 0,1";
  3.                 $res = $this->sql($sql);
  4.                 return $res;
  5.         }

и функция которая формировала массив с полученных данных
PHP:
скопировать код в буфер обмена
  1.  
  2.        function print_set() {
  3.                         $res = $this->ret_set() ;
  4.                         $row = mysql_fetch_assoc($res) ;
  5.                         return $row ;
  6.                         }
  7.        
  8.         }
  9.  

(Отредактировано автором: 14 Марта, 2015 - 09:57:28)



-----
Был Ламером, пытался чему-то научится, спустя 2 года так и остался ламером.
 
My status
 Top
exlant
Отправлено: 14 Марта, 2015 - 01:03:54
Post Id



Посетитель


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


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




Цитата:
А если у меня несколько значений, и я заранее не знаю сколько у меня будет ?
в смысле мне нужно сделать функцию, в которую я буду передавать запрос, идентификаторы, и параметры.
как быть с

по вашей аналогии примерно так
PHP:
скопировать код в буфер обмена
  1.  
  2. function refValues($arr){ // без этого метода работает не на всех версиях!
  3.         if (strnatcmp(phpversion(),'5.3') >= 0) { //Если версия PHP >=5.3 (в младших версиях все проще)
  4.                 $refs = array();
  5.                 foreach($arr as $key => $value) {
  6.                         $refs[$key] = &$arr[$key]; //Массиву $refs присваиваются ссылки на значения массива $arr
  7.                 }
  8.                 return $refs; //Массиву $arr присваиваются значения массива $refs
  9.         }
  10.         return $arr; //Возвращается массив $arr
  11. }
  12.  
  13. function mysqli_request($array,$query){
  14.           if(!($stmt = self::$connect_db->prepare($query))){
  15.               trigger_error('Mysqli error: <b>'.self::$connect_db->error.'('.self::$connect_db->errno.')</b>!',E_USER_ERROR);
  16.         }    
  17.        
  18.         if(is_array($array)){
  19.           call_user_func_array(array($stmt,'bind_param'), $this->refValues($array));
  20.         }
  21.  
  22.         if(!$stmt->execute())
  23.             trigger_error('Not run execute: <b>'.$stmt->error.'('.$stmt->errno.')</b>!', E_USER_ERROR);
  24.        
  25.         $result = $stmt->get_result();
  26.  
  27.         $stmt->close();
  28.  
  29.         return $result;
  30. }
  31. function mysqli_get(){
  32.         $array = array('sssd', $param[1], $param[2]);
  33.         $query = 'some query';
  34.        
  35.         $result = $this->mysqli_request($array,$query)
  36.             while($row = $result->fetch_assoc()){
  37.                  $data[] = $row;
  38.              }
  39.  
  40. }
  41.  
  42.  


как то так, я думаю что направление понятно!
 
 Top
GoDr
Отправлено: 14 Марта, 2015 - 07:00:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




xTODx пишет:
А если у меня несколько значений, и я заранее не знаю сколько у меня будет ?
Что значит неизвестное? Ты не знаешь структуру таблицы БД?

И даже при таком подходе можно сформировать строку ключей с "вопросиками" и строку параметров


-----
Система управления веб-содержимым Lotos CMS
 
 Top
xTODx
Отправлено: 14 Марта, 2015 - 09:50:29
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2013  
Откуда: Киев/Шостка


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




GoDr пишет:
xTODx пишет:
А если у меня несколько значений, и я заранее не знаю сколько у меня будет ?
Что значит неизвестное? Ты не знаешь структуру таблицы БД?

И даже при таком подходе можно сформировать строку ключей с "вопросиками" и строку параметров

нет, я знаю стуктуру) но в эту функцию я буду передавать разные запросы!
(Добавление)
exlant пишет:

по вашей аналогии примерно так
как то так, я думаю что направление понятно!

Можете пояснить пожалуйста
PHP:
скопировать код в буфер обмена
  1.  
  2.  if(!($stmt = self::$connect_db->prepare($query))){
  3.               trigger_error('Mysqli error: <b>'.self::$connect_db->error.'('.self::$connect_db->errno.')</b>!',E_USER_ERROR);
  4.         }    
  5.  

Немного не понял, что значит self::$connect_db->prepare($query)
По идее нужно задать ещё и $connect_db?
PHP:
скопировать код в буфер обмена
  1. $connect_db = new mysqli('localhost', 'user', 'password', 'world');

Верно?
А &(ссылка на переменную) это указатель(как в с++) на ячейку памяти, нет?
в bind_param можно передать массив с помощью call_user_func_array, так?
т.е.
аналог вызова

Верно?
Спасибо вам огромное, понял что ещё есть много неизведанного, и что всё, что я писал, сделано плохо

(Отредактировано автором: 14 Марта, 2015 - 10:09:39)



-----
Был Ламером, пытался чему-то научится, спустя 2 года так и остался ламером.
 
My status
 Top
exlant
Отправлено: 14 Марта, 2015 - 10:22:01
Post Id



Посетитель


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


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




Цитата:
По идее нужно задать ещё и $connect_db?

Ну да.
self::$connect_db - статическая переменная в которой содержится объект подключения к базе

Цитата:
А &(ссылка на переменную) это указатель(как в с++) на ячейку памяти, нет?

да. только в php это не так реализовано, как в c++!

Цитата:
в bind_param можно передать массив с помощью call_user_func_array, так?

верно
 
 Top
xTODx
Отправлено: 14 Марта, 2015 - 10:50:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2013  
Откуда: Киев/Шостка


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




Написал я файл для подключения к базе



PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4.         require_once "config.php" ;
  5.         class Db extends Config {
  6.                 private $connection ;
  7.                 function __construct() {
  8.                         $this->open_connection() ; // сразу подключает к бд
  9.                 }
  10.                 private function open_connection() {
  11.                         $this->connection = new mysqli($this->DB_HOST, $this->DB_USER, $this->DB_PASS,$this->DB_NAME);
  12.                         if(!$this->connection) {
  13.                                 die("Ошибка в подключении к БД:". mysql_error() ) ;
  14.                         }
  15.                         }      
  16.                        
  17.                 function refValues($arr){ // без этого метода работает не на всех версиях!
  18.                         if (strnatcmp(phpversion(),'5.3') >= 0) { //Если версия PHP >=5.3 (в младших версиях все проще)
  19.                                         $refs = array();
  20.                                         foreach($arr as $key => $value) {
  21.                                                         $refs[$key] = &$arr[$key]; //Массиву $refs присваиваются ссылки на значения массива $arr
  22.                                         }
  23.                                         return $refs; //Массиву $arr присваиваются значения массива $refs
  24.                         }
  25.                         return $arr; //Возвращается массив $arr
  26.                 }      
  27.                
  28.                 public function sql($query,$array) {
  29.                         if(!($stmt = $this->connection->prepare($query))){
  30.                 trigger_error('Mysqli Ошибка: <b>'.$this->connection->error.'('.$this->connection->errno.')</b>!',E_USER_ERROR);
  31.                 }    
  32.                         if(is_array($array))
  33.                         call_user_func_array(array($stmt,'bind_param'), $this->refValues($array));
  34.                         if(!$stmt->execute())
  35.                         trigger_error('Not run execute: <b>'.$stmt->error.'('.$stmt->errno.')</b>!', E_USER_ERROR);
  36.                        
  37.                        
  38.                         $result = $stmt->get_result();
  39.  
  40.                 $stmt->close();
  41.  
  42.                         return $result ;
  43.                 }       //функция которая будет выполнять заявки.
  44.         }
  45.         $db = new Db() ;
  46.         /*$this-> использует переменные с другого класса, mysql_error() - ошибки бд,
  47.         команда установки кодировки  если не вышло, вывести ("текст")
  48.         mysql_query("set names utf8") or die ("set name utf8 failed") */
  49.        
  50. ?>
  51.  
  52.  

Вот, вроде разобрался, теперь начал переделывать запросы DB(работы мягко говоря валом).
Если мне не нужно передавать массив, а в запросе нету внешних данных, можно сделать так?
PHP:
скопировать код в буфер обмена
  1.  
  2. function ret_th(){     
  3.                 $sql = "SELECT `theme` from `set` LIMIT 0,1";
  4.                 $res = $this->sql($sql, 0);
  5.                 $row = mysql_fetch_assoc($res) ;
  6.                 return $row['theme'];
  7.                 }
  8.  

Дальше вот такая вот вещь вылазит
Цитата:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, object given in [Путь тут] on line 6

функция $sql вернула не то, что нужно
Вот что она возвращает
PHP:
скопировать код в буфер обмена
  1.  
  2. mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 1 [type] => 0 )
  3.  

Изменил на

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. function ret_th(){     
  4.                 $sql = "SELECT `theme` from `set` LIMIT 0,1";
  5.                 $res = $this->sql($sql, 0);
  6.                 $row = $res->fetch_assoc ;
  7.                 return $row['theme'];
  8.                 }
  9.  
  10.  

всё работает, спасибо, буду дальше копаться, если не затруднит, время-от времени пожалуйста заходите в тему, я нуждаюсь в вашей помощи!

(Отредактировано автором: 14 Марта, 2015 - 11:14:34)



-----
Был Ламером, пытался чему-то научится, спустя 2 года так и остался ламером.
 
My status
 Top
GoDr
Отправлено: 14 Марта, 2015 - 11:20:45
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




xTODx, не поленись и просто прочитай. Всё по-русски, кратко, доступно, с примерами.
Многие вопросы сами отпадут
http://php[dot]net/manual/ru/book[dot]pdo.php


-----
Система управления веб-содержимым Lotos CMS
 
 Top
xTODx
Отправлено: 14 Марта, 2015 - 11:27:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 282
Дата рег-ции: Янв. 2013  
Откуда: Киев/Шостка


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




Сейчас вопрос такой, если одна строка
то как быть с

PHP:
скопировать код в буфер обмена
  1.  
  2. while($row = $res->fetch_assoc()){
  3.                  $data[] = $row;
  4.              }
  5.  
  6.  

Так ведь?

Результат - пуст
fetch_array()??
так заработало, в чём отличие?

(Отредактировано автором: 14 Марта, 2015 - 11:30:05)



-----
Был Ламером, пытался чему-то научится, спустя 2 года так и остался ламером.
 
My status
 Top
exlant
Отправлено: 14 Марта, 2015 - 11:52:41
Post Id



Посетитель


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


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




Цитата:
Дальше вот такая вот вещь вылазит
Цитата:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, object given in [Путь тут] on line 6

а при чем здесь вообще mysql? забудьте про mysql!
mysql_error() - здесь тоже работать не будет!

между fetch_assoc и fetch_array, разница точно такая я же, как и была в mysql! assoc помещает в ассоциативный массив, array помещает в два массива: обычный массив, и в ассоциативный(или в тот, который который указан в ключах)! Я обычно использую fetch_assoc, поэтому его и указал.

а вообще [url]http://php.net/manual/ru/mysqli-....fetch-array.php [/url] там все есть
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB