Sander1 62 Опубликовано: 22 октября Рассказать Опубликовано: 22 октября 1. В метатеге заголовка невозможно использовать обратный слеш: \ Его получится использовать, если экранировать его вручную прописав \\\\, но после повторного сохранения слеш всё равно пропадёт. Т.е. stripslashes есть, а addslashes нету. 2. Невозможно нормально использовать HTML сущности в основном и мета заголовке. К примеру мне нужно, чтобы был именно такой заголовок в таком же виде: Пример "замены" © на © После сохранения новости в БД записывается "исправленный" заголовок (причём ещё зачем-то дополнительно экранируется двойная кавычка): Пример \"замены\" © на © Возможно так действительно правильнее/удобнее. Для таких редких случаев можно вручную экранировать символ & → & Но проблема в том, что после повторного сохранения – опять получим "исправленный" заголовок. Пишу заголовок: Пример "замены" © на © В БД он записывается в таком же виде (разве что кавычка лишний раз экранируется слешем). На сайте в заголовке и на странице он отображается корректно именно так как задумано (чтобы писало " и © текстом) Открываю редактирование и вижу уже "исправленный" заголовок: Пример "замены" © на © Ну и после сохранения, соответственно, полностью теряется исходный заголовок. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 072 Опубликовано: 22 октября Рассказать Опубликовано: 22 октября 8 минут назад, Sander1 сказал: 2. Невозможно нормально использовать HTML сущности в основном и мета заголовке. Зачем вы пишите сущности? Все что требует экранировать будет экранировано, и никаких сущностей для этого писать не требуется. И писать " нет никакого смысла. Заголовок должен быть написан текстом и нормальными символами, а не HTML кодом. HTML сущности являются ничем иным как HTML кодом. HTML код в этих тегах недопустим, никакой. И не будет допустим. В этом поле допустим и пишется только текст, без какого либо HTML. 8 минут назад, Sander1 сказал: 1. В метатеге заголовка невозможно использовать обратный слеш: \ Тоже 100% нет, потому что при комбинации условий, это прямой путь к взлому сайта и возможность внедрения зловредного кода, а также повреждения верстки страницы. Цитата Ссылка на сообщение Поделиться на других сайтах
Sander1 62 Опубликовано: 22 октября Рассказать Опубликовано: 22 октября Автор 1. В обычный заголовок пишу `Пример \ слеша`, в теле страницы вижу заголовок: <title>Пример \ слеша</title> Если же в метатег заголовка прописать `Пример \ слеша`, то в теле страницы будет: <title>Пример слеша</title> Получается в одном случае это опасно, в другом – нет? 2. Зачем... Например чтобы можно было сделать такой заголовок: https://stackoverflow.com/questions/35367945/why-should-i-use-amp-instead-of Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 072 Опубликовано: 22 октября Рассказать Опубликовано: 22 октября 1. Я вам написал это вопрос безопасности. 2. Так и пишите просто & в коде он уже будет как & писать это вручную не нужно Цитата Ссылка на сообщение Поделиться на других сайтах
Sander1 62 Опубликовано: 22 октября Рассказать Опубликовано: 22 октября Автор 2. Откройте страницу по ссылке. Скопируйте тот заголовок и вставьте его в DLE. Вот в этом проблема, что НЕВОЗМОЖНО получить на выходе такой же заголовок как там. Будет так: Why should I use & instead of &? Вместо правильного: Why should I use & instead of &? Да даже на этом движке форума, я уверен, если в заголовке прописать & то на странице он так же и будет показан, а не заменён на &. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 072 Опубликовано: 23 октября Рассказать Опубликовано: 23 октября 13 часов назад, Sander1 сказал: Вот в этом проблема, что НЕВОЗМОЖНО получить на выходе такой же заголовок как там. Будет так: Я посмотрю, потому что если честно я на память не помню уже, очень старая функция DLE, и в ней очень давно не было никаких изменений. Но сразу задам вопрос. По вашему ссылки и содержание метатега это одно и тоже? В данной теме автора беспокоят ссылки в HTML документе и для ссылок действительно крайне важно писать & вместо &. А какой тайный смысл писать это в описании? Для чего в описании писать & вместо &? Какой то потребности в этом нет. Поэтому не совсем понятно в чем именно заключается проблема. Цитата Ссылка на сообщение Поделиться на других сайтах
Sander1 62 Опубликовано: 23 октября Рассказать Опубликовано: 23 октября Автор 9 часов назад, celsoft сказал: Я посмотрю, потому что если честно я на память не помню уже, очень старая функция DLE, и в ней очень давно не было никаких изменений. Но сразу задам вопрос. По вашему ссылки и содержание метатега это одно и тоже? В данной теме автора беспокоят ссылки в HTML документе и для ссылок действительно крайне важно писать & вместо &. А какой тайный смысл писать это в описании? Для чего в описании писать & вместо &? Какой то потребности в этом нет. Поэтому не совсем понятно в чем именно заключается проблема. Суть не в том что там обсуждается. Вы задали вопрос – зачем нужна возможность отображения & в заголовке, я привел пример страницы где как раз в заголовке используется & как текст, а не как html сущность. Правильно ли заменять HTML сущности на соответствующий символ внутри текста – это отдельная тема и тут нет однозначно правильного мнения. К примеру на этом форуме если я пишу < в тексте, то он и выведет < и не заменит на < Повторю основную суть. В DLE невозможно создать, к примеру, такой заголовок: Почему в адресе необходимо использовать & вместо & Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 072 Опубликовано: 23 октября Рассказать Опубликовано: 23 октября 5 часов назад, Sander1 сказал: Вы задали вопрос – зачем нужна возможность отображения & в заголовке, я привел пример страницы где как раз в заголовке используется & как текст, а не как html сущность. Вы не привели. А если вы приводите в пример эту страницу как просто посмотрите на метатеги, так нужно понимать что этот текст используется не только в теге title во много мест на странице, например в og:title и og:descriptioт и в DLE он также идет во много вспомогательных, и посмотрите во что он там превратился в других метатегах например там уже why should I use &amp;amp; а эти теги намного важнее чем в title прописать & когда вы написали &. Для чего такую конвертацию проводить? Вы на это не ответили. В этом нет практической необходимости для тега. На странице что вы привели в теге title зачем то переделан & в & а в другом вообще каша из двух повторно примененных экранирований, и зачем? когда в одном вообще не должно быть а в другом должно быть одинарное. Так что пример кода совсем не показателен как правильный, если на то смотреть. 22.10.2024 в 16:57, Sander1 сказал: Получается в одном случае это опасно, в другом – нет? Я посмотрю этот вопрос, сейчас под рукой просто нет возможности изучить это внимательно. Дело совершенно не в теге <title> этот текст идет в другие теги и другой код страниц, которые более критичны. Я же соврешенно не против добавить чтобы была поддержка большего количества символов, но это не должно быть в ущерб безопасности, тут требуется тщательное изучение этого вопроса, потому что этот текст идет еще и в весьма важные и критичные места на странице. Поэтому я это посмотрю, что можно сделать и улучшить. Цитата Ссылка на сообщение Поделиться на других сайтах
Sander1 62 Опубликовано: 24 октября Рассказать Опубликовано: 24 октября Автор 22.10.2024 в 16:42, celsoft сказал: Заголовок должен быть написан текстом и нормальными символами, а не HTML кодом. С этим я согласен. И вот именно в это суть данной темы. Парсер DLE распознает в тексте заголовка html сущности и заменяет их на соответствующие символы: " → " & → & и т.д. Т.е. если я написал заголовок: Пример & / & / <b> / " / ' / © То в таком и именно в таком виде заголовок должен хранится в БД. В DLE же он меняется и сохраняется у же порезанным и преобразованным В БД: Пример & / & / / \" / \' / © Что видит пользователь на странице: Пример & / & / / " / ' / © На сайте в исходном коде: <title>Пример & / & / / " / ' / ©</title> При выводе на сайте, хоть в теле страницы хоть в метатегах достаточно один раз использовать htmlspecialchars($title, ENT_QUOTES | ENT_HTML5, 'utf-8'); Без последующих костылей вида str_replace('&amp;', '&', $title); При нормальном использовании исходный заголовок в исходном коде страницы должен выглядеть так: <title>Пример &amp; / & / <b> / &quot; / &#039; / &copy;</title> <meta property="og:title" content="Пример &amp; / & / <b> / &quot; / &#039; / &copy;"> <h1>Пример &amp; / & / <b> / &quot; / &#039; / &copy;</h1> И пользователь на странице будет видеть заголовок именно так как задумано и написано в поле заголовка. К вопросу о безопасности. Я помню этот баг, когда в метатеге заголовка писали тег {content} и движок распознавал его как тег, а не как текст, что действительно ломало верстку. Для этого сейчас вы дополнительно добавили строку: $text = str_replace(array("{", "}", "[", "]"), array("{", "}", "[", "]"), $text); Но вот проблем с обратным слешем я не вижу вообще никаких. Суть-то в чем. Этот слеш можно написать и сохранить, но его приходится вручную экранировать, чтобы его не вырезал stripslashes, который вообще хз зачем там нужен. 16 часов назад, celsoft сказал: Вы не привели. Вы задали вопрос – зачем писать html сущности в заголовке. Я просто в гугле нашел первую страницу где в заголовке написано текстом & Я не смотрел и не приводил тот сайт как образец правильности заполнения метатегов. Но согласен, что &amp;amp; – это очевидно баг, они взяли экранированный заголовок и повторно экранировали его в описании. 16 часов назад, celsoft сказал: Для чего такую конвертацию проводить? Вот именно этим вопросом я задаюсь глядя на код в DLE. 1. При сохранении $parse->process заменяет & на & и сохраняет в таком виде в БД. 2. При формировании метатегов в $meta->title($metatags['title']); выполняется вызов метода Helper::escape в котором сначала выполняется замена сущностей на символы html_entity_decode и затем опять экранирование в htmlspecialchars. Я понимаю зачем и почему так сделано, но это всё лишь следствие неправильного хранения данных. Причем в оригинальном методе класса этого двойного преобразования нет, там только один htmlspecialchars. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 072 Опубликовано: 25 октября Рассказать Опубликовано: 25 октября 17 часов назад, Sander1 сказал: С этим я согласен. Вы противоречите сами себе, потому как в заголовке вы написали: "Пример & / & / <b> / " / ' / ©" во первых вы написали & а втеге <title> его экранировали, а суть моего вопроса была зачем?, во вторых " это не просто текст это HTML код а не просто текст. 17 часов назад, Sander1 сказал: Вы задали вопрос – зачем писать html сущности в заголовке Нет я не задавал этот вопрос. Я утверждал, что там нужно писать текст а не HTML код, а сущности относятся HTML коду. Я задал я вопрос: зачем экранировать обычный символ & в сущность в теге <title>. ..... </title> 17 часов назад, Sander1 сказал: К вопросу о безопасности. Я помню этот баг, когда в метатеге заголовка писали тег {content} и движок распознавал его как тег, а не как текст, что действительно ломало верстку. Для этого сейчас вы дополнительно добавили строку: Не про это я пишу, и про возможность угрозы безопасности не это имеется ввиду. Угроза безопасности в данном случае это возможность внедрения выполняемого кода, и возможность выхода за пределы атрибута тега, где написан текст. 17 часов назад, Sander1 сказал: Парсер DLE распознает в тексте заголовка html сущности и заменяет их на соответствующие символы: Парсер приводит все что является HTML кодом в этот код. т.е. символы, чтобы потом экранировать, т.е. обезопасить при выводе. В этом и суть безопасности. Код который пишет пользователь не является "доверенным", т.е. DLE не доверяет и не может доверять этому коду, потому что он пришел от пользователя из вне, соответственно DLE "предполагает" что пользователь может "взломать" сайт, поэтому и только поэтому он приводит ваш написанный HTML код собственно в результат выполнения этого кода, например ваш " в " после чего экранировал при выводе в сущность, но при редактировании вы сущности видеть не будете, вы будете видеть символ кавычки ", а не ваш написанный код. Ведь нужно четко осознавать что существуют не просто сущности & но можно написать очень сложный и изорщенный код, который приведет к взлому сайта, поэтому DLE не доверяет любым данным которые пришли из вне, это базовая политика безопасности. Например обратный слеш \ безобиден сам по себе, а комбинация \" опасна потому как позволяет выходит за пределы атрибута и т.д. Вариаций миллионы. Цитата Ссылка на сообщение Поделиться на других сайтах
Sander1 62 Опубликовано: 25 октября Рассказать Опубликовано: 25 октября Автор Ладно, я понял, что в этом вопросе у нас в корне разный подход к обработке пользовательских данных... Я придерживаюсь общепринятой практики, что данные необходимо хранить в чистом виде не изменяя их и не уничтожая. Если я написал заголовок Пример <script>alert('test')</script> & \" © – то именно в таком виде он должен сохранится в БД без преобразований и замен. И именно это должен видеть пользователь на странице сайта. Задача программиста обеспечить лишь безопасность: 1. Сохранение этих данных в БД 2. Отображение данных на сайте (админка, пользователю, метатеги, rss и т.д.) В первом случае для этого достаточно $db->safesql(), хотя лучше бы ->prepare, но и так сойдёт. Никаких дополнительных addslashes и htmlspecialchars не нужно. Во втором – использовать htmlspecialchars() с соответствующими флагами, как раз чтобы браузер воспринимал этот заголовок как обычный текст, а не как код или html сущности. 1 Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 072 Опубликовано: 25 октября Рассказать Опубликовано: 25 октября 1 час назад, Sander1 сказал: Задача программиста обеспечить лишь безопасность Вы не сможете это сделать, используя принцип: 1 час назад, Sander1 сказал: Я придерживаюсь общепринятой практики, что данные необходимо хранить в чистом виде не изменяя их и не уничтожая. И более того, без обил, я не про вас вообще говорю, а говорю как о принципе. Это дилетантский подход в обеспечении безопасности. То что вы говорите это не общепринятный принцип. Общепринятый в безопасности принцип: "то что специально не разрешено, не должно быть вообще, и должно быть запрещено". Общепринятый принцип безопасности, это принцип "белых листов", а не "черных листов". Потому что черные листы и попытки отфильтровать при выводе, это самые узкие места в системах безопасности и именно такие принципы обходятся злоумышленниками при попытках взлома чего бы то ни было. Белый список, т.е. список только разрешенного обойти гораздо и гораздо сложнее. Поэтому тот кто поступает иначе, это не значит что использует общепринятые практики, а наоборот использует "дилетантский подход" к обеспечению безопасности. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 072 Опубликовано: 25 октября Рассказать Опубликовано: 25 октября Вообщем как и обещал выше, у меня появилось все посмотреть и изучить. Как я и написал выше для заголовка и для метатега заголовка, DLE допускает написание только исключительно текста и обычных символов и никакого HTML. Все что пишется в виде сущностей является HTML кодом, который приводится к символам, а при выводе корректно если необходимо приводится к сущностям, обеспечивая полную безопасность. Никакого недостаточного экранирования как вы указали в заголовке нет. Избыточного тоже нет, потому что сущности один раз приводятся из сущностей в символы и все. Что собственно и должно быть, потому что это как я написал выше вопрос безопасности и собственно назначения этого поля. Багов в этом вопросе нет точно. А нужно приводить код в символы или нет, это уже вопрос дискуссии, мое мнение нужно обязательно, потому как это более безопасно. При этом желание оставлять так как написано, мне понятно, оно крайне логично, но оно противоречит принципу использовать принцип "белого списка", т.е. разрешено только то что разрешено, что в свою очередь понижает уровень безопасности, а я этого бы не хотел, это первая причина. Но есть и вторая и тоже крайне важная это то что содержимое этих полей идет в разные места шаблона. к которым совершенно разные требования по содержимому и экранированию. Например заголовок, выводите вы тегом {title} в шаблоне. Этот тег вы можете поставить как <a htef=".....">{title}</a> так и как <a alt="{title}">....</a> в первом случае все прекрасно и безопасно, во втором случае нехороший человек вас гарантированно взломал, если сделать так как вы хотите, потому что в двух этих случаях контент должен быть по разному выведет и экранирован. Тоже самое и про метатег, он идет как <title> так и он же присутствует в ряде <meta ....> и тоже принципиально разный вывод должен быть. Поэтому в DLE такой метод применяется, который гарантирует безопасность чтобы пользователь не пытался вставить туда. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.