После удаления ненужных тегов, что еще я должен сделать для ввода текста? - PullRequest
2 голосов
/ 09 июня 2009

В сценарии PHP я принимаю ввод от пользователя textarea и хочу разрешить несколько основных тегов. Поэтому, когда я вывожу строку, которую я использую -

echo strip_tags($content, '<b><i><ul><ol><li>');

Теперь обычно я бы использовал FILTER_SANITIZE_STRING, но это убрало бы все теги, и я бы использовал html_entities(), но это предотвратило бы отображение тегов, которые я передаю, как они должны.

Так что еще мне нужно раздеть или кодировать и как мне это сделать?

Ответы [ 6 ]

3 голосов
/ 09 июня 2009

Я не думаю, что вы можете положиться на strip_tags() в целях безопасности - от http://php.net/strip_tags:

Эта функция не изменяет атрибуты на тегах, которые вы разрешаете используя allowable_tags, включая атрибуты стиля и onmouseover, которые вредный пользователь может злоупотреблять, когда размещение текста, который будет показан другие пользователи.

Возможно, было бы лучше взглянуть на что-то вроде Очиститель HTML или PEAR HTML_Safe , которое должно быть в состоянии выполнять именно то, что вы хотите.

1 голос
/ 09 июня 2009

Проверьте свои данные на соответствие правилам, указанным в XSS шпаргалке . Также с точки зрения безопасности было бы лучше ознакомиться с Руководством OWASP по созданию безопасных веб-приложений и веб-служб

1 голос
/ 09 июня 2009

В прошлом я имел успех с lib_filter Кэла Хендерсона, который является очень хорошей облегченной библиотекой PHP4 / 5 для фильтрации тегов и атрибутов из ввода. Вы можете указать разрешенные теги / атрибуты с помощью переменной разрешенного члена, например, следующий код очищает встраиваемый код от таких сайтов, как YouTube / Vimeo / Flickr и т. д., но удаляет все остальное:

        $lib_filter = new lib_filter();
        $lib_filter->allowed = array(
            'object' => array('width', 'height'),
            'param' => array('name', 'value'),
            'embed' => array('src', 'type', 'allowscriptaccess', 'allowfullscreen', 'width', 'height')
        );
        $video = $lib_filter->go($input);
1 голос
/ 09 июня 2009

Есть некоторые атрибуты, которые вы, вероятно, хотите удалить, такие как style. Вы также можете удалить обработчики событий, такие как onMouseOver и onClick и т. Д.

0 голосов
/ 09 июня 2009

Как насчет этого

function stripSingleTags($tags, $string)
{
    foreach( $tags as $tag )
    {
        $string = preg_replace('#</?'.$tag.'[^>]*>#is', '', $string);
    }
    return $string;
}

/*** example usage ***/
$string = '<p>stuff</p><span>more <span class="foo">and even>< more</span> stuff here</span>';

$tags = array('h1', 'span');

echo stripSingleTags($tags, $string);

Источник: http://www.phpro.org/examples/Strip-Single-Tag.html

0 голосов
/ 09 июня 2009

Вы можете использовать это

echo filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW)

очень хороший учебник:

http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html#12

...