Моя недавняя заявка на сайт надстройки Firefox (на основе SDK надстройки Firefox 1.10) была отклонена, поскольку я не продезинфицировал ввод, который использую, и мне было предложено используйте nsIParserUtils
.
Я нашел функцию parseHTML(doc, html, allowStyle, baseURI, isXML)
на этой странице. Я изменил его на:
function parseHTML(doc, html, allowStyle, baseURI, isXML) {
var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
var f = parser.parseFragment(html, allowStyle ? parser.SanitizerAllowStyle : 0,
!!isXML, baseURI, doc);
return f;
}
И первый параметр в нем называется элементом документа. Я понятия не имею, что это должно быть? Я пробовал document.createDocumentFragment()
, но получаю сообщение об ошибке «ReferenceError: document is notdefined». Может ли кто-нибудь помочь мне, как вызвать эту функцию?
И функция возвращает nsIDOMDocumentFragment
. Как преобразовать это обратно в строку?
ОБНОВИТЬ:
Как было предложено @zer0, я использовал:
var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
var sanitizedHTML = parser.sanitize(html, flags);
Но это противоречит цели того, что я хотел сделать. Например:
<html><head><BASE href='http://localhost/t/h.html' />
<link rel="stylesheet" type="text/css" href="h.css">
<style type="text/css">
.b{
color:green;
}
</style>
<base href="http://foo.example.com/">
</head><body>Sample Text. No Style
<script>Hello malicious code</script>
<p class="a">External Style</p>
<p class="b">Internal Style</p>
<p style="color:blue">Inline Style</p>
<a href="sample.html">Link</a><br><br><div style='color: #666666; font-size: 12px'>Clipped on 6-October-2012, 07:37:39 PM from <a href='http://localhost/t/h.html'>http://localhost/t/h.html</a> </div></body></html>
Преобразуется в:
<html><head>
<style type="text/css">
.b{
color:green;
}
</style>
</head><body>Sample Text. No Style
<p class="a">External Style</p>
<p class="b">Internal Style</p>
<p style="color:blue">Inline Style</p>
<a>Link</a><br><br><div style="color: #666666; font-size: 12px">Clipped on 6-October-2012, 07:37:39 PM from <a href="http://localhost/t/h.html">http://localhost/t/h.html</a> </div></body></html>
Поскольку это удаляет внешние гиперссылки и CSS, это противоречит цели самой надстройки. Я хочу, чтобы были удалены только сценарии:
<html><head><BASE href='http://localhost/t/h.html' /> <BASE href='http://localhost/t/h.html' />
<link rel="stylesheet" type="text/css" href="h.css">
<style type="text/css">
.b{
color:green;
}
</style>
<base href="http://foo.example.com/">
</head><body>Sample Text. No Style
<p class="a">External Style</p>
<p class="b">Internal Style</p>
<p style="color:blue">Inline Style</p>
<a href="sample.html">Link</a><br><br><div style='color: #666666; font-size: 12px'>Clipped on 6-October-2012, 07:37:39 PM from <a href='http://localhost/t/h.html'>http://localhost/t/h.html</a> </div></body></html>
Может ли кто-нибудь пролить свет на это?