我要求用户可以在ASP.NET TextBox中输入HTML标记。文本框的值将保存在数据库中,然后我们需要显示它
在其他一些页面上他输入了什么。为此,我在Page指令上设置ValidateRequest="false"
。
现在的问题是,当用户输入的内容如下:
<script> window.location = 'http://www.xyz.com'; </script>
现在它的值保存在数据库中,但是当我在其他页面中显示其值时,它会将我重定向到"http://www.xyz.com"
,这很明显
随着javascript捕获它。但我需要找到一个解决方案,因为我需要准确显示他输入的内容。
我在考虑Server.HtmlEncode。你能引导我指明我的要求吗
答案 0 :(得分:1)
在将输出输出回用户之前,您需要对所有输入进行编码,并且可以考虑实施基于白名单的方法来确定允许用户提交的HTML类型。
我建议使用白名单方法,因为编写规则以允许p,br,em,strong,a(例如)更容易,而不是尝试识别各种恶意输入并将其列入黑名单。
可能考虑使用MarkDown(在StackOverflow上使用)而不是允许纯HTML吗?
答案 1 :(得分:1)
始终始终始终对用户的输入进行编码,然后才会在数据库中保留。您可以通过
轻松实现这一目标Server.HtmlEncode(userinput)
现在,当需要向用户显示内容时,解码用户输入并将其放在屏幕上:
Server.HtmlDecode(userinput)
答案 2 :(得分:0)
您需要在生成HTML时转义一些字符:'<' -> <
,'>' -> >
,'&' -> &
。这样您就可以准确显示用户输入的内容,否则HTML解析器可能会识别HTML标记并执行它们。
答案 3 :(得分:0)
您是否尝试在所有输入上使用HTMLEncode
?我个人使用在提交字符之前转义字符的Telerik RadEditor ......这样系统就不会对异常进行限制。
这是同一行的SO question。
答案 4 :(得分:0)
您应该查看由于您所描述的漏洞而不想支持的HTML tags,例如
脚本
IMG
IFRAME
小应用程序
对象
嵌入
表单,按钮,输入
并替换前导“&lt;”通过“&amp; lt;”。
同时替换&lt; /体&GT;和&lt; / HTML&GT;
像CKEditor这样的HTML编辑器允许您需要格式良好的XHTML,并且define tags可以从输入中排除。