【问题标题】:A potentially dangerous Request.Form value after removing dangerous data with JavaScript使用 JavaScript 删除危险数据后的潜在危险 Request.Form 值
【发布时间】: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, '&lt;');
    tb.value = tb.value.replace(/>/g, '&gt;');

    // 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 方法,但是在它开始运行之前就引发了异常。

我还尝试将 &amp;lt; 替换为 &amp;l; 并将 &amp;gt; 替换为 &amp;g; 以防与我的替换有关,但这也无济于事。

有什么想法可以在不禁用请​​求验证的情况下解决此问题吗?

编辑:似乎其中一个问题是我没有意识到由于我使用 CKEditor(我不相信这会影响这一点),我需要访问文本以不同的方式。

而不是上面的方法,我必须将其更改为以下内容才能正确地将文本从控件中取出:

var tb = CKEDITOR.instances[formId];
if (tb != null) {
    var newText = tb.getData();

之后更新文本也是如此,这需要与tb.setData(newText); 合二为一

【问题讨论】:

  • 感谢@abhitalks 的链接,但不幸的是,我试图避免这种情况,因为它仍然有助于进行请求验证。如果管理员最终确实放置了其他可能被标记为危险的东西,我仍然希望将其标记,只是在它类似于

    的情况下我不希望它被标记。

标签: javascript asp.net


【解决方案1】:

您还需要转义与号和引号。这个 javascript 函数对我有用:

function htmlEscape(s) {
    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;')
        .replace(/>/g, '&gt;').replace(/"/g, '&quot');
}

【讨论】:

  • 我正在测试的文本没有这些字符,但为了安全起见,我试了一下。不幸的是,我仍然遇到同样的问题。例如,如果我将输入设置为 &lt;h2&gt;ABC&lt;/h2&gt; 我得到错误:A potentially dangerous Request.Form value was detected from the client (ctl00$body$UITextElement1$txtEditor="&lt;h2&gt;ABC&lt;/h2&gt; ").
  • OnClick 似乎没有等待 OnClientClick。您可以尝试在转义完成后让您的 javascript 函数返回 true(在 try catch 中返回 false),然后通过 OnClientClick="return encode(txtId, formId)" 调用它。这样 OnClick 应该只在 javascript 函数完成并返回 true 后触发。
  • 这似乎已经对它进行了排序,以及我之前错过的其他内容。非常感谢!
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 2010-12-25
  • 2011-06-21
  • 2011-07-23
  • 2011-03-30
相关资源
最近更新 更多