За последние 24 часа нас посетили 51969 программистов и 1772 робота. Сейчас ищут 872 программиста ...

Вырезание опасных символов

Тема в разделе "PHP для новичков", создана пользователем amen, 19 ноя 2009.

  1. amen

    amen Активный пользователь

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    Нужно организовать защиту от SQL инъекций в адресную строку. Я так понимаю нужно обрабатывать регулярным выражением переменные, передаваемые через ГЕТ, на основе которых из базы выводится содержимое.
    Какие символы нужно нужно удалять помимо
    Код (Text):
    1. '
    2. "
    3. \
    4. /
    5. %
    6. (
    7. )
    8. *
    ?

    И если ссылок много, придётся искать каждую и приставлять к ней рег.выражение или можно это как-то упростить?
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    mysql_real_escape_string
     
  3. ideea

    ideea Активный пользователь

    С нами с:
    3 окт 2009
    Сообщения:
    60
    Симпатии:
    0
    (int) $_GET['id'];
    mysql_real_escape_string
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    MySQLi: Prepared Statements
     
  5. amen

    amen Активный пользователь

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    Спасибо
     
  6. amen

    amen Активный пользователь

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    всё покажи
     
  8. amen

    amen Активный пользователь

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    ok

    comments.php

    PHP:
    1. <?php
    2. include "config.php";
    3. echo "<a href=index.php>На главную</a><br><hr color=maroon>";
    4.  
    5. if (isset($_GET['id']))
    6. $id = $_GET['id'];
    7. $quer = "SELECT  head,DATE_FORMAT(date,'%d-%m-%Y %H:%i') as date_reg, news
    8.         FROM newslent
    9.          WHERE id=$id";
    10. $rs = mysql_query($quer);
    11. $rw = mysql_fetch_array($rs);
    12.  
    13. ?>
    14. <table>
    15. <tr><?echo $rw['head']?></tr>
    16. <br>
    17. <tr><?echo $rw['date_reg']?></tr>
    18. <br>
    19. <tr><?echo nl2br($rw['news'])?></tr>
    20. <hr color=maroon><br>
    21. </table>
    22.  
    23.  
    24. <?
    25. //Запрашиваем общее кол-во КОММЕНТОВ
    26. $q = "SELECT COUNT(*) FROM comments
    27.      WHERE id_news=$id";
    28. $tot = mysql_query($q);
    29. $f = mysql_fetch_row($tot);
    30. $total_rows = $f[0];                     //Количество комментов
    31.  
    32. $num_pages = ceil($total_rows/$pnumber); //Количество страниц
    33.  
    34. $page = !empty($_GET['page']) ? intval($_GET['page']) : 1;
    35. if ($page<1) $page = 1;
    36. if ($page>$num_pages) $page = $num_pages;
    37.  
    38. //Запрашиваем сами КОММЕНТЫ
    39. $q = "SELECT id, id_news, DATE_FORMAT(date_com,'%d-%m-%Y %H:%i')as date_reg, name_com, comm, new
    40.      FROM comments
    41.      WHERE id_news=$id
    42.       ORDER BY id DESC
    43.       LIMIT ".($page - 1)*$pnumber.",".$pnumber."";
    44. $res=mysql_query($q);
    45.  
    46. //Выводим комментарии
    47. while (@$row = mysql_fetch_array($res))
    48. {
    49.  echo $row['name_com'];echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    50.  echo $row['date_reg'];
    51.  echo"<br>";
    52.  echo nl2br($row['comm']);
    53.  echo"<br><hr>";
    54. }
    55.  
    56. //ПОСТРАНИЧНАЯ НАВИГАЦИЯ
    57. if ($total_rows > $pnumber)
    58. {
    59.  for($i=1;$i<=$num_pages; $i++)
    60.  {
    61.   if ($i==$page) echo $i; else
    62.   echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'&id='.$id.'">&nbsp;&nbsp;'.$i."</a>\n";
    63.  }
    64. }
    65. ?>
    66. <script>
    67. function splash(f)
    68. {
    69.     if (f.name_com.value  =='')
    70.         {
    71.             alert ("Укажите ваше имя");
    72.             return false;
    73.         }
    74.  
    75.     if (f.comm.value  =='')
    76.         {
    77.             alert ("Заполните текст комментария!");
    78.             return false;
    79.         }
    80.        
    81.     if (f.comm.value.length < 5)
    82.         {
    83.             alert ("Сообщение слишком короткое");
    84.             return false;          
    85.         }
    86.     if (f.comm.value.length > 1000)
    87.         {
    88.             alert ("Сообщение слишком длинное");
    89.             return false;          
    90.         }  
    91.  
    92.     return true;
    93. }
    94. </script>
    95. <H2>Добавить комментарий:</H2>
    96. <table>
    97. <form name="myForm" method='POST' action="addcomment.php" onSubmit="return splash(this);">
    98.  <tr>
    99.   <td><input type="text" name="name_com"></td>
    100.  </tr>
    101.  <tr>
    102.   <td><textarea name="comm" cols=50 rows=10></textarea></td>
    103.  </tr>
    104.  <tr>
    105.   <td><input type="submit" value="Добавить"></td>
    106.   <td><input type="hidden" name="id" value="<?echo $id;?>"></td>
    107.   <input type="hidden" name="addaction" value="">
    108.  </tr>
    109. </form>
    110. </table>
    index.php

    PHP:
    1. <?php
    2.  //ссылка на комментарии
    3.  echo "<center><a href=comments.php?id=".$row['id'].">
    4.       Комментировать ($total_com_rows)
    5.       </a></center>";
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Текст ошибки нужно писать, чтобы мы сами не выясняли.




    $id чем ожидается? Числом. Когда приходит число, то запрос преобразовывается в WHERE id=2.
    Когда Вы добавляете кавычку, то приходит строка 5\'
    Строка в запросе воспринимается как переменная или оператор, но так как она содержит недопустимые символы, да и нет таких операторов, вылетает ошибка. Поэтому строки нужно брать в кавычки (когда ожидается строка).

    В данном случае два выхода:
    1. Приведение id к числу, посредством (int)$id или intval($id) (одно и то же).
    2. Проверка $id функцией is_numeric, которая вернет false, в случае, когда $Id - строка. Тогда можно выдать предупреждение пользователю.


    $_GET['id'] есть, у $id есть значение.
    $_GET['id'] нет, $id не существует. А дальше в коде идет к ней обращение, которое вызывает Notice.

    Название темы прикольное.
     
  10. amen

    amen Активный пользователь

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    Kreker, доходчиво, спасибо.
    А по названию - читал что символы нужно резать регуляркой - отсюда и название.
    Я так понял mysql_real_escape_string нужно использовать для значений, которые будут заноситься в БД - все опасные символы экранируются и как следствие SQL инъекции нам не страшны? И по ходу рег. выражения для обработки гет и пост переменных вообще не нужны.
     
  11. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Ей экранируются данные применяемые в запросе, и только для прохождения запроса. Будут они заноситься в базу или нет, и берутся они из post или get - не важно (в самой базе будет исходный текст).

    Для POST может и не нужны, а вот для GET было бы неплохо, но против другой штуки - XSS.
     
  12. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    ??
    В POST могут тоже ерунду прислать. И escaping, в первую очередь, не от XSS. Он ведь для экранирования.

    Не страшны. Ошибки могут генерировать не только SQL-инъекции. Как видно из Вашего примера, функция mysql_real... не помогла из-за неверного подхода.