• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Фильтрация ссылки

  • Автор темы slavon-x86
  • Дата начала
S

slavon-x86

<input name="link">

Из этого текстового поля ссылка сохраняется в MySQL, а затем показывается функцией echo '';

Как можно перед сохранением в MySQL отфильтровать ссылку, только наверняка, чтобы никто не смог взломать мой сайт !
 
H

Holger Dee Assuran

Что значит "отфильтровать, чтобы никто не мог взломать"?
Если имеется в виду блокировка специальных символов в строке перед вставкой в базу то нужно использовать
Код:
$string=addslashes($string);
Это вставит обратныне слеши перед каждым спец-символом в строке. Тогда при извлечении данных из базы нужно будет удалить эти слеши перед выводом пользователю
Код:
$string=stripslashes($string);
Еще будет полезной функция преобразования спец-символов в их HTML-коды
Код:
$string=htmlspecialchars($string);
Подробно почитать про нее можно на
 
S

slavon-x86

Holger Dee Assuran, "отфильтровать, чтобы никто не мог взломать" это значит мне нужно на 100% безопасно сохранить ссылку в БД, а затем показать пользователю ! Но при этом нельзя её искажать, т.к. она будет использоваться !

Есть текчтовое поле в форме <input name="link">
Данные с этоно поля сохраняются в БД (MySQL) !
Потом данные читаются из этой БД и показываются пользователю функцией: echo "";

Как безопасно можно это сделать ?

p.s. уже пол года немогу получить нормальный ответ ! Один пишет одно, а второй говорит что это небезопасно и пишет другое ! А первый с ним тоже спорит ! В итоге они друг на друга гонят и не приходят к единоме мнению !

p.s. можен нах. этот php и начать учить asp.net ?
 
H

Holger Dee Assuran

Значит я тебя правильно понял.
Вся заморочка здесь в том, что в URL-адрес (ссылку) могут входить символы управляющие запросами к базе и если их не заблокировать - база будет выдавать ошибки, а кто-нибудь злонамеренный может воспользоваться этим для доступа к данным и их модификации.
Для того, чтобы вставить в таблицу данные, обезопасившись от управляющих символов - нужно эти данные обработать функцией addslashes(). Она заблокирует все управляющие символы знаками обратного слеша.
Чтобы отобразить данные в первоначальном виде - их, после извлечения из базы, необходимо обработать функцией stripslashes(), вырезающей обратные слеши перед управляющими символами.

ЗЫ: Не знаю как asp.net, а РНР-очень удобный и гибкий язык. Его только понять надо. Купи себе книжку, только не что-то вроде "РНР за 5 минут", а нормальную - почитай, разберись и пиши.
 
P

Pasha

Для: slavon-x86
Учи asp.net, в нем точно известно, что безопасно, а что нет :) По крайней мере параметры в SQL в нем принято передавать именно как параметры, а не как часть строки запроса, без заморочек насчет слэшей.

 
S

slavon-x86

В ближайшее время возьмусь за изучение asp.net !

addslashes() - это функции достаточно для безопасного сохранения в MySQL ?
 
P

Pasha

Судя по - да. Хотя кто его знает, лучше mysql_escape_string использовать :)
 
S

slavon-x86

А можно просто удалить эти символы ?
 
P

Pasha

Ну ты же пытаешься сам текст ссылки сохранить, а не превратить его в httpforumcodebynet.
 
S

slavon-x86

А резве не достаточно удалить ' " \ ?
 
H

Holger Dee Assuran

Можно, конечно, и поудалять все управляющие символы, но ведь ты пытаешься сохранить текст ссылки. Как ты потом определишь какие символы из какой ссылки ты удалил?

from Pasha
mysql_escape_string() пропускает символы % и _. Я не помню про _ , но % - это точно управляющий символ.
 
S

slavon-x86

Ведь если удалить '(ковычка однойная) "(ковычка двойная) \(косая черта), то всё остальное будет в кавычках и поидее не сможет нанести вред !?
 
M

MajestiC

<!--QuoteBegin-Pasha+13:06:2007, 17:45 -->
<span class="vbquote">(Pasha @ 13:06:2007, 17:45 )</span><!--QuoteEBegin-->Учи asp.net, в нем точно известно, что безопасно, а что нет По крайней мере параметры в SQL в нем принято передавать именно как параметры, а не как часть строки запроса, без заморочек насчет слэшей.
[snapback]69226" rel="nofollow" target="_blank[/snapback]​
[/quote]
Для: Pasha
Так... Появились знатоки .NET =) Pasha, способов формирования SQL запросов в PHP много, выбор остается за программистом.


Для: Holger Dee Assuran

mysql_escape_string() пропускает символы % и _. Я не помню про _ , но % - это точно управляющий символ.

Он пропускает эти символы из-за того что это управляющие символы при использовании LIKE в MySQL запросах, никакого вреда они не смогут нанести если не использовать LIKE.
 
M

MajestiC

Для: slavon-x86

Теперь давай определимся, раз ты говоришь что ты уже полгода не можешь получить ответ насчет безопасности.

Задача проста: нужно обезопасить себя при вставке данных в базу, и нужно обезопасить вывод данных из базы.

Правило первое: если знаешь что пользователь должен вставить какие-то данные определенного формата (e-mail, url, имя, фамилию, что-нибудь еще), проверяй их до вставки в базу, например используюя регулярные выражения, иначе выдавай пользователю ошибку, и проси ввести корректные значения. Если не знаешь что пользователь вставил (например просто текст), то обязательно смотри правило 3.

Правило второе: все данные поступающие из внешних источников, при формировании SQL запросов проверяй и экранируй с помощью mysql_real_escape_string или mysql_escape_string, addslashes не используй. Сразу отмечу что это не сделает сами данные безопасными, если ты об этом не позаботился сам, это всего лишь обеспечит корректную вставку этих данных в базу.

Правило третье, предположим что ты не знаешь что пользователь вставил в базу, тут вступает правило вывода информации. Если ты хочешь что-бы всё корректно отображалось, перед выводом делай для переменной htmlspecialchars. Это избавит тебя от проблем (если ты раньше об этом не побеспокоился, например вырезав сразу все тэги из текста) вида:
Пользователь вставил в базу:
Это мега текст<script>alert('А вот и скрипт');</script>
Без использования htmlspecialchars, при выводе в html этот скрипт вызовет javascript, что конечно не хорошо.
С использованием htmlspecialchars браузер выведет просто текст. Символы < " ' > заменятся их html-кодами, то есть не будут восприниматся браузером как начало/конец тэга.

PS. И не спеши особо кидатся от языка к языку, язык всего лишь инструмент.
 
P

Pasha

Для: MajestiC
Я просто пытаюсь убедить человека не останавливаться на php :) А вообще надо использовать parameter placeholders, сразу исчезнут проблемы со спец. символами.
 
M

MajestiC

Для: Pasha
Согласен, выбор языка - дело субьективное, а знание многих языков еще никогда никому не мешало.

Я просто хочу что бы люди не скакали от языка к языку думая что это сразу решит все проблемы (в данном случае web-программирования), а пытались изучить базовые знания, используя какой угодно язык. В данном случае не важно на каком языке для начала идет программирование, но что бы легче было изучить базу, раз он выбрал для начала php, то пускай на нем изучит базовые знания, потом ему будет намного легче изучить любой язык, хоть VBScript, хоть руби, хоть питон. Во всяком случае грабли самого веба изучит =) Может сформировал мысли довольно сумбурно, но думаю смысл понятен.
 
P

Pasha

Для: MajestiC
Полностью поддерживаю. Респект, все такое. :)
 
H

Holger Dee Assuran

Для: slavon-x86
ВО! MagestiC дело говорит. Ипро твою ситуацию, и про язык тоже. Респект.
 
S

slavon-x86

htmlspecialchars - этого достаточно для безопасного вывода ?


Логин я фильтрую через регулятивное выражение, но ссылка содержит спец. символы, поэтому появилась проблема !

mysql_real_escape_string экранирует только '(ковычка однойная) "(ковычка двойная) \(косая черта) ! Стало быть !"№;%:?*()_+/@#$%^& не могут нанести вреда БД !?
 
M

MajestiC

<!--QuoteBegin-slavon-x86+15:06:2007, 13:02 -->
<span class="vbquote">(slavon-x86 @ 15:06:2007, 13:02 )</span><!--QuoteEBegin-->htmlspecialchars - этого достаточно для безопасного вывода ?
[snapback]69520" rel="nofollow" target="_blank[/snapback]​
[/quote]
Да.

<!--QuoteBegin-slavon-x86+15:06:2007, 13:02 -->
<span class="vbquote">(slavon-x86 @ 15:06:2007, 13:02 )</span><!--QuoteEBegin-->регулятивное выражение
[snapback]69520" rel="nofollow" target="_blank[/snapback]​
[/quote]
Регулярное =)

<!--QuoteBegin-slavon-x86+15:06:2007, 13:02 -->
<span class="vbquote">(slavon-x86 @ 15:06:2007, 13:02 )</span><!--QuoteEBegin-->mysql_real_escape_string экранирует только '(ковычка однойная) "(ковычка двойная) \(косая черта) ! Стало быть !"№;%:?*()_+/@#$%^& не могут нанести вреда БД !?
[snapback]69520" rel="nofollow" target="_blank[/snapback]​
[/quote]
Нет, не могут, если вы будете брать данные в кавычки, типа WHERE something = "3" OR something = "ddd". В запросах которые используют LIKE желательно разобраться с знаками _ и %, вреда они конечно не принесут, а вот корректность обработки всегда нужна =)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!