За последние 24 часа нас посетили 18043 программиста и 1700 роботов. Сейчас ищут 1526 программистов ...

Защита приложений, написанных на PHP

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

  1. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    перед тем, как вызывать "mysql_real_escape_string" надо соединится с базой данных.
    real учитывает кодировку. возможно, это будет критически, точно не скажу.
    вместо нуля, во втором, логичнее использовать "" - пустую строку, или null. Но я не знаю, как у вас там организовано все.
    экранируя таким образом - парится не стоит - скл-инъекции не будет.
     
  2. El Loco

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

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    Да, Вы правы. В этом участке кода я еще не соединяюсь с БД.
    Тогда сделаю "", поскольку я в дальнейшем делаю проверку empty().
    Спасибо за советы. Узнал несколько интересных моментов.
     
  3. El Loco

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

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    у меня еще один вопрос вроде как по теме.
    в некоторых движках php-файлы сайта, включая файл подключения к бд (с паролем), поднимают выше корневого каталога, оставляя в корне index.php который инкудит основной скрипт - include('../engine.php').
    стоит ли использовать такой пример или достаточно поднять выше корня только файл с паролем к бд?
    много ли дает такая практика в плане безопасности?
     
  4. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    я вообще ВЕСЬ движок всегда поднимаю выше корня. Например:
    root
    - engine
    -- [engine files]
    - public_html
    -- files
    --- file1
    --- file2
    -- index.php
    Все запросы редиректю на index.php, там на роутер, а там уже работаю
    Если надо создать поддомен files.example.com, - его директорию тоже в папке паблик выкладываю.
    Но этот прием не есть закон, скорее личностные предпочтения.
     
  5. amen

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

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    Читал, что крайне не желательно использовать такую запись, инклудя файл
    PHP:
    1. include "../config.php";
    типа нельзя на уровень выше подниматься...
    Это правда?
     
  6. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Подниматься на уровень выше - можно.

    Почему "нежелательно", там не объяснялось?
     
  7. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    amen
    спутал наверно с
    include $_GET['file'];
     
  8. amen

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

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

    ... я чего-то недопонял, по ходу?
     
  9. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    убить автора
     
  10. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    amen
    Автор пишет глупость.

    Использование относительных путей - это правильно.

    Единственное что, внутри компонента все относительные пути лучше использовать относительно корня компонента.
    Потому что пути внутри компонента меняться не могут и не должны.
    А сам компонент при этом может ездить по файловой системе куда угодно.

    P.S. Самое разумное это

    include APP_PATH . '../config.php';

    Т.е. указание корня (как абсолютный путь) через переменную или константу.
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Что за хрен в начале этой странице? Удалите это :)

    Особенно количество опечаток говорит о грамотности автора сих строк. Хотя смысл запрета вполне ясен. Автор делал так, как написал Mr.M.I.T., а потом автор прочитал, что через это могут взломать. И единственным выходом он нашел такой запрет.
     
  12. amen

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

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    ... дайте разобраться...
    Во-первых - автор - Флёнов (книга - "РНР глазами хакера")
    Simpliest, а может быть автор имел ввиду работу с файлами, то о чём писАл Mr.M.I.T. несколькими постами выше? Работа с фалами и инклуд файла типа конфиг это ведь не одно и то же? И извиняюсь за дебильный вопрос - что такое компонент?

    Kreker, с грамотностью всё в порядке. Просто опечатки от спешки.
     
  13. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Что автор имел в виду, известно только автору. Тем более что книгу я не читал.
    Но отдельная конкретная фраза - неправильна.

    Пфф. Ну и вопросики у вас.

    Некий код выполняющий определенную законченную последовательность действий и обладающий некоторой самостоятельностью/независимостью от других частей проекта.

    Например, DBAL - может быть компонентом. Равно как и классы выдающие RSS-feed.
    В то же время, компонентом может быть и форум использующий DBAL и RSS.
     
  14. amen

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

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    Понял, например та же гостевая книга или новостная лента.
    Просто ещё не сталкивался с понятием компонента применительно к РНР.
     
  15. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    почитайте про php injection
     
  16. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а ещё про функцию basename()
     
  17. amen

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

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

    PHP:
    1. $page = !empty($_GET['page']) ? intval($_GET['page']) : 1;
    от
    PHP:
    1. if (isset($_GET['page'])) $page = intval($_GET['page']); else $page = 1;
    ?

    А как оформить эту запись

    PHP:
    1. if (isset($_GET['page'])) $page = intval($_GET['page']);
    2. elseif (isset($_POST['page'])) $page = intval($_POST['page']);
    3. else $page = 1;
    как первую в этом посте?
     
  18. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    1. ничем
    2. примерно так:
    Код (Text):
    1. $page = !empty($_GET['page']) ? intval($_GET['page']) : !empty($_POST['page']) ? intval($_POST['page']) : 1;
    3. а это уже отличается. Читаемостью.
     
  19. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?php
    2. if (isset($_REQUEST['page']))
    3. {
    4.      $page = (int)$_REQUEST['page'];
    5. }
    6. else
    7. {
    8.      $page = 1;
    9. }
     
  20. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Никогда не понимал всеобщей нелюбви к столь изящному и красивому тернарному оператову:
    PHP:
    1. <?php
    2. $page = isset($_REQUEST['page']) ? intval($_REQUEST['page']) : 1;
    3.  
    4. $page = isset( $_GET['page']) ? intval( $_GET['page']) :
    5.         isset($_POST['page']) ? intval($_POST['page']) : 1;
    потому, amen, отличается читабельностью. тернарный оператор — читабельнее в некоторых случаях.
     
  21. amen

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

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    Спасибо, как не зайду на форум, обязательно что-нибудь полезное узнаю))

    Почитал тему - переделал скрипт добавления комментария:

    PHP:
    1. <?php
    2. include "config.php";
    3. require "inc.php";
    4.  
    5. //П Р О В Е Р К А   У С Л О В И Й
    6. $action = $_POST['action'];
    7. if (!empty($action))
    8. {
    9.    if (empty($_POST['name_com']))
    10.    {
    11.     echo "Введите ваше имя";
    12.    }
    13.    if (empty($_POST['comm']))
    14.    {
    15.     echo "Введите текст комментария";
    16.    }
    17.    $comm = null;
    18.    if (isset ($_POST['comm']))
    19.    {
    20.       if (''!=trim($_POST['comm']))
    21.       {
    22.          $comm = mysql_real_escape_string($_POST['comm']);
    23.       }
    24.       $comm = substr($_POST["comm"],0,1000);
    25.    }
    26.  
    27. }
    28.  
    29.  
    30. //Функция обработки ВВ-тегов
    31. bbTagToTag($comm);
    32.  
    33. $name_com = htmlspecialchars($name_com);
    34. $query = "INSERT INTO comments (id_news, date_com, name_com, comm, new)
    35.          VALUES ('$id',now(), '$name_com', '$comm','new')";
    36.  
    37. if (mysql_query($query))
    38. {
    39.  header("Location: comments.php?id=$id");
    40. }
    41. else
    42.  {
    43.   echo "can't add to table<br>";
    44.   echo mysql_error();
    45.  }
    Вот ещё кусочек из функции обработки ВВ-тегов:
    PHP:
    1. <?php $message = htmlspecialchars($message);
    2.  {
    3.   $message = stripslashes($message);
    4.  }
    Оцените опытным взглядом.
     
  22. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Откуда id берется?
    И это число, поэтому его не обязательно брать в кавычки.
     
  23. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    И логично предположить, что в базе оно автоинкрементно, поэтому проще туда вообще ничего не писать.
     
  24. amen

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

    С нами с:
    18 сен 2009
    Сообщения:
    298
    Симпатии:
    0
    Адрес:
    Узбекистан
    Kreker, это id новости, которой принадлежит коммент. Я его передаю через скрытый инпут формы.

    Ну, судя по всему все проверки осуществил без косяков.

    Вот ещё что интересует - положим у меня в обработчике нет никаких проверок на существование переменных, полученных из формы и я не использовал никаких функций обработки строк, кроме htmlspecialchars.
    Какие возможности нагадить я тогда предоставляю "хакерам"?
     
  25. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    а, значит я ошибся.
    как обычно - уберешь mysql_real_escape_string() - можешь получить sql-инъекцию.
    собственно, name_com тоже стоит через mysql_real_escape_string() прогнать.