我目前正在使用自定义控件在页面上显示文本,然后允许管理员在同一点通过弹出对话框编辑此文本。然后管理员使用的对话框允许HTML输入,以便管理员可以格式化文本。当提交时,我得到标准错误:
A potentially dangerous Request.Form value was detected from the client
(ctl00$body$UITextElement1$txtEditor="<h2>Example</h2>")
我知道我可以通过禁用请求验证来解决这个问题,但是因为我使用它作为我希望能够在整个网站上放置的控件,我真的不想禁用此验证全面。
我试图通过将其添加到控件来解决这个问题:
<asp:Panel ID="UITextEditor" runat="server">
<div runat="server" ID="panelcontent">
<textarea runat="server" id="txtEditor" class="ckeditor"></textarea>
</div>
<div id="panelfooter">
<asp:Button ID="CancelButton" runat="server" Text="Cancel" />
<asp:Button ID="SaveButton" runat="server" Text="Save" CommandName="SaveUIText" OnClick="SaveButton_Click" OnClientClick='<%# string.Format("encode(\"{0}\", \"{1}\")", this.txtEditor.Name, this.txtEditor.ClientID) %>' />
</div>
</asp:Panel>
除了这个JavaScript方法,删除有问题的字符:
function encode(txtId, formId) {
var tb = document.getElementById(formId);
if (tb != null) {
tb.value = tb.value.replace(/</g, '<');
tb.value = tb.value.replace(/>/g, '>');
// Try changing the form data as well
// in case this is being passed by unmodified
var form = document.forms[0];
if (form != null) {
form.elements[txtId].value = tb.value;
}
}
}
然而,即便如此,错误仍然存在。 JavaScript方法正在运行,并且正在修改textarea和表单数据的值,但是当提交继续时,错误仍会显示原始文本。我也检查了SaveButton_Click
方法,但是在开始运行之前就引发了异常。
我还尝试将<
替换为&l;
,将>
替换为&g;
,以防万一与我的替换有关,但这也没有帮助。
关于如何在不禁用请求验证的情况下解决此问题的任何想法?
编辑:似乎其中一个问题是我没有意识到由于我使用CKEditor(我不相信会影响这一点),我需要访问文本以不同的方式。
与上述方法不同,我必须将其更改为以下内容才能正确地从控件中获取文本:
var tb = CKEDITOR.instances[formId];
if (tb != null) {
var newText = tb.getData();
之后更新文本也是如此,这需要是tb.setData(newText);
答案 0 :(得分:1)
你也需要逃避&符号和引号。这个javascript函数适合我:
function htmlEscape(s) {
return s.replace(/&/g, '&').replace(/</g, '<')
.replace(/>/g, '>').replace(/"/g, '"');
}