如果存储在 SQL 服务器中,哪些 HTML 标签会被认为是危险的?
What HTML tags would be considered dangerous if stored in SQL Server?
正在考虑 CSRF、XSS、SQL 注入等问题...
站点:ASP.net、SQL Server 2012
我正在阅读来自 MS 的旧页面:https://msdn.microsoft.com/en-us/library/ff649310.aspx#paght000004_step4
如果我有一个参数化查询,并且我的字段之一用于保存 HTML,对某些标签进行简单替换是否可以解决问题?
例如,用户可以在 WYSIWYG 文本区域中键入内容,将某些内容设为粗体,或创建项目符号等。
我希望能够显示 SELECT 查询的结果,所以即使我对它进行了 HTML 编码,它也必须进行 HTML 解码。
在场景列表中循环的 UDF 怎么样?我很好奇处理该页面上提到的那些看似鬼鬼祟祟的问题的最佳方法:
引用:
攻击者可以使用 HTML 属性,如 src、lowsrc、style 和 href 与上述标记一起注入跨站点脚本。例如标签的src属性可以作为注入源,如下例所示。
<img src="javascript:alert('hello');">
<img src="java
script:alert('hello');">
<img src="java
script:alert('hello');">
攻击者还可以使用 <style>
标记通过更改 MIME 类型来注入脚本,如下所示。
<style TYPE="text/javascript">
alert('hello');
</style>
所以最后两个问题:
- 从 INSERT 语句本身内部处理此问题的最佳方法。
- 从代码隐藏处理这个问题的最佳方法。
- Best way to deal with this from within the INSERT statement itself.
None。那不是你应该做的地方。
- Best way to deal with this from code-behind.
使用白名单,而不是黑名单。 HTML 对所有内容进行编码,然后对允许的特定标签进行解码。
能够指定一些可以安全使用的标签是合理的,但是能够捕获所有可能的漏洞利用是不合理的。
What HTML tags would be considered dangerous if stored in SQL Server?
None。 SQL 服务器不理解,也不尝试解释 HTML 标签。 HTML 标签只是文本。
但是,如果输出到 HTML 页面,HTML 标签可能会很危险,因为它们可以包含脚本。
如果您希望用户能够输入富文本,应考虑以下方法:
- 允许用户(或他们正在使用的编辑器)生成 BBCode,而不是直接生成 HTML。当您输出他们的 BBCode 标记时,您将任何可识别的标签转换为 HTML 没有包含脚本的属性,并将任何 HTML 转换为实体(
&
到 &
,等等)。
- 结合内容安全策略,使用 tried and tested HTML sanitizer 从存储的输入中删除 "unsafe" 标记。你 必须 两者都做,否则消毒剂中的任何间隙(并且会有间隙)都可能允许攻击,而且并非所有浏览器都完全支持 CSP (IE)。
请注意,这些都应该在输出点完成。将文本 "as is" 存储在您的数据库中,在输出到页面时只需对正确的格式进行编码和处理。
在将任何字符串填充到 SQL 之前,在客户端和服务器上清理 html。
客户端:
TinyMCE - 自动执行此操作
CKEditor - 自动执行此操作
服务器端:
使用 Node 或您选择的 language/platform 很容易做到这一点。
上面的 link 显示 www.realwebsite.com,而实际上它会将您带到 www.dangerouswebsite.com...
<a '
href="https://www.dangerouswebsite.com">
https://www.realwebsite.com
<'/a>
do not include the random ' in the code I put it there to bypass activating the code so you can see the code instead of just the link. (btw most websites block this or anything if you add stuff like onload="alert('TEXT')" but it can still be used to trick people into going to dangerous websites... (although its real website pops up on the bottom of your browser, some people don't check it or don't understand what it means.))
正在考虑 CSRF、XSS、SQL 注入等问题...
站点:ASP.net、SQL Server 2012
我正在阅读来自 MS 的旧页面:https://msdn.microsoft.com/en-us/library/ff649310.aspx#paght000004_step4
如果我有一个参数化查询,并且我的字段之一用于保存 HTML,对某些标签进行简单替换是否可以解决问题?
例如,用户可以在 WYSIWYG 文本区域中键入内容,将某些内容设为粗体,或创建项目符号等。
我希望能够显示 SELECT 查询的结果,所以即使我对它进行了 HTML 编码,它也必须进行 HTML 解码。
在场景列表中循环的 UDF 怎么样?我很好奇处理该页面上提到的那些看似鬼鬼祟祟的问题的最佳方法:
引用:
攻击者可以使用 HTML 属性,如 src、lowsrc、style 和 href 与上述标记一起注入跨站点脚本。例如标签的src属性可以作为注入源,如下例所示。
<img src="javascript:alert('hello');">
<img src="java
script:alert('hello');">
<img src="java
script:alert('hello');">
攻击者还可以使用 <style>
标记通过更改 MIME 类型来注入脚本,如下所示。
<style TYPE="text/javascript">
alert('hello');
</style>
所以最后两个问题:
- 从 INSERT 语句本身内部处理此问题的最佳方法。
- 从代码隐藏处理这个问题的最佳方法。
- Best way to deal with this from within the INSERT statement itself.
None。那不是你应该做的地方。
- Best way to deal with this from code-behind.
使用白名单,而不是黑名单。 HTML 对所有内容进行编码,然后对允许的特定标签进行解码。
能够指定一些可以安全使用的标签是合理的,但是能够捕获所有可能的漏洞利用是不合理的。
What HTML tags would be considered dangerous if stored in SQL Server?
None。 SQL 服务器不理解,也不尝试解释 HTML 标签。 HTML 标签只是文本。
但是,如果输出到 HTML 页面,HTML 标签可能会很危险,因为它们可以包含脚本。
如果您希望用户能够输入富文本,应考虑以下方法:
- 允许用户(或他们正在使用的编辑器)生成 BBCode,而不是直接生成 HTML。当您输出他们的 BBCode 标记时,您将任何可识别的标签转换为 HTML 没有包含脚本的属性,并将任何 HTML 转换为实体(
&
到&
,等等)。 - 结合内容安全策略,使用 tried and tested HTML sanitizer 从存储的输入中删除 "unsafe" 标记。你 必须 两者都做,否则消毒剂中的任何间隙(并且会有间隙)都可能允许攻击,而且并非所有浏览器都完全支持 CSP (IE)。
请注意,这些都应该在输出点完成。将文本 "as is" 存储在您的数据库中,在输出到页面时只需对正确的格式进行编码和处理。
在将任何字符串填充到 SQL 之前,在客户端和服务器上清理 html。
客户端: TinyMCE - 自动执行此操作 CKEditor - 自动执行此操作
服务器端: 使用 Node 或您选择的 language/platform 很容易做到这一点。
上面的 link 显示 www.realwebsite.com,而实际上它会将您带到 www.dangerouswebsite.com...
<a ' href="https://www.dangerouswebsite.com"> https://www.realwebsite.com <'/a>
do not include the random ' in the code I put it there to bypass activating the code so you can see the code instead of just the link. (btw most websites block this or anything if you add stuff like onload="alert('TEXT')" but it can still be used to trick people into going to dangerous websites... (although its real website pops up on the bottom of your browser, some people don't check it or don't understand what it means.))