javascript - 无法清除跨站点脚本
问题描述
为了防止在输入字段中输入恶意 html/脚本并保存在我们的应用程序中,我们正在检查用户输入的 html,如果发现,我们不会提交。
我们使用以下函数执行此操作
/**
* Parse for HTML elements to avoid cross-site scripting
* @param str
*/
function isHTML() {
var str = $("#AttributeInstance").val();
var htmltempElement = document.createElement('div');
htmltempElement.innerHTML = str;
for (var c = htmltempElement.childNodes, i = c.length; i--;) {
if (c[i].nodeType == 1) {
htmltempElement = null;
str = null;
return true;
}
}
return false;
}
该功能运行良好。例如,如果在我们的表单上,用户输入以下内容
<img src=a onerror=alert(1)>
该函数返回 true,我们不保存该值。
这是我们如何调用这个函数
if (isHTML()) {
alert("Found HTML! Stop!");
instance = "";
$("#AttributeInstance").val(""); //clear the input field
}
else {
alert("No HTML! Continue");
alert(instance);
addKpi(group, name, instance, instanceSelection);
}
alert("Finished");
现在问题来了。此代码会导致“找到 HTML!停止!”的警报。然后显示“完成”。
但随后我们也会收到“1”的警报,它来自包含脚本的原始输入值。至此,该字段已被清除,我们没有将恶意脚本值存储在任何地方,但是,即使它被清楚地检测到并且我们停止处理,它也会将其作为消息弹出。
有任何想法吗?或任何建议如何更好地检测输入字段中的跨站点脚本值?
如果我们从函数中删除以下内容
htmltempElement.innerHTML = str;
for (var c = htmltempElement.childNodes, i = c.length; i--;) {
if (c[i].nodeType == 1) {
htmltempElement = null;
str = null;
return true;
}
}
然后脚本不会弹出“1”有一些关于以这种方式检查脚本的方法,最终处理看起来的脚本。
解决方案
推荐阅读
- mysql - 无法弄清楚将集合插入到 tablr 中的查询
- python - 在 Python 中填充聚合列
- svg - 在svg中的矩形周围添加同心线
- python - 如何以高 FPS 记录我的电脑屏幕?
- elasticsearch - Kibana 中的 % 计算似乎不正确
- python - 如何在 python 中为 sigmoid 函数删除这些循环
- python - Discord.py int 没有属性 send
- loops - 将 2 个动态长度数组添加到第 3 个数组
- spring-cloud-dataflow - 如何删除 Spring Cloud Data Flow 应用程序属性?
- python - 将eos发送到管道后无法保存mp4视频