【问题标题】:ajax response return html response (XSS veracode)ajax 响应返回 html 响应(XSS 验证码)
【发布时间】:2019-05-10 18:15:12
【问题描述】:
function viewAcc() {
    var errorMsg = "";
    var result = true;
    $(".errorView").hide();
    var accNum = document.getElementById('custAccNum').value;
    var accType = document.getElementById('custAccType').value;
    $("#overlayPopup").show();
    $.ajax({
        url : '<attribute:resourceURL/>',
        data : {
            "custNo" : accNum ,
            "custType" : accType 
        },
        success : function(data) {
            if (data == 'CUS_ACC') {
                window.location = "/cust/account/c";
            } else {
                $("#overlayPopup").hide();
                //display warning
                $(".errorView").show();
                $(".errorView").html(data); // <--- XSS line
                e.preventDefault();
            }
        },
        cache : false,
        dataType : 'text',
        error : function(error, textStatus, errorThrown) {
            alert('error in ajax call: ' + textStatus);
            console.log('error in ajax call: ' + textStatus);
            window.location = "/cust/account/c/lookup";
        },
        timeout : ajaxTimeOutMilliSeconds
    });

}

所以 veracode 指出我在$(".errorView").html(data); 上有问题 我该如何解决?如果我只是将它变成文本,它会像 html 一样显示在客户端上吗?

【问题讨论】:

  • 找到一种不需要 .html() 的方法。这可以通过让服务器返回文本,然后客户端将该文本包装在 html 中来完成。
  • 你的意思是把data变成文字?但是数据不是已经是文本了吗?
  • 不知道,你告诉我。它可以是文本、xml、json,很多东西都可以用字符串来表示。如果它只是没有 html、没有 html 实体等的文本,你可以换成没有缺点的 .text。
  • ` $(".errorView").text(data);` 你指的是这个吗?

标签: javascript ajax xss


【解决方案1】:

您可以简单地使用.text() 而不是.html()。如果您没有来自服务器的任何标记,那么这是一个完全可行的选择,因为.text() 将防止内容被解释为 HTML

//doing sc+ript is only needed here because Stack Snippets otherwise throws an error.
var msg = "This is <b>a message</b> with <script>console.log('some code')</sc"+"ript>";
$("#msgHtml").html(msg);
$("#msgText").text(msg);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<h3>Message via .html():</h3>
<div id="msgHtml"></div>

<h3>Message via .text():</h3>
<div id="msgText"></div>

【讨论】:

    【解决方案2】:

    不要盲目相信声称您容易受到 XSS 攻击的工具。

    只有当data 的值不可信时,您才会面临 XSS 风险。由于它来自您自己的服务器,因此您应该在将数据发送到 Ajax 请求的响应中之前已经对 XSS 问题的数据进行了清理。

    【讨论】:

    • 那我应该如何修复 veracode ?我不能只是告诉安全团队忽略它。
    • 为什么不呢?这是误报。
    • 好吧,要么是误报,要么是 &lt;attribute:resourceURL/&gt; 的服务器端代码有问题。
    • 因为它来自你自己的服务器”,这不是一个很好的可信度标准。你绝对可以有一个“恶意服务器”的场景。你可能决定此时不做任何事情,但这应该是一个有意识的决定,而不是一个既定的决定。您从 AJAX 调用获得的任何数据可能已被篡改。事实上,我在开发过程中经常这样做——我会做一个加载 mockJax 并欺骗一些端点的用户脚本。如果攻击者可以控制正在发送和接收的数据,那么您将处于危险之中。
    • 使用text() 代替html() 将停止从服务器返回的HTML 正在呈现。
    猜你喜欢
    • 2015-11-10
    • 2017-07-03
    • 2019-01-09
    • 2018-03-17
    • 1970-01-01
    • 2019-05-26
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多