За последние 24 часа нас посетили 17911 программистов и 1576 роботов. Сейчас ищут 844 программиста ...

Безопасность советов...

Тема в разделе "php.ru/forum/", создана пользователем EvelRus, 13 фев 2008.

  1. EvelRus

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

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    Дорогие отцы основатели ака Гуру... Такой вопрос на засыпку..

    Многие ли из вас, давая советы по коду, сразу же помогают с безопасностью оного?..
    Ну, например, есть вопрос сформировать php код для интерпретации его Mysql... При условии передачи данных через ГЕТ или ПОСТ
    давая этот код даете ли вы его с защитой от инъекций?

    Вот такой вопрос... собсна...
    ЗЫ: Желательно отвечать не односложно, а обосновывать.

    Заранее большое спасибо!
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    такие советы не даем.
     
  3. RomanBush

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

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Бетонную стену под названием "непонимание основ безопасности" башкой не пробиваем. Башку жалко. Лично я в неё ем.
    Когда спрашивают, тогда и подсказываем.
     
  4. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Правило хорошего тона - отвечать про то, что спрашивают!
    Если что то не ясно - спрашивай дальше!
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Я просто не даю советов которые могут быть потенциально опасными, но в редких случаях когда такое присходит приписываю "подробности читать -ссылка-"
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Да, к сожалению, большинство начинают работу с бд в первую неделю изучения пхп. Как правило они не знают о бд ничего, в том числе и возможные варианты взлома. ИМХО, разработчик всегда должен помнить о безопасности, пусть даже он начинающий и всегда должен искать инфу (особенно о mysql-инъекциях, о которых слышал даже ребенок).
     
  7. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    и только отявленные извращенцы делают проекты на файлах, потом кое как нехотя строят что то типа txtSQL, и уже потом, тоже через лень, переползают на базы. А потом они получают в личное владение Оракл и ширину их пальцев даже рыбак не покажет %)))
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    antonn
    А я бы посоветовал новичку сделать первый мини-сайт на файлах, чтобы разобрать работу файловой системы. Ведь в будущем может пригодиться.
     
  9. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Мини сайты я бы советовал всем делать на файлах, стрелять из базуки по комарам это то ещё удовольствие.

    Большая проблема инъекций это их сложное название. Сами по себе они элементарны, но множество статей о них не раскрывают всю их простоту.

    Больше всего бесит когда люди говорят что "надо фильтровать данные приходящие от пользователя" это огромное заблуждение и самое обидное что в него рано или поздно начинают верить даже те кто не первый день программируют.

    Данные сами по себе не могут быть опасными !!!
    Вот я например пишу
    Код (Text):
    1. format c:
    странно, но сервак php.ru почему-то работает, однако и в базе и на страничке эта строчка данные находятся в неизменённом виде. Есть над чем подумать.

    Фильтровать данные не надо, надо просто использовать их по назначению.

    Когда мы пишем запрос
    [sql]SELECT * FROM `table` WHERE `word`='какое-то слово';[/sql]
    то само какое-то слово не опасно.
    Опасно будет если мы оправим это "слово" в запрос !
    Надо отправлять не "это слово" а то что SQL сервер примет за это слово.
    Можно даже так (пример упрощённый, в реальности mysql_real_escape_string справляется с этим вполне)
    [sql]SELECT * FROM `table` WHERE `word`=0x4841434b454420425920564c4144534f4e;[/sql]

    Аналогично с XSS мы должны пихать в HTML-страничку не текст, а его представление в HTML формате, куда его предварительно надо конвертировать.
    Даже так (опять сугубо для прикола, на самом деле htmlspecialchars выглядит "логичнее")
    HTML:
    1. HACKED BY VLADSON
    Сам текст должен остаться без изменений.

    Т.е мы отправляем неизменённые данные [в запрос|на страничку|на мыло|и.т.д.] приводя в нужный формат, а не фильтруем их !!!

    По этой-же причине считаю что ФИШКИ типа
    PHP:
    1. <?php
    2. $page = (int)$_GET['page'];
    3. ?>
    просто недопустимы

    (и именно по этому я не люблю включённые "волшебные кавычки")

    Вот нашёл гениальную цитату
    Только слово "фильтровать" я не считаю что подходит, скорее "конвертировать" (слово "фильтровать" скорее применимо к "волшебным кавычкам" так как там именно фильтруется лишнее чтоб получить исходные данные)
    В остальном просто считаю что фраза гениальная и должна стоять во всех FAQ-ах по программированию.
     
  10. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Я всегда говорю - обрабатывать. =) но это скорее дело вкуса
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Ближе к смыслу в какой-то мере, а вот "фильтровать" это совершенно мимо, фильтрация это немного другое.
     
  12. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Если у меня id заведомо число, я конвертирую. И никаких проблем не будет. Зачем ставить проверку, на которую будет потрачено больше ресурсов?
     
  13. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Kreker, лишняя спичка спасёт отца русской демократии? если да, то почему ты юзаешь php?
     
  14. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Извиняюсь за ошибки. Спал мало сегодня.

    А чем плох способ задания типа переменной? И почему он не применим в РНР?
     
  15. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    dark-demon
    При чем тут это? Если у меня ID - это заведомо натуральное число и не может быть чем-то другим - зачем мне проводить какие-то проверки над ним?
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    - заведомо ли оно укладывается в приделы integer ? (т.е X < 2147483648)
    - и почему "нечисло" (если вдруг дядя хакер его туда сунул) должно приравниваться к числу ?
    ('55fheufnv' !== '55' не смотря что они '55fheufnv' == '55' но однако вы предлагаете их приравнивать)
     
  17. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Фильтрование бывает полезным для юзабильности. Типичный пример - заполнение полей номеров счетов. Счет обычно содержит не менее 18 цифр, что неудобно писать без разделителей. Можно дать пользователю возможность как угодно разделять цифры, а потом просто отфильтровать нужное.

    Собственно возвращаясь к вопросу
    Я обычно предлагаю то решение, которое первое прийдет в голову, иногда - наиболее простое и короткое.
    Типа если вопрос был - как сделать авторизацию через форму с помощью куки, я дам форму с логином/паролем/кнопкой отправки и скрипт типа
    PHP:
    1.  
    2. <?
    3. if($_POST['user']=='petya'&&$_POST['password']=='megapass')
    4. {
    5. setcookie('auth',1);
    6. }
    7. if(!empty($_COOKIE['auth']))
    8. {
    9. ?>
    10. ....
    11. <?
    12. }
    13. else
    14. {
    15. ?>
    16. [форма_входа]
    17. <?
    18. }
    19. ?>
    20.  
    Этим достигнуты 2 цели:
    1)Дан ответ на вопрос
    2)Очень простым примером показан принцип работы авторизации.
    Благодоря подобным ответам те, у кого нет способностей к программированию, сами его бросают, а те, у кого есть, учатся самообучению.
     
  18. Штаны

    Штаны Guest

    А может все-таки надо? :) Ведь данные несут угрозу работе сайта не только своей сутью, но и своим количеством… Если, например, в базу будут полностью записываться заголовки, которые пришли от пользователя, а вредитель натыкает в заголовки сотни килобайт мусора и сделает кучу запросов к сайту, то база быстро «раздуется» и будет сильно притормаживать работу сайта, а может даже и ошибку переполнения выдаст или «съест» выделенное под сайт место…
     
  19. Anonymous

    Anonymous Guest

    *пошел за банхаммером* тем более, что фактов по подмене заголовков IP мне так и не привели... одни досужие домыслы.
     
  20. Штаны

    Штаны Guest

    А куда мне эти факты приводить? Тема-то скоропостижно закрыта :)
     
  21. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Покажи мне скрипт который записывает в базу все заголовки (включая ненужные)
     
  22. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Горбунов Олег
    речь не шла о подмене какого то заголовка для ИП. Ту фразу совершенно просто можно было понять как "чтобы получить что то на конкретный ИП нужно сначала запросить что то с того ИП".
     
  23. Anonymous

    Anonymous Guest

    antonn, увтов в личной переписке настаивал именно на подмене получателя данных.
     
  24. Штаны

    Штаны Guest

    Вот, показываю:
    PHP:
    1.  
    2. <?php
    3. $headers="|".$_SERVER["REMOTE_ADDR"]."|".$_SERVER["REMOTE_PORT"];
    4. foreach ($_SERVER as $key => $value)
    5. {
    6. if (!strncmp($key, 'HTTP_', 5))
    7.     {
    8.     $headers=$headers."|".$key."=>".$value; #собираем все заголовки браузера
    9.     }
    10. }
    11. include 'my_sql.php'; #записываем заголовки в БД
    12. ?>
    13.  
    И что?
     
  25. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Штаны
    Я имею в виду не "гипотетический" а реальный (и область его применения)