Насколько безопасно простое использование addlashes() и stripslashes() для кодирования содержимого?

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

Я использую простую дезинфекцию как:

$get_content = '<script>/*code to destroy the site*/</script>';
//insert into db
$sanitized_code = addslashes( $get_content );

При просмотре:

$fetched_data = /*slashed code*/;
//show as it's inserted
echo stripslashes( $fetched_data );

Я избегаю base64_encode() а также base64_decode() как я узнал, их производительность немного медленная.

Этого достаточно?
если нет, что еще я должен обеспечить, чтобы защитить сайт и / или БД от злой атаки с использованием плохого рекламного кода?

Я хотел бы получить ваше объяснение, почему вы предлагаете что-то - это поможет решить и меня в будущем. Любая помощь будет принята с благодарностью.

1 ответ

Решение

addslashes затем removeslashes это путешествие туда и обратно. Вы повторяете исходную строку в точности так, как она была вам представлена, поэтому вы ничем не защищены. '<script>/*code to destroy the site*/</script>' будет выводиться точно так же, как есть, на вашу веб-страницу, что позволит вашим рекламодателям делать все, что угодно, в контексте безопасности вашей веб-страницы.

Обычно, когда вы добавляете контент на веб-страницу, вы должны использовать htmlspecialchars так что все выходит в виде простого текста и < просто означает знак "меньше".

Если вы хотите, чтобы рекламодатель мог включать разметку, но не такие опасные конструкции, как <script> тогда вам нужно проанализировать HTML, только чтобы теги и атрибуты, которые вы знаете, были безопасными. Это сложно и сложно. Используйте существующую библиотеку, такую ​​как HTMLPurifier, чтобы сделать это.

Если вы хотите, чтобы рекламодатель мог включать разметку в сценарии, поместите их в iframe, обслуживаемый другим доменным именем, чтобы он не мог коснуться того, что находится на вашей собственной странице. Объявления обычно делаются таким образом.

Я не знаю, что ты надеешься делать с addslashes, Это неправильная форма экранирования для какого-либо конкретного контекста внедрения и даже не удаляет сложные символы. Почти никогда нет причин использовать его.

Если вы используете его для строкового содержимого для создания SQL-запроса, содержащего это содержимое, то STOP, это неправильный способ сделать это, и вы также будете манипулировать строками. Используйте параметризованные запросы для помещения данных в базу данных. (И если вы действительно не можете, правильная строковая литеральная функция будет mysql_real_escape_string или другие функции с аналогичными именами для разных баз данных.)

Другие вопросы по тегам