Добрый день всем. Все данные перед занесением в базу данных я обратываю таким способом: Код (Text): $name=$mysqli->real_escape_string(htmlspecialchars(trim($_POST['name']))); А при выводе ничем не обрабываю, вывожу как есть. Я правильно делаю? Безопасно ли это? Идшники соответственно фильтрую так: Код (Text): $id = intval($_GET['id']);
нет. Разберитесь, что делает каждая используемая функция в частности, и подумайте, почему такое нагромождение не имеет смысла. Причем вижу уже не первый раз тут такое. По одной книжке все учитесь? это не фильтрация и не проверка на достоверность, интвалл сожрет любую строку и не подавится. И вы что-то не то запишете в нулевой ID. Или прочитаете из нулевого айди. Тем забавнее, что часто под номером 0 может стоять что-то самое самое первое.. Ну, например, админская учетная запись, угум? То есть от такой "защиты" пользы не много. Если айди левый, то что при записи, что при чтении база просто ругнется/вернет пустоту. И все. Чтобы защититься от взлома и понять, где дыры, надо знать, как делается взлом. Почитайте на эту тему, покурите мануалы. А потом попробуйте похакать сами себя. Сразу поймете, что и к чему и как работать должно для защиты. В противном случае - это все равно что учиться плавать на земле. Вроде двигаешься и дышишь как на к нижках и в видео, а вот поплывешь ли, когда попадешь в воду...
не нужно проверять, есть ли такой айди в базе. Это лишние телодвижения. База сама это делает. Если такого айди нет, то она просто-напросто вернет пустоту. Таким образом проверять надо ответ базы. Он будет либо с содержимым, либо без него.
Только у ненормальных могут быть записи с id==0. Добавлено спустя 16 минут 11 секунд: Этого явно недостаточно, вот как делают нормальные посоны: Код (Text): $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): $id = (int) $_POST['id'];
Ну хотябы написал "по моему мнению" или "я не вижу тут проблемы", а то прям сказал как отрезал. А ведь благодаря sql-инъекции можно, например, авторизоваться в роли админа или запостить сообщение туда, куда вродебы запрещено. Если это НЕ проблема, то да, можно не заморачиваться, главное не выводить текст ошибки Еще открой для себя blind sql injection -- есть такая "техника прощупывания" когда вывод ошибок подавлен.
Короче, склифасовский, я потому и отрезал что знаю, а вы мифами питаетесь и хорошо что хотя бы это знаете - что мифами питаетесь. Сделайте мне инъекцию: $link->query('select * from admin where user_name = ". $_GET . ";'); Жутко интересно заценить.