Что корректный/самый безопасный путь состоит в том, чтобы выйти из входа на форуме?

От этого страница :

(import '(javax.swing JFrame JButton JOptionPane)) ;'
(import '(java.awt.event ActionListener))          ;'

(let [frame (JFrame. "Hello Swing")
     button (JButton. "Click Me")]
 (.addActionListener button
   (proxy [ActionListener] []
     (actionPerformed [evt]
       (JOptionPane/showMessageDialog  nil,
          (str "Hello from Clojure. Button "
               (.getActionCommand evt) " clicked.")))))

 (.. frame getContentPane (add button))

 (doto frame
   (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
   .pack
   (.setVisible true)))

print("code sample");

И, конечно, на это стоило бы посмотреть совместимость раздел веб-сайта clojure.

7
задан chris 6 August 2009 в 21:28
поделиться

7 ответов

При генерации вывода HTLM (как если бы вы вводили данные в поля формы, когда кто-то пытается отредактировать сообщение, или если вам нужно повторно отобразить форму, например, потому что пользователь забыл одно поле) , вы ' d, вероятно, используйте htmlspecialchars () : он будет экранировать <, > , ", ' и & - в зависимости от заданных вами параметров.

strip_tags удалит теги, если пользователь ввел некоторые из них - и обычно вы не хотите, чтобы что-то, введенное пользователем, просто исчезло ;-)
По крайней мере, не для поля «содержание» : -)


После того, как вы получили то, что пользователь ввел в форму (то есть, когда форма была отправлена) , вам нужно избежать его перед отправкой в ​​БД.
Вот где полезны такие функции, как mysqli_real_escape_string : они экранируют данные для SQL

. Вы также можете взглянуть на подготовленные операторы, которые могут вам немного помочь ;-)
с mysqli - и с PDO

Вы не должны использовать ничего подобного addlashes : экранирование не зависит от механизма базы данных; лучше / безопаснее использовать функцию, которая соответствует движку (MySQL, PostGreSQL, ...) , с которым вы работаете: он будет точно знать, что и как избегать.


Наконец, для отображения данных на странице:

  • для полей, которые не должны содержать HTML, вы должны использовать htmlspecialchars () : если пользователь ввел теги HTML, они будут отображаться как есть, а не вводится как HTML.
  • для полей, которые могут содержать HTML ... Это немного сложнее: вы, вероятно, захотите разрешить только несколько тегов, а strip_tags (который может это сделать) на самом деле не до задачи (допустит атрибуты разрешенных тегов)
    • Возможно, вы захотите взглянуть на инструмент под названием HTMLPUrifier : он позволит вам указать, какие теги и атрибуты должны быть разрешены, - и он генерирует правильный HTML, что всегда приятно ^^
    • Это может занять некоторое время, и вы, вероятно, не захотите повторно генерировать этот HTML каждый раз, когда он должен отображаться; так что вы можете подумать о том, чтобы сохранить его в базе данных (либо сохранить только этот чистый HTML, либо сохранить его и неочищенный в двух отдельных полях - может быть полезно, чтобы люди могли редактировать свои сообщения?)


Это всего лишь несколько указателей ... надеюсь, они вам помогут : -)
Не стесняйтесь спрашивать, есть ли у вас более точные вопросы!

8
ответ дан 6 December 2019 в 12:53
поделиться

mysql_real_escape_string () экранирует все, что вам нужно поместить в базу данных mysql. Но вместо этого вы должны использовать подготовленные операторы (в mysqli), потому что они чище и выполняют любое экранирование автоматически.

Все остальное можно сделать с помощью htmlspecialchars (), чтобы удалить HTML из ввода, и urlencode (), чтобы поместить вещи в формат для URL.

4
ответ дан 6 December 2019 в 12:53
поделиться

Есть два совершенно разных типа атак, от которых вы должны защищаться:

  • SQL-инъекция: ввод, который пытается манипулировать вашей БД. mysql_real_escape_string () и addlashes () предназначены для защиты от этого. Первое лучше, но параметризованные запросы еще лучше
  • Межсайтовый скриптинг (XSS): ввод, который при отображении на вашей странице пытается выполнить JavaScript в браузере посетителя для выполнения любых действий (например, кражи пользователя данные аккаунта). htmlspecialchars () - однозначный способ защиты от этого.

Разрешить "немного HTML", избегая при этом XSS-атак, очень, очень сложно. Это связано с тем, что существует бесконечное количество возможностей для внедрения JavaScript в HTML. Если вы решили это сделать, безопасным способом будет использование BBCode или Markdown, т.е. е. ограниченный набор разметки, отличной от HTML, которую вы затем конвертируете в HTML, удаляя весь реальный HTML с помощью htmlspecialchars () . Даже в этом случае вы должны быть осторожны, чтобы не разрешить URL-адреса javascript: в ссылках. На самом деле разрешить пользователям вводить HTML - это то, что вы должны делать, только если это абсолютно необходимо для вашего сайта . И затем вы должны потратить много времени на то, чтобы полностью понять HTML, JavaScript и CSS.

3
ответ дан 6 December 2019 в 12:53
поделиться

Ответ на этот пост - хороший ответ

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

1
ответ дан 6 December 2019 в 12:53
поделиться

У меня есть тенденция экранировать все символы, которые могут быть проблематичными при отображении страницы, Javascript и SQL одновременно. Он оставляет его доступным для чтения в Интернете и в электронной почте HTML и в то же время устраняет любые проблемы с кодом. Строка кода vb.NET будет:

SafeComment = Replace( _
              Replace(Replace(Replace( _
              Replace(Replace(Replace( _
              Replace(Replace(Replace( _
              Replace(Replace(Replace( _
                HttpUtility.HtmlEncode(Trim(strInput)), _
                  ":", "&#x3A;"), "-", "&#x2D;"), "|", "&#x7C;"), _
                  "`", "&#x60;"), "(", "&#x28;"), ")", "&#x29;"), _
                  "%", "&#x25;"), "^", "&#x5E;"), """", "&#x22;"), _
                  "/", "&#x2F;"), "*", "&#x2A;"), "\", "&#x5C;"), _
                  "'", "&#x27;")

0
ответ дан 6 December 2019 в 12:53
поделиться

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

Если вы вставляете простой текст в базу данных, не пытайтесь очистить его при вставке, а вместо этого очистите его на дисплее. То есть используйте htmlentities , чтобы закодировать его как HTML (и передать правильный аргумент кодировки). Вы хотите кодировать на дисплее, потому что тогда вы мы больше не верим в правильность содержимого базы данных, что не обязательно является заданным.

Если вы имеете дело с форматированным текстом (html), все становится сложнее. Удаление «злых» битов из HTML без разрушения сообщения - сложная проблема. Реально говоря, вам придется прибегнуть к стандартному решению, например HTMLPurifier . Однако обычно это слишком медленно для запуска при каждом просмотре страницы, поэтому вам придется делать это при записи в базу данных. Вы также должны убедиться, что пользователь может видеть свой «очищенный» HTML и исправлять очищенную версию.

Определенно постарайтесь избегать «развертывания собственного» фильтра или решения для кодирования на любом этапе. Эти проблемы заведомо сложны,

0
ответ дан 6 December 2019 в 12:53
поделиться

Я второй Джоери, не катите свой собственный, перейдите сюда, чтобы см. некоторые из многих возможных атак XSS

http://ha.ckers.org/xss.html

htmlentities () -> превращает текст в HTML, преобразовывая символы в сущности. Если вы используете кодировку UTF-8, используйте вместо нее htmlspecialchars (), поскольку другие сущности не нужны. Это лучшая защита от XSS. Я использую его для каждой выходной переменной, независимо от типа или происхождения, если только я не собираюсь использовать HTML. Затраты на производительность незначительны, и это проще, чем пытаться решить, что нужно экранировать, а что нет.

strip_tags () - превращает html в текст, удаляя все теги html. Используйте это, чтобы убедиться, что в вашем вводе нет ничего неприятного в качестве дополнения к экранированию вывода.

mysql_real_escape_string () - экранирует строку для mysql и является вашей защитой от SQL-инъекций из маленьких таблиц Бобби (лучше использовать mysqli и подготовиться Затем выполняется / bind, поскольку экранирование выполняется за вас, и вы можете избежать множества беспорядочных конкатенаций строк)

Предлагаемый совет, чтобы избежать ввода HTML, если это не является существенным, и выбрать BBCode или аналогичный (при необходимости создайте свой собственный) действительно очень здорово.

0
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: