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

Тема в разделе "PHP программирование", создана пользователем slavon-x86, 12 июн 2007.

  1. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    <input name="link">

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

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

    Holger Dee Assuran Гость

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

    slavon-x86 Well-Known Member

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

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

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

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

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

    Holger Dee Assuran Гость

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

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

    Pasha Гость

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

    http://realdo.livejournal.com/19714.html
     
  6. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    В ближайшее время возьмусь за изучение asp.net !

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

    Pasha Гость

  8. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    А можно просто удалить эти символы ?
     
  9. Pasha

    Pasha Гость

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

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    А резве не достаточно удалить ' " \ ?
     
  11. Holger Dee Assuran

    Holger Dee Assuran Гость

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

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

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    Ведь если удалить '(ковычка однойная) "(ковычка двойная) \(косая черта), то всё остальное будет в кавычках и поидее не сможет нанести вред !?
     
  13. MajestiC

    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.
     
  14. MajestiC

    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. И не спеши особо кидатся от языка к языку, язык всего лишь инструмент.
     
  15. Pasha

    Pasha Гость

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

    MajestiC Гость

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

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

    Pasha Гость

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

    Holger Dee Assuran Гость

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

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    htmlspecialchars - этого достаточно для безопасного вывода ?


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

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

    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 желательно разобраться с знаками _ и %, вреда они конечно не принесут, а вот корректность обработки всегда нужна =)
     
Загрузка...

Поделиться этой страницей