Дорогие отцы основатели ака Гуру... Такой вопрос на засыпку.. Многие ли из вас, давая советы по коду, сразу же помогают с безопасностью оного?.. Ну, например, есть вопрос сформировать php код для интерпретации его Mysql... При условии передачи данных через ГЕТ или ПОСТ давая этот код даете ли вы его с защитой от инъекций? Вот такой вопрос... собсна... ЗЫ: Желательно отвечать не односложно, а обосновывать. Заранее большое спасибо!
Бетонную стену под названием "непонимание основ безопасности" башкой не пробиваем. Башку жалко. Лично я в неё ем. Когда спрашивают, тогда и подсказываем.
Я просто не даю советов которые могут быть потенциально опасными, но в редких случаях когда такое присходит приписываю "подробности читать -ссылка-"
Да, к сожалению, большинство начинают работу с бд в первую неделю изучения пхп. Как правило они не знают о бд ничего, в том числе и возможные варианты взлома. ИМХО, разработчик всегда должен помнить о безопасности, пусть даже он начинающий и всегда должен искать инфу (особенно о mysql-инъекциях, о которых слышал даже ребенок).
и только отявленные извращенцы делают проекты на файлах, потом кое как нехотя строят что то типа txtSQL, и уже потом, тоже через лень, переползают на базы. А потом они получают в личное владение Оракл и ширину их пальцев даже рыбак не покажет %)))
antonn А я бы посоветовал новичку сделать первый мини-сайт на файлах, чтобы разобрать работу файловой системы. Ведь в будущем может пригодиться.
Мини сайты я бы советовал всем делать на файлах, стрелять из базуки по комарам это то ещё удовольствие. Большая проблема инъекций это их сложное название. Сами по себе они элементарны, но множество статей о них не раскрывают всю их простоту. Больше всего бесит когда люди говорят что "надо фильтровать данные приходящие от пользователя" это огромное заблуждение и самое обидное что в него рано или поздно начинают верить даже те кто не первый день программируют. Данные сами по себе не могут быть опасными !!! Вот я например пишу Код (Text): 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: HACKED BY VLADSON Сам текст должен остаться без изменений. Т.е мы отправляем неизменённые данные [в запрос|на страничку|на мыло|и.т.д.] приводя в нужный формат, а не фильтруем их !!! По этой-же причине считаю что ФИШКИ типа PHP: <?php $page = (int)$_GET['page']; ?> просто недопустимы (и именно по этому я не люблю включённые "волшебные кавычки") Вот нашёл гениальную цитату Только слово "фильтровать" я не считаю что подходит, скорее "конвертировать" (слово "фильтровать" скорее применимо к "волшебным кавычкам" так как там именно фильтруется лишнее чтоб получить исходные данные) В остальном просто считаю что фраза гениальная и должна стоять во всех FAQ-ах по программированию.
Ближе к смыслу в какой-то мере, а вот "фильтровать" это совершенно мимо, фильтрация это немного другое.
Если у меня id заведомо число, я конвертирую. И никаких проблем не будет. Зачем ставить проверку, на которую будет потрачено больше ресурсов?
Извиняюсь за ошибки. Спал мало сегодня. А чем плох способ задания типа переменной? И почему он не применим в РНР?
dark-demon При чем тут это? Если у меня ID - это заведомо натуральное число и не может быть чем-то другим - зачем мне проводить какие-то проверки над ним?
- заведомо ли оно укладывается в приделы integer ? (т.е X < 2147483648) - и почему "нечисло" (если вдруг дядя хакер его туда сунул) должно приравниваться к числу ? ('55fheufnv' !== '55' не смотря что они '55fheufnv' == '55' но однако вы предлагаете их приравнивать)
Фильтрование бывает полезным для юзабильности. Типичный пример - заполнение полей номеров счетов. Счет обычно содержит не менее 18 цифр, что неудобно писать без разделителей. Можно дать пользователю возможность как угодно разделять цифры, а потом просто отфильтровать нужное. Собственно возвращаясь к вопросу Я обычно предлагаю то решение, которое первое прийдет в голову, иногда - наиболее простое и короткое. Типа если вопрос был - как сделать авторизацию через форму с помощью куки, я дам форму с логином/паролем/кнопкой отправки и скрипт типа PHP: <? if($_POST['user']=='petya'&&$_POST['password']=='megapass') { setcookie('auth',1); } if(!empty($_COOKIE['auth'])) { ?> .... <? } else { ?> [форма_входа] <? } ?> Этим достигнуты 2 цели: 1)Дан ответ на вопрос 2)Очень простым примером показан принцип работы авторизации. Благодоря подобным ответам те, у кого нет способностей к программированию, сами его бросают, а те, у кого есть, учатся самообучению.
А может все-таки надо? Ведь данные несут угрозу работе сайта не только своей сутью, но и своим количеством… Если, например, в базу будут полностью записываться заголовки, которые пришли от пользователя, а вредитель натыкает в заголовки сотни килобайт мусора и сделает кучу запросов к сайту, то база быстро «раздуется» и будет сильно притормаживать работу сайта, а может даже и ошибку переполнения выдаст или «съест» выделенное под сайт место…
*пошел за банхаммером* тем более, что фактов по подмене заголовков IP мне так и не привели... одни досужие домыслы.
Горбунов Олег речь не шла о подмене какого то заголовка для ИП. Ту фразу совершенно просто можно было понять как "чтобы получить что то на конкретный ИП нужно сначала запросить что то с того ИП".
Вот, показываю: PHP: <?php $headers="|".$_SERVER["REMOTE_ADDR"]."|".$_SERVER["REMOTE_PORT"]; foreach ($_SERVER as $key => $value) { if (!strncmp($key, 'HTTP_', 5)) { $headers=$headers."|".$key."=>".$value; #собираем все заголовки браузера } } include 'my_sql.php'; #записываем заголовки в БД ?> И что?