От этого страница :
(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.
При генерации вывода HTLM (как если бы вы вводили данные в поля формы, когда кто-то пытается отредактировать сообщение, или если вам нужно повторно отобразить форму, например, потому что пользователь забыл одно поле) , вы ' d, вероятно, используйте htmlspecialchars ()
: он будет экранировать <
, >
, "
, '
и &
- в зависимости от заданных вами параметров.
strip_tags
удалит теги, если пользователь ввел некоторые из них - и обычно вы не хотите, чтобы что-то, введенное пользователем, просто исчезло ;-)
По крайней мере, не для поля «содержание» : -)
После того, как вы получили то, что пользователь ввел в форму (то есть, когда форма была отправлена) , вам нужно избежать его перед отправкой в БД.
Вот где полезны такие функции, как mysqli_real_escape_string
: они экранируют данные для SQL
. Вы также можете взглянуть на подготовленные операторы, которые могут вам немного помочь ;-)
с mysqli - и с PDO
Вы не должны использовать ничего подобного addlashes
: экранирование не зависит от механизма базы данных; лучше / безопаснее использовать функцию, которая соответствует движку (MySQL, PostGreSQL, ...) , с которым вы работаете: он будет точно знать, что и как избегать.
Наконец, для отображения данных на странице:
htmlspecialchars ()
: если пользователь ввел теги HTML, они будут отображаться как есть, а не вводится как HTML. strip_tags
(который может это сделать) на самом деле не до задачи (допустит атрибуты разрешенных тегов)
Это всего лишь несколько указателей ... надеюсь, они вам помогут : -)
Не стесняйтесь спрашивать, есть ли у вас более точные вопросы!
mysql_real_escape_string ()
экранирует все, что вам нужно поместить в базу данных mysql. Но вместо этого вы должны использовать подготовленные операторы (в mysqli), потому что они чище и выполняют любое экранирование автоматически.
Все остальное можно сделать с помощью htmlspecialchars (), чтобы удалить HTML из ввода, и urlencode (), чтобы поместить вещи в формат для URL.
Есть два совершенно разных типа атак, от которых вы должны защищаться:
mysql_real_escape_string ()
и addlashes ()
предназначены для защиты от этого. Первое лучше, но параметризованные запросы еще лучше htmlspecialchars ()
- однозначный способ защиты от этого. Разрешить "немного HTML", избегая при этом XSS-атак, очень, очень сложно. Это связано с тем, что существует бесконечное количество возможностей для внедрения JavaScript в HTML. Если вы решили это сделать, безопасным способом будет использование BBCode или Markdown, т.е. е. ограниченный набор разметки, отличной от HTML, которую вы затем конвертируете в HTML, удаляя весь реальный HTML с помощью htmlspecialchars ()
. Даже в этом случае вы должны быть осторожны, чтобы не разрешить URL-адреса javascript:
в ссылках. На самом деле разрешить пользователям вводить HTML - это то, что вы должны делать, только если это абсолютно необходимо для вашего сайта . И затем вы должны потратить много времени на то, чтобы полностью понять HTML, JavaScript и CSS.
Ответ на этот пост - хороший ответ
По сути, использование интерфейса pdo для параметризации ваших запросов намного безопаснее и меньше ошибок более склонны, чем экранирование вводимых данных вручную.
У меня есть тенденция экранировать все символы, которые могут быть проблематичными при отображении страницы, Javascript и SQL одновременно. Он оставляет его доступным для чтения в Интернете и в электронной почте HTML и в то же время устраняет любые проблемы с кодом. Строка кода vb.NET будет:
SafeComment = Replace( _ Replace(Replace(Replace( _ Replace(Replace(Replace( _ Replace(Replace(Replace( _ Replace(Replace(Replace( _ HttpUtility.HtmlEncode(Trim(strInput)), _ ":", ":"), "-", "-"), "|", "|"), _ "`", "`"), "(", "("), ")", ")"), _ "%", "%"), "^", "^"), """", """), _ "/", "/"), "*", "*"), "\", "\"), _ "'", "'")
Прежде всего, общий совет: не избегайте переменных буквально при вставке в базу данных. Существует множество решений, позволяющих использовать подготовленные операторы с привязкой переменных. Причина не делать этого явно заключается в том, что это только вопрос времени, прежде чем вы забудете об этом хотя бы раз.
Если вы вставляете простой текст в базу данных, не пытайтесь очистить его при вставке, а вместо этого очистите его на дисплее. То есть используйте htmlentities , чтобы закодировать его как HTML (и передать правильный аргумент кодировки). Вы хотите кодировать на дисплее, потому что тогда вы мы больше не верим в правильность содержимого базы данных, что не обязательно является заданным.
Если вы имеете дело с форматированным текстом (html), все становится сложнее. Удаление «злых» битов из HTML без разрушения сообщения - сложная проблема. Реально говоря, вам придется прибегнуть к стандартному решению, например HTMLPurifier . Однако обычно это слишком медленно для запуска при каждом просмотре страницы, поэтому вам придется делать это при записи в базу данных. Вы также должны убедиться, что пользователь может видеть свой «очищенный» HTML и исправлять очищенную версию.
Определенно постарайтесь избегать «развертывания собственного» фильтра или решения для кодирования на любом этапе. Эти проблемы заведомо сложны,
Я второй Джоери, не катите свой собственный, перейдите сюда, чтобы см. некоторые из многих возможных атак XSS
htmlentities () -> превращает текст в HTML, преобразовывая символы в сущности. Если вы используете кодировку UTF-8, используйте вместо нее htmlspecialchars (), поскольку другие сущности не нужны. Это лучшая защита от XSS. Я использую его для каждой выходной переменной, независимо от типа или происхождения, если только я не собираюсь использовать HTML. Затраты на производительность незначительны, и это проще, чем пытаться решить, что нужно экранировать, а что нет.
strip_tags () - превращает html в текст, удаляя все теги html. Используйте это, чтобы убедиться, что в вашем вводе нет ничего неприятного в качестве дополнения к экранированию вывода.
mysql_real_escape_string () - экранирует строку для mysql и является вашей защитой от SQL-инъекций из маленьких таблиц Бобби (лучше использовать mysqli и подготовиться Затем выполняется / bind, поскольку экранирование выполняется за вас, и вы можете избежать множества беспорядочных конкатенаций строк)
Предлагаемый совет, чтобы избежать ввода HTML, если это не является существенным, и выбрать BBCode или аналогичный (при необходимости создайте свой собственный) действительно очень здорово.