За последние 24 часа нас посетили 17383 программиста и 1725 роботов. Сейчас ищут 1604 программиста ...

Правильно ли я предохраняюсь? :)

Тема в разделе "PHP для новичков", создана пользователем SkyKiller, 31 окт 2008.

  1. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Register_Globals отключил.
    Код (Text):
    1. php_flag register_globals Off
    "Съехала" $DOCUMENT_ROOT. Поменял везде на $_SERVER['DOCUMENT_ROOT']. Работает.
    Что ещё посоветуете?
     
  2. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Приветствую всех ещё раз!
    Есть такой код:
    PHP:
    1.  
    2. <?php
    3. $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!");
    4. $row = mysql_fetch_array($reciperesult, MYSQL_ASSOC);
    5. ?>
    6.  
    Далее:
    PHP:
    1. <?php
    2. echo "<h1>".htmlspecialchars($row['recipeTitle'])."</h1>\n";
    3. echo "<p class=\"byline\"><small>Категория: <a href=\"/".$row['recipeParentCat']."/".$row['recipeCategory']."/\">".$row['recipeCategoryDesc']."</a></small></p>";
    4. 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');\">";
    5. 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";
    6. echo "</a>";
    7. ?>
    8.  
    То есть, в данном случае во втором фрагменте кода я оперирую данными, которые я получаю из базы ($row['recipeTitle'] и $row['recipeID']).
    Надо ли мне их обрабатывать функцией htmlspecialchars? Ведь при помещении этих значений в базу я их уже проверил. Да и злоумышленник к ним доступа получить не сможет. Просто если я ВЕСЬ вывод буду обрабатывать - у хостера сервак колом встанет и сайт тормозить будет.
    PHP:
    1. <a href=\"/".$row['recipeParentCat']."/".$row['recipeCategory']."/\">
    ссылка формируется со значениями из базы - здесь нужна обработка?
     
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нет.
     
  4. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Это уже радует... :)
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    И что ты этим ескейпом вредного отфильтруешь ?

    И что в них такого лежит ?
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    :) все провереные, ядовитых нет
     
  7. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    В них лежит название категории и подкатегории.
    Например:
    Код (Text):
    1. recipeParentCat = 'salad';
    2. recipeCategory = 'rice';
    Значит, ссылка примет вид:
    Код (Text):
    1. <a href=/salad/rice/">
    и выведет страницу со всеми рецептами салатов из риса :)
     
  8. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Я же не убийца :D
     
  9. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    SkyKiller
    Надо находить баланс. Например, htmlspecialchars используется для защиты от XSS. Её разумно использовать при выводе текста. Но нет смысла её использовать, например, в ссылках, т.к. ссылками управляет администратор. Если злоумышленник получит права доступа администратора, то это создаст куда большую угрозу, чем XSS :) Ну и т.п.
     
  10. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    То есть, достаточно этой функцией отфильтровать все данные из форм ввода - и всё?
     
  11. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вообще рекомендуется данные хранить в БД в оригинальном виде. Т.е. обрабатывать при записи функцией mysql_real_escape_string, а потом, на выводе, в зависимости от потребностей как надо обрабатывать. Например, пользователь регистрируется - обработать его регистрационные данные htmlspecialchars сразу, чтобы при выводе кучу полей не обрабатывать каждый раз, а если добавляется статья на сайт - обрабатывать её при выводе, т.к. если обработать при записи, потом сложно будет править (т.к. кавычки, угловые скобки и пр. заменятся на спецсимволы). Обрабатывать надо данные в зависимости от того, где они будут дальше использоваться.
     
  12. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Ок, спасибо. Наверное, перестану я греть голову по этому поводу.
    Всё равно у меня данные сначала в базу попадают и там модерируются (вручную).
    Осталось только пользовательский поиск обработать.
     
  13. dAllonE

    dAllonE Guest

    SkyKiller, погоняй потом готовый код во всяких сканерах.
    Например, Acunetix Web Vulnerability Scanner
    // мы не будем давать ссылки на кряки. Luge

    Ими многие начинающие "Хацкеры" пользуются, так что сразу число людей могущих взломать твой сайт немного снизится.
     
  14. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Спасибо большое и от меня :)
     
  15. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    О! Спасибо!
    У меня у хостера (.masterhost) есть тестирование системой xSpider, но он это тестирование запускает раз в полгода. А мне некогда ждать.
     
  16. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Хм... Странно.
    Просканировал Acunetix'ом свой сайтец - он не нашёл ни одной XSS-уязвимости. Не может такого быть!
    Я не настолько крут в PHP, чтобы вот так сразу, "автоматически" писать безопасный код.
    Подозрительно всё это...
     
  17. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    PHP:
    1. <?php
    2. $recipe  =  isset($_GET['recipe']) && is_numeric($_GET['recipe']) ? $_GET['recipe'] : 0;
    3. ?>
    Я обычно таким вариантом пользуюсь....
     
  18. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    как-то чем-то похожим под виндой баловался, на локальных сайтах. Выдало сообщение «Внимание! Уязвимость: используемая os — windows» :D
     
  19. dAllonE

    dAllonE Guest

    Luge пять балов :)

    Ну на самом деле они действительно помогают выявить явные ошибки.
     
  20. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Сканер нашёл SQL-инъекцию в конструкции вида:
    PHP:
    1. <?if ( isset($_GET['page']) $page=($_GET['page']-1); else $page=0;?>
    (она используется у меня при разбиении на страницы).
    Он присвоил переменной $_GET['page'] значение 0.01 (то есть, не целочисленное) :D
    Пришлось править:
    PHP:
    1. <? if ( isset($_GET['page']) && ctype_digit($_GET['page']) ) {
    2. $page=(int)($_GET['page']-1);
    3. } else {
    4. $page=0;
    5. } ?>
    6.  
    На всякий случай, жёстко к (int) привёл.
     
  21. ...и ? От этого твой сайт оказался взломан?
     
  22. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Нет, не оказался. К счастью.
     
  23. Тогда какая же это уязвимость?
     
  24. SkyKiller

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

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    А что - это станет уязвимостью только тогда, когда сайт уже взломают? А до этих пор - это не уязвимость?
    Acunetix выдал мне на этот кусок кода красный Critical Alert, за что я ему благодарен, ибо произошло это до запуска сайта.
     
  25. SkyKiller, обьясни, как взломать твой сайт передав неправильное значение в переменную $page, ккоторая используется для постраничной навигации?