За последние 24 часа нас посетили 19524 программиста и 1602 робота. Сейчас ищут 964 программиста ...

Вопрос по безопасности php

Тема в разделе "Прочие вопросы по PHP", создана пользователем Stokmam, 27 окт 2013.

  1. Stokmam

    Stokmam Новичок

    С нами с:
    27 окт 2013
    Сообщения:
    12
    Симпатии:
    0
    Добрый день всем. Все данные перед занесением в базу данных я обратываю таким способом:

    Код (Text):
    1. $name=$mysqli->real_escape_string(htmlspecialchars(trim($_POST['name'])));
    А при выводе ничем не обрабываю, вывожу как есть.
    Я правильно делаю? Безопасно ли это?

    Идшники соответственно фильтрую так:

    Код (Text):
    1. $id = intval($_GET['id']);
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    нет. Разберитесь, что делает каждая используемая функция в частности, и подумайте, почему такое нагромождение не имеет смысла. Причем вижу уже не первый раз тут такое. По одной книжке все учитесь? :)

    это не фильтрация и не проверка на достоверность, интвалл сожрет любую строку и не подавится. И вы что-то не то запишете в нулевой ID. Или прочитаете из нулевого айди. Тем забавнее, что часто под номером 0 может стоять что-то самое самое первое.. Ну, например, админская учетная запись, угум? :)

    То есть от такой "защиты" пользы не много. Если айди левый, то что при записи, что при чтении база просто ругнется/вернет пустоту. И все.

    Чтобы защититься от взлома и понять, где дыры, надо знать, как делается взлом. Почитайте на эту тему, покурите мануалы. А потом попробуйте похакать сами себя. Сразу поймете, что и к чему и как работать должно для защиты. В противном случае - это все равно что учиться плавать на земле. Вроде двигаешься и дышишь как на к нижках и в видео, а вот поплывешь ли, когда попадешь в воду...
     
  3. Stokmam

    Stokmam Новичок

    С нами с:
    27 окт 2013
    Сообщения:
    12
    Симпатии:
    0
    ну разумеется что при выводе я еще делаю проверку есть ли такой id в базе, если нет - выдаю ошибку..
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    не нужно проверять, есть ли такой айди в базе. Это лишние телодвижения. База сама это делает. Если такого айди нет, то она просто-напросто вернет пустоту.

    Таким образом проверять надо ответ базы. Он будет либо с содержимым, либо без него.
     
  5. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Только у ненормальных могут быть записи с id==0.

    Добавлено спустя 16 минут 11 секунд:
    Этого явно недостаточно, вот как делают нормальные посоны:

    Код (Text):
    1. $name=super_mega_ultra_clean(filter_var($mysqli->real_escape_string(html_entities(strip_tags(htmlspecialchars(trim($_POST['name'])))))));
    Так вот, никакого отношения к безопасности все это не имеет. real_escape_string() санирует строку во избежание недоразумений с СУБД. Которые, даже произойдя, ничего интересного зрителю не расскажут если у вас правильно организован под-отдел очистки (вывода ошибок). То есть понятно куда тут смещается вопрос безопасности?

    К ней относится типирование - ну вот этот ваш intval(). Типов всего 2 - строка и число. Строки санируются и заключаются в кавычки, числа санируются и не заключаются в кавычки.

    Добавлено спустя 16 минут 2 секунды:
    Вторая часть - вывод. Путем мучительных сомнений нормальные программисты пришли к выводу что вводить надо как есть, а выводить по обстоятельствам. Поэтому на вводе никакой фильтрации html'я не делается, он делается на выводе. Оценка обстоятельств производится по контексту, по правилам, по записям в бд, по личной симпатии или антипатии. Согласно оценке в аргументы функции типа strip_tags() добавляются те или иные теги. Разрешено этому юзеру, например админу запускать ява-скрипты сохраненные в бд - они запустятся. Не разрешено - их не будет в потоке.

    Кстати типируют методом преобразования типов

    Код (Text):
    1. $id = (int) $_POST['id'];
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Ну хотябы написал "по моему мнению" или "я не вижу тут проблемы", а то прям сказал как отрезал.

    А ведь благодаря sql-инъекции можно, например, авторизоваться в роли админа или запостить сообщение туда, куда вродебы запрещено. Если это НЕ проблема, то да, можно не заморачиваться, главное не выводить текст ошибки :)
    Еще открой для себя blind sql injection -- есть такая "техника прощупывания" когда вывод ошибок подавлен.
     
  7. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Короче, склифасовский, я потому и отрезал что знаю, а вы мифами питаетесь и хорошо что хотя бы это знаете - что мифами питаетесь.

    Сделайте мне инъекцию: $link->query('select * from admin where user_name = ". $_GET . ";');

    Жутко интересно заценить.
     
  8. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    :D
    А как именно? Расскажи.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Печально.