За последние 24 часа нас посетили 19816 программистов и 1605 роботов. Сейчас ищут 885 программистов ...

Дубль 2 защита от sql иньекции для пагинатора или для страницы с новостью.

Тема в разделе "PHP для новичков", создана пользователем Unga, 2 апр 2017.

  1. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Как я понимаю главный враг всех и вся это одинарная ковычка она разрывает запрос к бд, тут она не проходит, есть еще лазейки?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Слеш
     
  3. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Вот код посмотрите правильно сделал?
    PHP:
    1. <?php
    2. /*
    3. 1. Защита от sql иньекций.
    4. 2. Проверяем полученный запрос на число.
    5. 3. Если введено число то все ок проверяем на конкретное число.
    6. 4. Если что то введено но это не число,то выводим страшилку.
    7. 5. Если введено от 1 до 4000 то все хлрошо, если 0 то ошибка.
    8. */
    9. if (is_numeric($_GET['id'])) {
    10. // 4000 это максимальное кол-во постов новостей 0 минималка.
    11. if ($_GET['id'] <= 0 or $_GET['id'] > 4000) {
    12. echo "Извените но страницы с таким id не найдено.";
    13. }
    14. else {
    15. echo "Успешный GET запрос найдена страница:  http://php.ru/forum.php?id=".$_GET['id'];
    16. }
    17. }else {
    18.      if(isset($_GET['id'])){
    19.      echo "Вы были пойманы с поличным, при попытке sql иньекции ваш ip адрес добавлен в базу, он будет передан в отдел \"К\", отдел который занимаеться кибер приступлениями, вам светит нехилая статья за попытку sql атаки на сайт.";
    20.      }
    21. }
    22. ?>
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @Unga
    через htmlspecialchars ещё пропусти, для спокойствия
     
    [vs] нравится это.
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @Unga проверками на каждый случай не напасешься. Просто эскейпь все данные и пихай в запрос, а там либо будет результат либо нет.
     
  6. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Ок спасибо)
     
  7. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Посмотрите вроде работает как надо на сайте себе поставил:
    PHP:
    1. $get_page_id = $_GET['page'];
    2. $page = htmlspecialchars("$get_page_id", ENT_QUOTES);
    3. if (is_numeric($page)) {
    4.  
    5. if ($page <= 0 or $page > $num_pages) {
    6.     echo "Извените но страницы с таким id не найдено.";
    7. }
    8. else {
    9.     $page = $num_pages;
    10. }
    11. }else {
    12.      if(isset($_GET['page'])){
    13.      echo "Вы были пойманы с поличным, при попытке sql иньекции ваш ip адрес добавлен в базу, он будет передан в отдел \"К\", отдел который занимаеться кибер приступлениями, вам светит нехилая статья за попытку sql атаки на сайт.";
    14.      }
    15.      else{
    16.          $page = 1;
    17.      }
    18. }
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    Я начну листать страницу и меня забракуют и отправят в катаргу? если 1 < $_GET['page']

    PHP:
    1. <?php
    2.  
    3. class Page
    4. {
    5.    public static $PG, $MX, $CP, $SUMPAGE, $SET;
    6.  
    7.    public static function Input( $MAX = 0, $PAGE = 15 )
    8.    {
    9.      self::$MX = $MAX;
    10.      self::$CP = $PAGE;
    11.     self::$PG = ( isset ( $_GET['pg'] ) && (int)$_GET['pg'] > 1 ? (int)$_GET['pg'] : 1 );
    12.      self::$SUMPAGE = ceil ( self::$MX / self::$CP );
    13.      self::$PG = ( self::$PG <= self::$SUMPAGE ? self::$PG : 1 );
    14.      self::$SET = ( self::$PG * self::$CP - self::$CP );
    15.    }
    16.    public static function Output( $CLASS = FALSE )
    17.    {
    18.      function __R( $NUM )
    19.      {
    20.        $_GET['pg'] = $NUM;
    21.      
    22.        return '/?' . http_build_query ( $_GET );
    23.      }
    24.    
    25.      if ( self::$SUMPAGE > 1 )
    26.      {
    27.        $PG = $FL = [];
    28.      
    29.      
    30.        # левые паги кнопки
    31.       if ( self::$PG - 4 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( 1 ) . '">1</a>';
    32.        if ( self::$PG - 5 > 0 ) $PG[] = '<a class = "PG_BUTTON">...</a>';
    33.        if ( self::$PG - 3 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG - 3 ) ) . '">' . ( self::$PG - 3 ) . '</a>';
    34.        if ( self::$PG - 2 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG - 2 ) ) . '">' . ( self::$PG - 2 ) . '</a>';
    35.        if ( self::$PG - 1 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG - 1 ) ) . '">' . ( self::$PG - 1 ) . '</a>';
    36.      
    37.      
    38.        if ( self::$PG == self::$SUMPAGE )
    39.        {
    40.          $PG[] = '<a class = "PG_BUTTON CR_BUTTON">' . self::$PG . '</a>';
    41.        }
    42.        elseif ( self::$PG == 1 )
    43.        {
    44.          $PG[] = '<a class = "PG_BUTTON CR_BUTTON">' . self::$PG . '</a>';
    45.        }
    46.        elseif ( self::$SUMPAGE != 1 )
    47.        {
    48.          $PG[] = '<a class = "PG_BUTTON CR_BUTTON">' . self::$PG . '</a>';
    49.        }
    50.      
    51.      
    52.        # правые паги кнопки
    53.       if ( self::$PG + 1 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG + 1 ) ) . '">' . ( self::$PG + 1 ) . '</a>';
    54.        if ( self::$PG + 2 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG + 2 ) ) . '">' . ( self::$PG + 2 ) . '</a>';
    55.        if ( self::$PG + 3 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG + 3 ) ) . '">' . ( self::$PG + 3 ) . '</a>';
    56.        if ( self::$PG + 5 <= self::$SUMPAGE ) $PG[] = '<a class = "PG_BUTTON">...</a>';
    57.        if ( self::$PG + 4 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( self::$SUMPAGE ) . '">' . self::$SUMPAGE . '</a>';
    58.      
    59.      
    60.        return '<div class="' . ( empty ( $CLASS ) ? 'PG_HEADER' : $CLASS ) . '"><div style="text-align:center;">' . implode ( '', $PG ) . '</div></div>';
    61.    
    62.      }
    63.      else
    64.      {
    65.        return FALSE;
    66.      }
    67.    
    68.    
    69.    }
    70. }
     
    #8 MouseZver, 2 апр 2017
    Последнее редактирование: 2 апр 2017
  9. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Почему? Если get пуст а он по умолчанию пуст тогда $page=1; Сообщение страшилка выходит если get отправлен, и он не являеться цифрой. Возьмите код и проверьте у меня на сайте все работает!
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    да, с условиями зрительно запутался
     
  11. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Вот щас работает:
    PHP:
    1. $get_page_id = $_GET['page'];
    2. $page = htmlspecialchars($get_page_id, ENT_QUOTES);
    3. if (is_numeric($page)) {
    4.  
    5. if ($page <= 0 or $page > $num_pages) {
    6.     echo "<div id=\"error\">Извените но страницы с таким id не найдено.</div>";
    7. }
    8. else {
    9.     $page = $get_page_id;
    10. }
    11. }else {
    12.      if(isset($_GET['page'])){
    13.      echo "<div id=\"error\">Вы были пойманы с поличным, при попытке SQL инъекции ваш ip адрес <b>".$_SERVER["REMOTE_ADDR"]."</b> был добавлен в базу, он будет передан в <b>МВД</b>, отдел который занимаеться кибер приступлениями, вам грозит <b>статья 272 УКРФ</b> за попытку взлома сайта.</div>";
    14.      }
    15.      else{
    16.          $page = 1;
    17.      }
    18. }
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    хочешь прикол?
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. твой код
     
    Unga нравится это.
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @Unga htmlspecialchars имеет смысл только в этом месте
    как защита от XSS, но у тебя этого уже нет.
     
    Unga нравится это.
  14. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    чего там?
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    Notice: Undefined index: page in C:\OpenServer\domains\new\index.php on line 3
     
    Unga нравится это.
  16. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Типо полный адрес хоста можно узнать?
    --- Добавлено ---
    Я уже напарился с этими проверками 3 дня сижу что неужели нет нормального метода что бы сайт не вскрыли?
     
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    просто много чего изучать надо, люди годами учатся, вот пару статей http://phpfaq.ru/tech/safety
     
    Unga нравится это.
  18. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    ок!)
     
  19. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    PHP:
    1. ( isset ( $_GET['pg'] ) && (int)$_GET['pg'] > 1 ? (int)$_GET['pg'] : 1 );
     
    Unga нравится это.
  20. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    Спасибо)
     
  21. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Вообще по хорошему если ТС хочет вникать в безопасность,то ему лучше всего почитать https://www.owasp.org/index.php/Main_Page
    Потом поставить себе multillidae https://sourceforge.net/projects/mutillidae/
    Затем Поставить Burp Suite https://portswigger.net/burp/
    И сидеть практиковаться,как только он поймет как взламывать,он поймет как защищать,по крайней мере я именно так осваивал безопасность и именно руководствуясь этими ссылками и софтом,который привел выше
     
    Unga нравится это.
  22. Unga

    Unga Новичок

    С нами с:
    25 мар 2017
    Сообщения:
    48
    Симпатии:
    2
    И вам спасибо на досуге ознакомлюсь!
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не надо никого ни на чём ловить. Надо просто, чтоб данные правильно подставлялись в запрос - всё. Аппостроф плох не только потому что через него sql-инъекция делается, а ещё потому что он может сломать запрос, хотя данные вполне нормальные, если к примеру не о числах идёт речь. Классический пример:
    PHP:
    1. mysqli_query($mysqli, "insert into `users` set `name`='$_POST[name]'");
    И теперь, не имея дурных намерений пользователь вводит имя д'Артаньян, и всё, вдруг возникает на пустом месте ошибка sql, а пользователь совсем не намеревался ломать наш сайт, он просто захотел ник д'Артаньян.

    Выход - экранирование или подготовленные запросы
    PHP:
    1. $smt = mysqli_prepare($mysqli, "insert into `users` set `name`=?");
    2. mysqli_stmt_bind_param($smt, "s", $_POST["name"]);
    Теперь если пользователь захочет зваться д'Артаньян, так его имя и будет записано. Если он захочет зваться
    Код (Text):
    1. '; drop table `users`
    - тоже ради бога, он нас этим не поломает, если у нас абсолютно всегда данные подставляются в sql через подготовленные запросы
    Это @denis01 пошутил так :) htmlspecialchars тут вообще не при чём :)
     
    Unga нравится это.
  24. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    $_POST[name] 2 ошибки
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В первый раз - подстановка в строку, там никаких кавычек у индекса быть не должно. Второй раз они нужны и есть.