Redis存储a标签取出丢失闭合标签?StackExchange.Redis取值问题排查
结论
- 可以100%确定Redis不会随机截断你的哈希键值对中的a标签闭合部分,StackExchange.Redis的HashSet/HashGet方法也没有针对HTML内容做特殊截断的逻辑,你的问题出在ASP.NET Web Forms的输出过滤环节。
你在GUI工具中能看到Redis存储的内容完整,就已经排除了Redis和客户端库的问题。你遇到的无法拼接</a>、标签被截断的情况,是ASP.NET默认的XSS防护机制和Literal控件的默认渲染逻辑导致的:
- 默认情况下Literal控件的
Mode为Transform,会自动修正或移除它认为不规范的HTML内容 - ASP.NET运行时默认开启请求验证和输出过滤,会自动移除疑似恶意注入的HTML片段,单独的
</a>标签会被判定为可疑内容直接过滤。
解决方案
方案1:修改Literal控件渲染模式(优先推荐)
直接在aspx页面的Literal控件声明中添加Mode="PassThrough"属性,该模式下控件会原样输出你赋值的HTML内容,不会做任何修改:
<asp:Literal ID="uxLink1" runat="server" Mode="PassThrough"></asp:Literal>
也可以在后端代码中赋值前指定模式:
Link1 = cache.HashGet(finalUrl, "sidebar:link1"); this.uxLink1.Mode = LiteralMode.PassThrough; this.uxLink1.Text = Link1;
方案2:调整页面验证规则
如果修改Mode后仍然有问题,可以在当前页面的Page头部指令中添加ValidateRequest="false",关闭当前页面的请求验证:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="xxx.aspx.cs" Inherits="xxx.xxx" ValidateRequest="false" %>
注意:不要全局关闭请求验证,仅在有可信HTML输出需求的单页面开启即可,避免引入XSS风险。
方案3:更安全的存储逻辑优化(长期推荐)
不要将完整HTML标签存入Redis,仅存储链接地址和标题文本,后端拼接后再输出,既可以避免过滤问题,也能降低存储成本和XSS风险:
// 存数据时拆分存储 cache.HashSet(finalUrl, "sidebar:link1_url", "exampleurl.com"); cache.HashSet(finalUrl, "sidebar:link1_title", "title"); // 取数据时拼接HTML var url = cache.HashGet(finalUrl, "sidebar:link1_url"); var title = cache.HashGet(finalUrl, "sidebar:link1_title"); this.uxLink1.Mode = LiteralMode.PassThrough; this.uxLink1.Text = $"<a href=\"{url}\">{title}</a>";
内容的提问来源于stack exchange,提问作者jmath412
相关产品推荐
相关产品推荐

