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]   

> Описание: Как сделать защиту лучше???
Eduard777
Отправлено: 16 Января, 2011 - 08:10:28
Post Id


Новичок


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


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




Читал много статей и литературы по защите таблиц MySQL. Пробовал сам делать инъекции защита выстояла, но хочу сказать сразу, у меня нет опыта в этой области.
У меня вот такой вопрос. Можно ли кодом приведенным ниже исключить SQL инъекции.
Если нет, то каким образом сделать защиту лучше. Заранее большое спасибо.


PHP:
скопировать код в буфер обмена
  1. <!-- Формы ввода forms.php -->
  2. <?PHP
  3. if(!empty($_POST))
  4.         {
  5.         include("forms2.php");
  6.         }
  7. ?>
  8.  
  9. <table width="950" align="center" border="0" cellpadding="5" cellspacing="0" >
  10. <form enctype='multipart/form-data' method="POST" >
  11.   <tr>
  12.     <td align="center" valign="middle" class="colorText" colspan="2">
  13.         <?PHP
  14.         if (!empty ($error))
  15.                 {
  16.                 print "<p class=colorWarning>$error</p>";
  17.                 }
  18.         ?>            
  19.         </td>
  20.   </tr>
  21.   <tr>
  22.         <td height="30" align="right" valign="middle" >
  23.         <span class="colorNameForm">Фамилия<font color="#FF0000">*</font></span>
  24.         </td>
  25.         <td height="30" align="left" valign="middle" >
  26.         <input size="35" type="text" class="colorEnterForm" name="family" maxlength="30" <?PHP echo "value=$family"; ?>>
  27.         </td>  
  28.   </tr>  
  29.   <tr>
  30.         <td height="30" align="right" valign="middle" >
  31.         <span class="colorNameForm">Телефон<font color="#FF0000">*</font></span>       
  32.         </td>
  33.         <td height="30" align="left" valign="middle" >
  34.         <input size="35" type="text" class="colorEnterForm" name="phone" maxlength="50" <?PHP echo "value='$phone'"; ?>>
  35.         </td>  
  36.   </tr>
  37. </form>
  38. </table>
  39.  
  40.  
  41.  
  42. <!-- Обработчик HTML-формы forms2.php -->
  43. <?PHP          
  44. $family = trim(htmlspecialchars($_POST['family']));    
  45. $phone = trim(htmlspecialchars($_POST['phone']));
  46.        
  47. //фамилия
  48. if (empty($family)){$error = "Пожалуйста введите вашу фамилию"; return;}                       
  49. if (!preg_match("|^[\w\-\. ]+$|i", $family)){$error = "Не верный формат фамилии"; return;}
  50.  
  51. //номер контактного телефона
  52. if (empty($phone)){$error = "Пожалуйста введите номер контактного телефона"; return;}
  53.  
  54. //соединения с MySQL сервером
  55. include("connect.php");
  56.  
  57. //директива magic_quotes_gpc
  58. if (ini_get("magic_quotes_gpc"))
  59.         {
  60.         $phone = stripcslashes($phone);
  61.         }
  62. //экранируем спецсимволы mysql_real_escape_string
  63. $phone = mysql_real_escape_string($phone);
  64.  
  65. //==============================
  66. //заносим данные в MySQL таблицу
  67. //==============================
  68.  
  69. //закрытие соединения с MySQL сервером         
  70.  
  71.         }
  72. ?>


Отредактировано модератором: Champion, 16 Января, 2011 - 08:42:58
 
 Top
Champion Супермодератор
Отправлено: 16 Января, 2011 - 08:56:12
Post Id



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


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


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




Данный код абсолютно устойчив к sql-инъекциям, потому что в нем нет sql запросов. Есть только подключение к БД и отключение.
Ладно, допустим, запрос появится.
* htmlspecialchars - это не способ защиты от sql инъекции. Это способ обезопашивания вывода в браузер тех данных, в которых не должно быть html сущностей. Ее конечно можно применять перед вставкой в базу, но не надо думать, что она защитит от инъекций. Инъекции - это не только кавычки.
* if (ini_get("magic_quotes_gpc")) stripslashes. Посте обработки строки htmlspecialchars кавычки превратятся в &quot; и stripslashes не будет убирать перед ними слеш. Если эта функция используется, то должна использоваться перед htmlentities.
* mysql_real_escape_string. Этой функции можно доверять. Но не стоит проверять этой функцией численные данные и данные, которые должны соответствовать шаблону (например, номер телефона), потому что это бессмысленно.
Численные данные можно обрабатывать с пом. $d = (double)$d, $i = intval($i) и т.д.
Данные, которые должны соответствовать шаблону можно проверять регулярками:
if (!preg_match('/^[+\d()\s-]+$/')){это точно не телефон}. Конечно, можно более точную регулярку написать.
Вот.
 
 Top
Eduard777
Отправлено: 16 Января, 2011 - 11:19:22
Post Id


Новичок


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


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




То есть на сколько я понял после обработки строки htmlspecialchars, функцию if (ini_get("magic_quotes_gpc")) stripslashes, можно вообще не использовать.
 
 Top
Champion Супермодератор
Отправлено: 16 Января, 2011 - 12:17:48
Post Id



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


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


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




Нет, этого я не написал. Это не так.
 
 Top
Eduard777
Отправлено: 16 Января, 2011 - 12:37:28
Post Id


Новичок


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


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




А стоит ли использовать необязательный аргумент ENT_QUOTES в htmlspecialchars.
 
 Top
Champion Супермодератор
Отправлено: 16 Января, 2011 - 12:46:24
Post Id



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


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


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




А для чего он - ты понимаешь?
 
 Top
Eduard777
Отправлено: 16 Января, 2011 - 13:01:17
Post Id


Новичок


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


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




Из записи в учебники PHP

Эта функция используется для предотвращения ввода вместе с пользовательским текстом разметки HTML, как в досках объявлений или в приложении guest book. Необязательный второй аргумент, quote_style, сообщает функции, что делать с символами одинарных и двойных кавычек. Режим по умолчанию, ENT_COMPAT, обратно совместим только для трансляции двойных кавычек и оставляет одинарные кавычки неоттранслированными. Если установлен ENT_QUOTES, и двойные, и одинарные кавычки транслируются, а если установлен ENT_NOQUOTES - ни одинарные. ни двойные кавычки не транслируются.

лично я понял, что это необходимо для конвертации, т.е. возврат в исходное состояние.
 
 Top
OrmaJever Модератор
Отправлено: 16 Января, 2011 - 13:41:32
Post Id



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


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


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




Eduard777 пишет:
$family = trim(htmlspecialchars($_POST['family']));
$phone = trim(htmlspecialchars($_POST['phone']));

таким кодом в некоторых случаях можно испортить строки.
от иньекций поможет всево лишь одна функция mysql_escape_string() или mysql_real_escape_string()


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
JustUserR
Отправлено: 17 Января, 2011 - 15:38:03
Post Id



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


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


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




Eduard777 Для осуществления формирования защиты SQL-запроса от возможного проведения инъекции необходимо производить нтерполяцию информационных полей в шаблон строковой константы SQL-запроса с соблюдением условия явного разграничения уровня вхождений соответствующих элементов - с учетом синтаксических особенностей языка SQL и реализация проверки кодовой таблицы представления передаваемых информационных полей - решение данной задачи заключает в предварительном использовании функции mysql_real_escape_string


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
ulot3049
Отправлено: 03 Апреля, 2012 - 09:15:37
Post Id


Новичок


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


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




Самая стандартная и нормальная защита, это использование mysql_real_escape_string и sprint

Так же всем интересующимся данной темой рекомендуй почитать, изложенный мной Ниндзя метод защиты от SQL инъекций:

http://lifeexample[dot]ru/php-primer[dot][dot][dot]ql-inektsiy[dot]html
 
 Top
EuGen Администратор
Отправлено: 03 Апреля, 2012 - 09:16:26
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




JustUserR пишет:

Отправлено: 17 Января, 2011 - 15:38:03

ulot3049 пишет:

Отправлено: 03 Апреля, 2012 - 09:15:37

С новым годом.
Тема закрыта!


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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB