Как я понимаю главный враг всех и вся это одинарная ковычка она разрывает запрос к бд, тут она не проходит, есть еще лазейки?
Вот код посмотрите правильно сделал? PHP: <?php /* 1. Защита от sql иньекций. 2. Проверяем полученный запрос на число. 3. Если введено число то все ок проверяем на конкретное число. 4. Если что то введено но это не число,то выводим страшилку. 5. Если введено от 1 до 4000 то все хлрошо, если 0 то ошибка. */ if (is_numeric($_GET['id'])) { // 4000 это максимальное кол-во постов новостей 0 минималка. if ($_GET['id'] <= 0 or $_GET['id'] > 4000) { echo "Извените но страницы с таким id не найдено."; } else { echo "Успешный GET запрос найдена страница: http://php.ru/forum.php?id=".$_GET['id']; } }else { if(isset($_GET['id'])){ echo "Вы были пойманы с поличным, при попытке sql иньекции ваш ip адрес добавлен в базу, он будет передан в отдел \"К\", отдел который занимаеться кибер приступлениями, вам светит нехилая статья за попытку sql атаки на сайт."; } } ?>
@Unga проверками на каждый случай не напасешься. Просто эскейпь все данные и пихай в запрос, а там либо будет результат либо нет.
Посмотрите вроде работает как надо на сайте себе поставил: PHP: $get_page_id = $_GET['page']; $page = htmlspecialchars("$get_page_id", ENT_QUOTES); if (is_numeric($page)) { if ($page <= 0 or $page > $num_pages) { echo "Извените но страницы с таким id не найдено."; } else { $page = $num_pages; } }else { if(isset($_GET['page'])){ echo "Вы были пойманы с поличным, при попытке sql иньекции ваш ip адрес добавлен в базу, он будет передан в отдел \"К\", отдел который занимаеться кибер приступлениями, вам светит нехилая статья за попытку sql атаки на сайт."; } else{ $page = 1; } }
Я начну листать страницу и меня забракуют и отправят в катаргу? если 1 < $_GET['page'] PHP: <?php class Page { public static $PG, $MX, $CP, $SUMPAGE, $SET; public static function Input( $MAX = 0, $PAGE = 15 ) { self::$MX = $MAX; self::$CP = $PAGE; self::$PG = ( isset ( $_GET['pg'] ) && (int)$_GET['pg'] > 1 ? (int)$_GET['pg'] : 1 ); self::$SUMPAGE = ceil ( self::$MX / self::$CP ); self::$PG = ( self::$PG <= self::$SUMPAGE ? self::$PG : 1 ); self::$SET = ( self::$PG * self::$CP - self::$CP ); } public static function Output( $CLASS = FALSE ) { function __R( $NUM ) { $_GET['pg'] = $NUM; return '/?' . http_build_query ( $_GET ); } if ( self::$SUMPAGE > 1 ) { $PG = $FL = []; # левые паги кнопки if ( self::$PG - 4 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( 1 ) . '">1</a>'; if ( self::$PG - 5 > 0 ) $PG[] = '<a class = "PG_BUTTON">...</a>'; if ( self::$PG - 3 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG - 3 ) ) . '">' . ( self::$PG - 3 ) . '</a>'; if ( self::$PG - 2 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG - 2 ) ) . '">' . ( self::$PG - 2 ) . '</a>'; if ( self::$PG - 1 > 0 ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG - 1 ) ) . '">' . ( self::$PG - 1 ) . '</a>'; if ( self::$PG == self::$SUMPAGE ) { $PG[] = '<a class = "PG_BUTTON CR_BUTTON">' . self::$PG . '</a>'; } elseif ( self::$PG == 1 ) { $PG[] = '<a class = "PG_BUTTON CR_BUTTON">' . self::$PG . '</a>'; } elseif ( self::$SUMPAGE != 1 ) { $PG[] = '<a class = "PG_BUTTON CR_BUTTON">' . self::$PG . '</a>'; } # правые паги кнопки if ( self::$PG + 1 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG + 1 ) ) . '">' . ( self::$PG + 1 ) . '</a>'; if ( self::$PG + 2 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG + 2 ) ) . '">' . ( self::$PG + 2 ) . '</a>'; if ( self::$PG + 3 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( ( self::$PG + 3 ) ) . '">' . ( self::$PG + 3 ) . '</a>'; if ( self::$PG + 5 <= self::$SUMPAGE ) $PG[] = '<a class = "PG_BUTTON">...</a>'; if ( self::$PG + 4 <= self::$SUMPAGE ) $PG[] = '<a id = "RAY_AJAX" class = "PG_BUTTON" href = "' . __R( self::$SUMPAGE ) . '">' . self::$SUMPAGE . '</a>'; return '<div class="' . ( empty ( $CLASS ) ? 'PG_HEADER' : $CLASS ) . '"><div style="text-align:center;">' . implode ( '', $PG ) . '</div></div>'; } else { return FALSE; } } }
Почему? Если get пуст а он по умолчанию пуст тогда $page=1; Сообщение страшилка выходит если get отправлен, и он не являеться цифрой. Возьмите код и проверьте у меня на сайте все работает!
Вот щас работает: PHP: $get_page_id = $_GET['page']; $page = htmlspecialchars($get_page_id, ENT_QUOTES); if (is_numeric($page)) { if ($page <= 0 or $page > $num_pages) { echo "<div id=\"error\">Извените но страницы с таким id не найдено.</div>"; } else { $page = $get_page_id; } }else { if(isset($_GET['page'])){ echo "<div id=\"error\">Вы были пойманы с поличным, при попытке SQL инъекции ваш ip адрес <b>".$_SERVER["REMOTE_ADDR"]."</b> был добавлен в базу, он будет передан в <b>МВД</b>, отдел который занимаеться кибер приступлениями, вам грозит <b>статья 272 УКРФ</b> за попытку взлома сайта.</div>"; } else{ $page = 1; } }
Типо полный адрес хоста можно узнать? --- Добавлено --- Я уже напарился с этими проверками 3 дня сижу что неужели нет нормального метода что бы сайт не вскрыли?
Вообще по хорошему если ТС хочет вникать в безопасность,то ему лучше всего почитать https://www.owasp.org/index.php/Main_Page Потом поставить себе multillidae https://sourceforge.net/projects/mutillidae/ Затем Поставить Burp Suite https://portswigger.net/burp/ И сидеть практиковаться,как только он поймет как взламывать,он поймет как защищать,по крайней мере я именно так осваивал безопасность и именно руководствуясь этими ссылками и софтом,который привел выше
Не надо никого ни на чём ловить. Надо просто, чтоб данные правильно подставлялись в запрос - всё. Аппостроф плох не только потому что через него sql-инъекция делается, а ещё потому что он может сломать запрос, хотя данные вполне нормальные, если к примеру не о числах идёт речь. Классический пример: PHP: mysqli_query($mysqli, "insert into `users` set `name`='$_POST[name]'"); И теперь, не имея дурных намерений пользователь вводит имя д'Артаньян, и всё, вдруг возникает на пустом месте ошибка sql, а пользователь совсем не намеревался ломать наш сайт, он просто захотел ник д'Артаньян. Выход - экранирование или подготовленные запросы PHP: $smt = mysqli_prepare($mysqli, "insert into `users` set `name`=?"); mysqli_stmt_bind_param($smt, "s", $_POST["name"]); mysqli_stmt_execute($smt); Теперь если пользователь захочет зваться д'Артаньян, так его имя и будет записано. Если он захочет зваться Код (Text): '; drop table `users` - тоже ради бога, он нас этим не поломает, если у нас абсолютно всегда данные подставляются в sql через подготовленные запросы Это @denis01 пошутил так htmlspecialchars тут вообще не при чём
В первый раз - подстановка в строку, там никаких кавычек у индекса быть не должно. Второй раз они нужны и есть.