Sometimes, we have to do some fixing to insert a string into an HTML property. Or just to display it.
But not everything is safe! Consider the following example:
document.getElementById('name').innerHTML = prompt('What is your name?');
This allows to introduce HTML vulnerabilities quite easily. Specially when you want to do HTML > X/HTML conversions.
So, I've came up with the following:
var safetext = function(text){
var div = document.createElement('div');
div.innerText = div.textContent = text;
var safetext = div.innerHTML;
div = null;
return safetext.replace(/^\s+|\s+$/g, '');
};
But then I realized that it could be optimized a little. That div
is created and destroyed every single time you need a cleanup. So, I've optimized to the following:
var safetext = (function(text){
this.innerText = this.textContent = text;
return this.innerHTML.replace(/^\s+|\s+$/g, '');
}).bind(document.createElement('div'));
The this
will always be the div
we created, and will always be the same one, so, no unnecessary cleanups or anything. It is always kept in memory, since it is bound to the this
in the anonymous function. Or isn't it?
The resulting text is a string that is safe to use in your HTML. Using the example from before:
document.getElementById('name').innerHTML = safetext(prompt('What is your name?'));
This should show <script>
if your name (for some bizarre reason) is <script>
. Or it leaves unsafe characters behind, bound to break everything?
To the best of my knowledge, and based on the 200 tests where I've used it, I didn't had a single problem or hiccup.
Am I missing something? Is my code indeed returning safe HTML strings? Is the 2nd iteration really more performant?
<this>
and break the whole output. I'm re-implementing an HTML > Excel XML convertion function. Also, I haven't found any library, so far, to do this. Most of what I've found is a.replace
with a huge object with all entities, some weird replace or some close form of what I've presented (which I wasn't aware that is very used!). If you know of any library, I'm glad to check it. \$\endgroup\$