【发布时间】:2014-01-17 22:07:28
【问题描述】:
我目前正在使用自定义控件在页面上显示文本,然后允许管理员同时通过弹出对话框编辑此文本。管理员随后使用的对话框允许 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 方法,但是在它开始运行之前就引发了异常。
我还尝试将 &lt; 替换为 &l; 并将 &gt; 替换为 &g; 以防与我的替换有关,但这也无济于事。
有什么想法可以在不禁用请求验证的情况下解决此问题吗?
编辑:似乎其中一个问题是我没有意识到由于我使用 CKEditor(我不相信这会影响这一点),我需要访问文本以不同的方式。
而不是上面的方法,我必须将其更改为以下内容才能正确地将文本从控件中取出:
var tb = CKEDITOR.instances[formId];
if (tb != null) {
var newText = tb.getData();
之后更新文本也是如此,这需要与tb.setData(newText); 合二为一
【问题讨论】:
-
感谢@abhitalks 的链接,但不幸的是,我试图避免这种情况,因为它仍然有助于进行请求验证。如果管理员最终确实放置了其他可能被标记为危险的东西,我仍然希望将其标记,只是在它类似于 的情况下我不希望它被标记。
标签: javascript asp.net