我有一个编辑器,允许用户添加存储在数据库中并在网页上呈现的HTML.由于这是不受信任的输入,我打算Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment用来清理HTML.
官方 Angular安全指南谈到了 4 个安全上下文:HTML, Url, Style and Resource Url.
每个人都负责清理相应类型的资源。
另外,DomSanitizer服务中有 5 个方法(每个资源类型)
- bypassSecurityTrustHtml
- bypassSecurityTrustScript
- bypassSecurityTrustStyle
- bypassSecurityTrustUrl
- bypassSecurityTrustResourceUrl
Run Code Online (Sandbox Code Playgroud)
但是,我没有SecurityContext.NONE在官方文档中找到任何提及。它确实存在于代码中。
我假设它聚合了所有资源类型,这意味着被清理的资源可以是 HTML,其中包含样式和脚本。
是这样吗?有官方消息吗?
dom sanitization html-sanitizing angular angular-dom-sanitizer
我有应用程序,客户可以存储以下html行,以便为实际浏览器加载不同的样式:
<!--[if IE 6]><link rel="stylesheet" type="text/css" media="all" href="default/css/general_ie6.css"><![endif]-->
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="all" href="default/css/general_ie7.css"><![endif]-->
<!--[if IE 8]><link rel="stylesheet" type="text/css" media="all" href="default/css/general_ie8.css"><![endif]-->
Run Code Online (Sandbox Code Playgroud)
此外,我已配置OWASP policy为以下列方式禁止恶意html标记:
new HtmlPolicyBuilder().allowElements("link").allowAttributes("rel", "type", "media", "href").onElements("link").toFactory();
Run Code Online (Sandbox Code Playgroud)
但在卫生设施if browser lines被取消后.
您能否建议如何配置策略以便存储此类内容?
我从html代码的API字符串获取,其中可能包含来自以下服务的嵌入视频:
如果我确定它足够安全,我可以将它们转换为可信的SafeHtml(绕过Angular的消毒剂):
this.safeHtml = this._sanitizer.bypassSecurityTrustHtml(this.htmlFromApi);
Run Code Online (Sandbox Code Playgroud)
然后将它放在这样的页面上:
<div [innerHtml]="safeHtml"></div>
Run Code Online (Sandbox Code Playgroud)
问题:
我必须执行哪些检查才能确保此字符串足够安全?(它不包含嵌入式脚本,只导致这四个站点中的一个没有任何棘手的重定向)?
以某种方式将这些网站添加到Angular的消毒剂的例外中是否有意义?如果是的话怎么做?
提前致谢!
ps我看到了类似的问题:如何检查HTML字符串是否安全? 但我希望Angular最佳实践有一些更新鲜和相关的东西
当我得到警告时:
“警告:清理HTML会剥离一些内容”
我进行了一些研究,发现人们使用下面的管道或看起来像下面的管道
import { Pipe, PipeTransform } from "@angular/core";
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Pipe({
name: 'sanitizeHtml'
})
export class SanitizeHtmlPipe implements PipeTransform {
constructor(private _sanitizer:DomSanitizer) { }
transform(v:string):SafeHtml {
return this._sanitizer.bypassSecurityTrustHtml(v);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,即使我实现这样的管道,我仍然会遇到相同的错误:
<span [innerHTML]="specialist.blocks[0].paragraph.html | sanitizeHtml"></span>
<p [innerHTML]="package.fields.remarks | sanitizeHtml"></p>
<li [innerHTML]="package.fields.name | sanitizeHtml"></li>
Run Code Online (Sandbox Code Playgroud)
所以我想知道我是错误地实现了管道还是还有其他原因导致管道不起作用?
编辑:
的示例specialist.blocks[0].paragraph.html:
“ <div id =” test“ class =” test“> \ n <h3> NAME专家名单</ h3> \ n <p>随机文本</ p> </ div> \ n </ div>”
的示例package.fields.remarks …
我们正在构建一个用户生成的内容网站,我们希望用户可以在其中嵌入视频,幻灯片等内容......任何人都可以推荐一个普遍接受的标签/属性列表,以便在轨道清理中提供给我们相当不错的安全性,同时仍然允许大量的可嵌入内容/ HTML格式?
我希望能够接受来自不受信任的用户的HTML并对其进行清理,以便我可以安全地将其包含在我网站的页面中.我的意思是标记不应该被剥离或逃过一劫,但应该通过基本保持不变,除非它包含危险的标记,如传递<script>或<iframe>危险属性,如onload,或危险的CSS属性,如背景的URL.(显然一些较旧的IE会在CSS中执行javascript URL吗?)
从iframe中包含的不同域提供内容不是一个好选择,因为没有办法事先告诉iframe有多高,所以对于某些页面来说总是看起来很难看.
我查看了HTML Purifier,但看起来它还不支持HTML5.我也研究了Google Caja,但我正在寻找一种不使用脚本的解决方案.
有谁知道一个可以实现这个目标的图书馆?PHP是首选,但乞丐不能选择.
我正在使用Jsoup和轻松的白名单.它似乎很完美,但我想保持嵌入的图像标签<img alt="" src="data:;base64.
有没有办法修改白名单也接受那些img?
编辑:
如果我使用Whitelist.relaxed().addProtocols("img","src","data")那么那些img标签不会被删除.但它接受"data:"之后的任何内容,如果src内容以"data:; base64"开头,我想保留它们.jsoup有可能吗?
我们发现 angular-sanitize 会“清理”北欧字母表的字符并将它们变成 HTML 实体。因此,每次您在 INPUT 中输入ä字符并 $sanitize 您的输入时,您最终都会得到经过消毒的字符串,这些字符串将这些字符替换为其他内容(ä ;),这会破坏输入,因为稍后我想显示该字符串或发送它到服务器。似乎用户输入了“ä”而不是“ä”。我们像往常一样在 UTF8 中工作,所以我们不需要这个。
目前我们有一个这样的解决方案(应用程序是我们的角度应用程序):
app.config(function($provide){
// Prevent $sanitize from converting nordic special characters (ö, ä, å) into HTML entities
// ----------------------------------------------------------------------------------------
// We don't have need for sanitizing umlauts.
$provide.decorator("$sanitize", function($delegate, $log){
return function(text, target){
var result = $delegate(text, target);
result = result
.replace(/ä|ä/g, 'ä')
.replace(/Ä|Ä/g, 'Ä')
.replace(/ö|ö/g, 'ö')
.replace(/Ö|Ö/g, 'Ö')
.replace(/å|å/g, 'å')
.replace(/Å|Å/g, 'Å');
return result;
};
});
});
Run Code Online (Sandbox Code Playgroud)
但是我怀疑通过告诉 $sanitize 一些选项可能有更好的方法来实现这一点。我很欣赏如何更好地做到这一点的建议。
我有什么
我正在使用Angular 2构建个人博客应用。我的JSON文件中包含博客文章,该文件由服务器提供。
// Single post route
apiRouter.route("/post/:id")
// Get a specific post
.get((req: express.Request, res: express.Response) => {
let post = blogData.posts.find(post => post.date === Number(req.params.id));
res.json(post);
})
);
Run Code Online (Sandbox Code Playgroud)
JSON博客数据文件中的各个条目如下所示:
"posts": [
{
"title": "Some Post's Title",
"body": "Some post's body.",
"date": 1481582451092,
"headerImageName": ""
},
{ ... }, ...
]
Run Code Online (Sandbox Code Playgroud)
在我的Web应用程序中,我希望有一个“博客帖子”打字稿组件,当访客在映射到单个帖子的路线上时显示一个单独的帖子。
我定义了一个简单的post数据类,如下所示:
export class PostData {
body: string;
date: number;
imageFileName: string;
title: string;
}
Run Code Online (Sandbox Code Playgroud)
显示帖子正文时,我将其通过此管道传递:
@Pipe({
name: "trustPipe"
})
export class TrustPipe implements PipeTransform {
constructor(@Inject(DomSanitizer) private …Run Code Online (Sandbox Code Playgroud) html-sanitizing ×10
angular ×4
sanitization ×4
html ×2
java ×2
xss ×2
angular5 ×1
angularjs ×1
asp.net ×1
dom ×1
embed ×1
html5 ×1
jsoup ×1
ngsanitize ×1
owasp ×1