2013-03-13 3 views
0

Я использую lxml.html.clean для удаления ненадежного ввода в свой html-код. Я понял, что lxml удаляет тег data: в моем коде. Однако я хочу вставить изображение в формате base64 (из базы данных, у меня нет файла), поэтому мне нужен этот тег. Например, принятьlxml cleaner to ignore base64 image

from lxml.html.clean import Cleaner 
cleaner = Cleaner() 
cleaner.clean_html(""" 
    <img src="http://test.com/img.png"/> 
    <img src="data:image/png;base64,aGVsbG8="/> 
""") 

Результат '<span><img src="http://test.com/img.png"><img src=""></span>'. Первое изображение не экранировано, второе - да.

Любая идея, как я могу заставить его принять мой код base64, не допуская прохождения уязвимостей?

+0

Может уборщик процесс уже разобран DOM? Вы можете сделать это, указав белый список, указав 'data:' URI, которые вы хотите сохранить в пользовательском атрибуте, например 'data-src'. Чистое устройство должно надеяться игнорировать эти атрибуты, когда вы запускаете его против DOM, после чего вы снова проводите его и восстанавливаете URI обратно в 'src'. – millimoose

+0

Я не уверен, что понимаю, что вы предлагаете. Сначала очистите текст, а затем вставьте изображение? К сожалению, я не могу, это метод, называемый непосредственно перед рендерингом шаблона, и я не могу изменить рабочий процесс. –

+0

Hm. Еще более хакерское обходное решение будет использовать немного Javascript для восстановления атрибутов 'src' при загрузке страницы, но я признаю, что это уже довольно уродливо. Кроме того, очиститель [написан на Python] (https://github.com/lxml/lxml/blob/master/src/lxml/html/clean.py) - вы можете использовать отладчик Python, чтобы сориентироваться вокруг него, чтобы увидеть почему он удаляет 'data:' URI и влияет ли один из документированных параметров на это поведение. – millimoose

ответ

1

Я смог воспроизвести это поведение после установки lxml 3.1.0. Вот решение, основанное на «патче обезьяны» - замена шаблона регулярного выражения lookup в модуле lxml.html.clean для исключения ссылок, содержащих данные: image /.*; base64 из удаления.

import re 
import lxml 
from lxml.html.clean import Cleaner 
new_pattern = '\s*(?:javascript:|jscript:|livescript:|vbscript:|data:[^(?:image/.+;base64)]+|about:|mocha:)' 

print(new_pattern) 

lxml.html.clean._javascript_scheme_re = re.compile(new_pattern, re.I) 


cleaner = Cleaner() 
dochtml = """ 
    <img src="http://test.com/img.png"/> 
    <img src="data:image/png;base64,aGVsbG8="/> 
    <img src="data:unsafe/contents;base64,aGVsbG8="/> 
    <img src="data:text/html;base64,PGh0bWw+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmFsZXJ0KC‌​doaScpPC9zY3JpcHQ+PC9odG1sPg=="/> 
""" 
r = cleaner.clean_html(dochtml) 
print(r) 

Результат

<span><img src="http://test.com/img.png"> 
    <img src="data:image/png;base64,aGVsbG8="> 
    <img src=""> 
    <img src=""> 
</span> 

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

Чтобы быть безопасным, я создам обработчик URL-адресов на веб-сервере для возврата содержимого изображения из базы данных по идентификатору. Поэтому в вашем html-документе это будет примерно так: <img src="http://myserver/showimg?id=123213">. Но это связано с добавлением множества дополнительных движущихся частей - например, с веб-сервером и т. Д. Также это не сработает, если нежелательно, чтобы весь мир имел доступ к этим изображениям.

Старый ответ:

Должна быть предусмотрена возможность настроить уборщик, чтобы эти теги, но я не могу воспроизвести свое дело - он просто работает для меня. Я использую python 2.7.2 и lxml 2.2.8 win-32. Просьба уточнить, какие у вас версии python и lxml?

Я попытался запустить пример и вернулся вторые содержимое изображения тегов, которые не были удалены

+0

Спасибо. Я просто тестировал как python 2.7.3, так и python 3.3.0, как lxml 3.1.0 на linux, так и поведение. Возможно, это связано с версией lxml. –

+0

Действительно, исправление ошибки с 2.3.1 «Уборка HTML не удаляла» данные: «Ссылки». http://lxml.de/2.3/changes-2.3.1.html –

+0

Благодарим за информацию. Я установлю более новую версию lxml и буду играть с ней завтра – vvladymyrov