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 » PHP » Программирование на PHP » Защита от инъекций

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

1. Eduard777 - 16 Января, 2011 - 08:10:28 - перейти к сообщению
Читал много статей и литературы по защите таблиц 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. ?>
2. Champion - 16 Января, 2011 - 08:56:12 - перейти к сообщению
Данный код абсолютно устойчив к 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-]+$/')){это точно не телефон}. Конечно, можно более точную регулярку написать.
Вот.
3. Eduard777 - 16 Января, 2011 - 11:19:22 - перейти к сообщению
То есть на сколько я понял после обработки строки htmlspecialchars, функцию if (ini_get("magic_quotes_gpc")) stripslashes, можно вообще не использовать.
4. Champion - 16 Января, 2011 - 12:17:48 - перейти к сообщению
Нет, этого я не написал. Это не так.
5. Eduard777 - 16 Января, 2011 - 12:37:28 - перейти к сообщению
А стоит ли использовать необязательный аргумент ENT_QUOTES в htmlspecialchars.
6. Champion - 16 Января, 2011 - 12:46:24 - перейти к сообщению
А для чего он - ты понимаешь?
7. Eduard777 - 16 Января, 2011 - 13:01:17 - перейти к сообщению
Из записи в учебники PHP

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

лично я понял, что это необходимо для конвертации, т.е. возврат в исходное состояние.
8. OrmaJever - 16 Января, 2011 - 13:41:32 - перейти к сообщению
Eduard777 пишет:
$family = trim(htmlspecialchars($_POST['family']));
$phone = trim(htmlspecialchars($_POST['phone']));

таким кодом в некоторых случаях можно испортить строки.
от иньекций поможет всево лишь одна функция mysql_escape_string() или mysql_real_escape_string()
9. JustUserR - 17 Января, 2011 - 15:38:03 - перейти к сообщению
Eduard777 Для осуществления формирования защиты SQL-запроса от возможного проведения инъекции необходимо производить нтерполяцию информационных полей в шаблон строковой константы SQL-запроса с соблюдением условия явного разграничения уровня вхождений соответствующих элементов - с учетом синтаксических особенностей языка SQL и реализация проверки кодовой таблицы представления передаваемых информационных полей - решение данной задачи заключает в предварительном использовании функции mysql_real_escape_string
10. ulot3049 - 03 Апреля, 2012 - 09:15:37 - перейти к сообщению
Самая стандартная и нормальная защита, это использование mysql_real_escape_string и sprint

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

http://lifeexample[dot]ru/php-primer[dot][dot][dot]ql-inektsiy[dot]html
11. EuGen - 03 Апреля, 2012 - 09:16:26 - перейти к сообщению
JustUserR пишет:

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

ulot3049 пишет:

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

С новым годом.

 

Powered by ExBB FM 1.0 RC1