使用JavaScript删除危险数据后的潜在危险Request.Form值

时间:2014-01-17 11:19:39

标签: javascript asp.net

我目前正在使用自定义控件在页面上显示文本,然后允许管理员在同一点通过弹出对话框编辑此文本。然后管理员使用的对话框允许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方法,但是在开始运行之前就引发了异常。

我还尝试将&lt;替换为&l;,将&gt;替换为&g;,以防万一与我的替换有关,但这也没有帮助。

关于如何在不禁用请​​求验证的情况下解决此问题的任何想法?

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

与上述方法不同,我必须将其更改为以下内容才能正确地从控件中获取文本:

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

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

的文本

1 个答案:

答案 0 :(得分:1)

你也需要逃避&符号和引号。这个javascript函数适合我:

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