Powered by CodeIgniter
BaNru

BaNru

1
1 голос
  ПрофильБлог (2)Комментарии (15)ЗакладкиПродукты 
В одном из комментариев я упоминал о том, что теги <скрипт> заменяются на [ремовед]
Меня это напрягает. И вот простой пример избавления от этого

Открываем файл engine\codeigniter\libraries\Input.php Ищем строчки в районе #707
if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str))
{
$str = preg_replace("#<(/*)(script|xss)(.*?)\>#si", '[removed]', $str);
}
И заменяем
if (preg_match("/xss/i", $str))
{
$str = preg_replace("#<(/*)(xss)(.*?)\>#si", '[removed]', $str);
}

if (preg_match("/script/i", $str))
{
$str = preg_replace("#<(script)(.*?)\>#si", '& lt;script& gt;', $str);
$str = preg_replace("#<(script)(.*?)\>#si", '& lt;/script& gt;', $str);
}
Таким образом оставляем защиту от вредоносного xss кода, но разрешаем нормальную публикацию скриптов.

> 14:55 Поправил код
> Как я писал, редактор глючный, точнее наверное не редактор, а функции замен.
> & lt;script& gt;
> & lt;/script& gt;
> Не забудьте убрать пробелы

==========

Уважаемые эксперты, писавшие эту защиту, объясните, чем моя замена скобок опаснее вашей замены?

А также, кто подскажет правильный код?
<(script)(.*?)\> что бы после замены, всё написанное в (.*?) оставалось на месте

> 18:41 Решено!
Решено. Покопавшись в голове, и вспомнив благодаря поиску, решил вопрос. Ответ очень простой. Вместо
$str = preg_replace("#<(script)(.*?)\>#si", '& lt;script& gt;', $str);
ставим
$str = preg_replace("#<(script)(.*?)\>#si", '& lt;script$2& gt;', $str);
Незабываем так же убрать пробелы!

PS: Пока писал этот пост, нашел как избавиться от маленького, но неприятного глюка, а именно отбивки строк. Отбивка строк не происходит, если строка заканчивается закрывающим тегом. После этого хоть сколько <бр> не ставь, отбивки не будет. Что б отбивка происходила, достаточно в конце, после тэга поставить пробел :-)
> 14:55 Дополнил PS
> Если в конце строки стоит тэг и след строка начинается с тэга, то и обычный перенос строки не срабатывает. Надо ставить пробел в конце строки.
15:24 ← 25 июля 2010 Отправить в Твиттер banruBaNru  RSS comments 6

Комментарии (6) ↓

inetlover inetlover time 13:42 ← 27 июля 2010 #
Все озвученные проблемы имеют место быть. Спасибо за решение.
admin admin time 17:02 ← 27 июля 2010 #
Понравилось:
Уважаемые эксперты, писавшие эту защиту, объясните, чем моя замена скобок опаснее вашей замены?
Думаете создатели CI читаю наш сайт, и, мало того, знаю русский язык? :-)
Автор
BaNru BaNru time 00:35 ← 28 июля 2010 #
Я думал, что это разработка российская, а конкретно Ваша admin.
А что Вы подразумеваете под Cl я не знаю. Cl в моем знание — это только Хлор, хим элемент.
admin admin time 00:43 ← 28 июля 2010 #
CI — это аббревиатура от CodeIgniter, фреймворка, который лежит в основе движка.
engine/codeigniter — это как раз путь к файлам CI.
Автор
BaNru BaNru time 00:47 ← 28 июля 2010 #
Ясно будем знать. Я с PHP фрэймворками не общался просто.
Но вопрос остается открытым, просто можно перефразировать.
Уважаемые эксперты, объясните пожалуйста, чем моя замена скобок опаснее Cl замены?
admin admin time 00:51 ← 28 июля 2010 #
Ничем. У них он вырезается, а у вас переводится в читабельный код.