我需要匹配所有这些开始标记:
<p>
<a href="foo">
Run Code Online (Sandbox Code Playgroud)
但不是这些:
<br />
<hr class="foo" />
Run Code Online (Sandbox Code Playgroud)
我想出了这个,并希望确保我做对了.我只抓住了a-z.
<([a-z]+) *[^/]*?>
Run Code Online (Sandbox Code Playgroud)
我相信它说:
/,然后我有这个权利吗?更重要的是,你怎么看?
我有这样的文字:
<span>My text</span>
Run Code Online (Sandbox Code Playgroud)
我想显示没有标签:
My text
Run Code Online (Sandbox Code Playgroud)
我也不想应用标签,我想剥离它们.有什么简单的方法可以做到这一点?
Angular html:
<div>{{myText | htmlToPlaintext}}</div>
Run Code Online (Sandbox Code Playgroud) 知道如何在node.js应用程序上防止XSS攻击?在那里处理删除hrefs中的javascript,onclick属性等的任何lib.从POSTed数据?
我不想为所有那些写一个正则表达式:)
有什么建议?
我正在寻找一个用JavaScript编写的简单HTML清理程序.它不需要100%XSS安全.
我正在我的网站上实现Markdown和WMD Markdown编辑器(来自github的SO主分支).问题是,实时预览中显示的HTML不会被过滤,就像在SO上一样.我正在寻找一个用JavaScript编写的简单/快速HTML清理程序,以便我可以过滤预览窗口的内容.
无需具有完整XSS保护的完整解析器.我不是将输出发送回服务器.在将结果存储到数据库之前,我将Markdown发送到我使用正确的完整HTML清理程序的服务器.
谷歌对我来说绝对没用.我只收到数百条(通常是不正确的)文章,介绍如何从各种服务器端语言的用户生成的HTML中过滤掉javascript.
UPDATE
我会更好地解释为什么我需要这个.我的网站有一个非常类似于StackOverflow上的编辑器.有一个文本区域可以输入MarkDown语法,下面有一个预览窗口,可以显示提交后它的样子.
当用户提交某些内容时,它将以MarkDown格式发送到服务器.服务器将其转换为HTML,然后在其上运行HTML清理程序以清理HTML.MarkDown允许任意HTML,所以我需要清理它.例如,用户输入如下内容:
<script>alert('Boo!');</script>
Run Code Online (Sandbox Code Playgroud)
MarkDown转换器不会触及它,因为它是HTML.HTML清理程序将删除它,以便脚本元素消失.
但这不是预览窗口中发生的情况.预览窗口仅将MarkDown转换为HTML,但不会对其进行清理.因此,预览窗口将具有脚本元素.这意味着预览窗口与服务器上的实际呈现不同.
我想解决这个问题,所以我需要一个快速而又脏的JavaScript HTML清理程序.使用基本元素/属性黑名单和白名单的简单方法就可以了.它不需要是XSS安全的,因为XSS保护是由服务器端的HTML清理程序完成的.
这只是为了确保预览窗口在99.99%的时间内与实际渲染相匹配,这对我来说已经足够了.
你能帮我吗?提前致谢!
问题确实出现在这个问题上:
为什么浏览器会修改包含的HTML元素的ID?
鉴于以下网页:
<html>
<head>
<script type="text/javascript">
// --------------------------------------------------------
// could calling this method produce an XSS attack?
// --------------------------------------------------------
function decodeEntity(text){
text = text.replace(/<(.*?)>/g,''); // strip out all HTML tags, to prevent possible XSS
var div = document.createElement('div');
div.innerHTML = text;
return div.textContent?div.textContent:div.innerText;
}
function echoValue(){
var e = document.getElementById(decodeEntity("/path/$whatever"));
if(e) {
alert(e.innerHTML);
}
else {
alert("not found\n");
}
}
</script>
</head>
<body>
<p id="/path/$whatever">The Value</p>
<button onclick="echoValue()">Tell me</button>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在id该的<p>元素包含以防止XSS攻击了逃脱字符.HTML部分和JS部分由服务器生成,服务器在两个部分上插入相同的转义值(可能来自不安全的源).
服务器以下列&#x格式转义以下字符范围: …
我有一个要防止 XSS 的 Express 应用程序。
我将一些关于 XSS 的页面(包括OWASP的页面)改成了红色,鉴于我的应用程序特性,我决定编写一个中间件,<>"'在我在路由中使用请求参数之前,对 HTML 实体(更准确地说是 XML 实体,包括)进行编码。
我还在连接时刷新会话 cookie,以防止 cookie 被盗。
我如何构建我的应用程序
我的感受
我的结论是,通过这种行为(在外部数据到来时清理它们),我避免了所有存储和反射的 XSS,并且正确使用 windows.location 可以防止我对抗基于 DOM 的 XSS。
这个结论是对的,还是我忘记了什么?我还应该使用一些头盔功能吗?
编辑
我的问题不是什么是最好的 HTML sanitizer 服务器端(即使它是它的一部分),我更想知道我在代码中放置的保护措施是否可以保护我的应用程序免受所有众所周知的 XSS 类型的侵害。特别是我会知道我的中间件是否不是一个坏习惯。
假设我复制了一些“恶意”输入,例如带有事件处理程序或其他 JavaScript 的 DOM 节点
<img src="bunny.jpg" onload="alert('hi');">
Run Code Online (Sandbox Code Playgroud)
如果我将其复制到剪贴板并将其粘贴到contenteditablediv 中,则事件处理程序将被干净地删除。
<img src="/Users/tjhance/Desktop/bunny.jpg">
Run Code Online (Sandbox Code Playgroud)
我现在可以随心所欲地操纵这个 DOM 节点了。到目前为止还不错。
另一方面,假设我想挂钩浏览器的粘贴事件并以我自己的方式处理粘贴。我可以轻松获取剪贴板数据:
<div contenteditable="true" id="myContentEditableDiv"></div>
<script>
$('#myContentEditableDiv').on('paste', function(event) {
console.log(event);
var pastedHtml = event.originalEvent.clipboardData.getData('text/html');
console.log(pastedHtml);
});
</script>
Run Code Online (Sandbox Code Playgroud)
当我粘贴时,我得到了 HTML
<meta charset='utf-8'><img src="/Users/tjhance/Desktop/bunny.jpg" onload="alert('hi');" style="color: rgb(0, 0, 0); font-family: Times; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;">
Run Code Online (Sandbox Code Playgroud)
它未经消毒,并且仍然具有事件侦听器。据我所知,我无法用这个字符串做任何事情。我无法使用浏览器将其解析为 HTML,因为它会运行 JavaScript,这是一个巨大的安全漏洞。
很明显,浏览器具有一定的清理 HTML 的功能,因为它是在粘贴时执行的。因此,如果我想要干净的 HTML,我可以等待事件完成并将 …
我有一个脚本,允许替换不需要的HTML标签和转义引号来"提高"安全性,并主要防止脚本标记和onload注入等....这个脚本用于"纹理化"从中检索的内容innerHTML.
但是,它在我的执行时间附近乘以3(在循环中).我想知道是否有更好的方法或更好的正则表达式:
function safe_content( text ) {
text = text.replace( /<script[^>]*>.*?<\/script>/gi, '' );
text = text.replace( /(<p[^>]*>|<\/p>)/g, '' );
text = text.replace( /'/g, '’' ).replace( /'/g, '’' ).replace( /[\u2019]/g, '’' );
text = text.replace( /"/g, '”' ).replace( /"/g, '”' ).replace( /"/g, '”' ).replace( /[\u201D]/g, '”' );
text = text.replace( /([\w]+)=&#[\d]+;(.+?)&#[\d]+;/g, '$1="$2"' );
return text.trim();
};
Run Code Online (Sandbox Code Playgroud)
编辑:这里有一个小提琴:https://fiddle.jshell.net/srnoe3s4/1/.小提琴script显然不喜欢javascript字符串中的标签所以我没有添加它.
例如我有这样的html:
\n\n<title>Ololo - text\xe2\x80\x99s life</title><div class="page-wrap"><div class="ng-scope"><div class="modal custom article ng-scope in" id="new-article" aria-hidden="false" style="display: block;"><div class="modal-dialog first-modal-wrapper">< div class="modal-content"><div class="modal-body full long"><div class="form-group">olololo<ul style="color: rgb(85, 85, 85);background-color: rgb(255, 255, 255);"><li>texttext</li><li>Filter the events lists by host.</li><li>Create graphs for separate hosts and for the groups of hosts.</li></ul><p style="color: rgb(85, 85, 85);background-color: rgb(255, 255, 255);">bbcvbcvbcvbcvbcvbcvbcvb</p></div></div></div></div></div></div><title>cvbcbcvbcvbcvbccb</title><div class="page-wrap"></div></div>\nRun Code Online (Sandbox Code Playgroud)\n\n我怎样才能从这样的html中删除所有样式类id等?
\n\n我有这样的正则表达式:
\n\n/<([a-z][a-z0-9]*)[^>]*?(\\/?)>/i\nRun Code Online (Sandbox Code Playgroud)\n\n怎么了?如何借助正则表达式删除所有html属性?
\n\n这是小提琴:
\n\n\njavascript ×6
html ×5
regex ×3
xss ×3
node.js ×2
angularjs ×1
copy-paste ×1
express ×1
replace ×1
sanitization ×1
sanitize ×1
wmd ×1
xhtml ×1