Скорошното ми изпращане за сайт за добавки за Firefox (базиран на Firefox Add-on SDK 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: документът не е дефиниран“. Може ли някой да ми помогне как да извикам тази функция?
И функцията връща 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="/bgh.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="/bgsample.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="/bgh.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="/bgsample.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>
Може ли някой да хвърли малко светлина върху това?