Register_Globals отключил. Код (Text): php_flag register_globals Off "Съехала" $DOCUMENT_ROOT. Поменял везде на $_SERVER['DOCUMENT_ROOT']. Работает. Что ещё посоветуете?
Приветствую всех ещё раз! Есть такой код: PHP: <?php $reciperesult = mysql_query("SELECT * FROM `cooking_recipe` WHERE `recipeStatus`='SHOWN' AND `recipePic`='YES' LIMIT 1 OFFSET ".mysql_real_escape_string($cnt)."", $lnk) or die ("No such recipe!"); $row = mysql_fetch_array($reciperesult, MYSQL_ASSOC); ?> Далее: PHP: <?php echo "<h1>".htmlspecialchars($row['recipeTitle'])."</h1>\n"; echo "<p class=\"byline\"><small>Категория: <a href=\"/".$row['recipeParentCat']."/".$row['recipeCategory']."/\">".$row['recipeCategoryDesc']."</a></small></p>"; echo "<a href=\"#\" onclick=\"window.open('/photo.php?recipe=".(int)$row['recipeID']."', 'contacts', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,fullscreen=0,height=680,width=580');\">"; echo "<img src=\"".RECIPE_IMAGE_PATH."/".RECIPE_THUMBNAIL_PREFIX.(int)$row['recipeID'].".jpg\" alt=\"Кулинарные рецепты: ".htmlspecialchars($row['recipeTitle'], ENT_QUOTES)." - Увеличить\" class=\"left\" style=\"border: 1px solid #99C; padding: 2px 2px 2px 2px;\" />\n"; echo "</a>"; ?> То есть, в данном случае во втором фрагменте кода я оперирую данными, которые я получаю из базы ($row['recipeTitle'] и $row['recipeID']). Надо ли мне их обрабатывать функцией htmlspecialchars? Ведь при помещении этих значений в базу я их уже проверил. Да и злоумышленник к ним доступа получить не сможет. Просто если я ВЕСЬ вывод буду обрабатывать - у хостера сервак колом встанет и сайт тормозить будет. PHP: <a href=\"/".$row['recipeParentCat']."/".$row['recipeCategory']."/\"> ссылка формируется со значениями из базы - здесь нужна обработка?
В них лежит название категории и подкатегории. Например: Код (Text): recipeParentCat = 'salad'; recipeCategory = 'rice'; Значит, ссылка примет вид: Код (Text): <a href=/salad/rice/"> и выведет страницу со всеми рецептами салатов из риса
SkyKiller Надо находить баланс. Например, htmlspecialchars используется для защиты от XSS. Её разумно использовать при выводе текста. Но нет смысла её использовать, например, в ссылках, т.к. ссылками управляет администратор. Если злоумышленник получит права доступа администратора, то это создаст куда большую угрозу, чем XSS Ну и т.п.
Вообще рекомендуется данные хранить в БД в оригинальном виде. Т.е. обрабатывать при записи функцией mysql_real_escape_string, а потом, на выводе, в зависимости от потребностей как надо обрабатывать. Например, пользователь регистрируется - обработать его регистрационные данные htmlspecialchars сразу, чтобы при выводе кучу полей не обрабатывать каждый раз, а если добавляется статья на сайт - обрабатывать её при выводе, т.к. если обработать при записи, потом сложно будет править (т.к. кавычки, угловые скобки и пр. заменятся на спецсимволы). Обрабатывать надо данные в зависимости от того, где они будут дальше использоваться.
Ок, спасибо. Наверное, перестану я греть голову по этому поводу. Всё равно у меня данные сначала в базу попадают и там модерируются (вручную). Осталось только пользовательский поиск обработать.
SkyKiller, погоняй потом готовый код во всяких сканерах. Например, Acunetix Web Vulnerability Scanner // мы не будем давать ссылки на кряки. Luge Ими многие начинающие "Хацкеры" пользуются, так что сразу число людей могущих взломать твой сайт немного снизится.
О! Спасибо! У меня у хостера (.masterhost) есть тестирование системой xSpider, но он это тестирование запускает раз в полгода. А мне некогда ждать.
Хм... Странно. Просканировал Acunetix'ом свой сайтец - он не нашёл ни одной XSS-уязвимости. Не может такого быть! Я не настолько крут в PHP, чтобы вот так сразу, "автоматически" писать безопасный код. Подозрительно всё это...
PHP: <?php $recipe = isset($_GET['recipe']) && is_numeric($_GET['recipe']) ? $_GET['recipe'] : 0; ?> Я обычно таким вариантом пользуюсь....
как-то чем-то похожим под виндой баловался, на локальных сайтах. Выдало сообщение «Внимание! Уязвимость: используемая os — windows»
Сканер нашёл SQL-инъекцию в конструкции вида: PHP: <?if ( isset($_GET['page']) $page=($_GET['page']-1); else $page=0;?> (она используется у меня при разбиении на страницы). Он присвоил переменной $_GET['page'] значение 0.01 (то есть, не целочисленное) Пришлось править: PHP: <? if ( isset($_GET['page']) && ctype_digit($_GET['page']) ) { $page=(int)($_GET['page']-1); } else { $page=0; } ?> На всякий случай, жёстко к (int) привёл.
А что - это станет уязвимостью только тогда, когда сайт уже взломают? А до этих пор - это не уязвимость? Acunetix выдал мне на этот кусок кода красный Critical Alert, за что я ему благодарен, ибо произошло это до запуска сайта.
SkyKiller, обьясни, как взломать твой сайт передав неправильное значение в переменную $page, ккоторая используется для постраничной навигации?