2016-11-25 317 views
2

我只是学习有关OWASP ESAPI的XSS预防和我用我的应用程序我现在用的是OWASP ESAPI encodeForHTMLAttribute但是符号显示他们的HTML实体数量,而不是象征

Javascipt versionRule #2在在将不可信数据插入属性值(如“宽度,名称或值”)之前,XSS预防备忘单应该“属性转义”,我正在处理此问题。

然而插入一个电子邮件地址作为联系表单中的输入字段的值之前使用encodeForHTMLAttribute()时,@符号的显示,因为它的相应的HTML实体#&x40;,你可以在这个截屏图像看:

screenshot image

我错过了什么吗?

我已经确定该文件的字符集如下设置为UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

我还增加了在接收字符集=“UTF-8”属性有问题的形式。

HTML表单:

在我的应用程序,执行一个Ajax请求提交登录详细信息和认证成功后,我从数据库中检索他们的详细资料:我的应用程序的

<form id="contact_form" name="contact_form" method="post" action="" accept-charset="UTF-8"> 
    <div class="form_divider"> 
     <label for="contact_form_email"><span class="asterisk">*</span>E-mail</label>  
     <input id="contact_form_email" tabindex="1" name="contact_form_email" type="email" data-role="none" maxlength="254" placeholder="E-mail" required/> 
    </div><!--/form_divider--> 

</form> 

数据流并以json格式发送回客户端。 我然后将这些细节的HTML适用

的Javascript:

 $.ajax({ 
      url: app_root_url + 'login_registration/user_processing.php', 
      data: JSON.stringify(params), 
      type: "POST", 
      dataType: "json", 
      contentType: "application/json;charset=utf-8", 
      success: function(data){ 
      //data will be the user details such as userID, display name, email 
      var result = data; 
      prepareAppAfterLogin(result); 

      }   

    });//end ajax 


function prepareAppAfterLogin(result){ 
    var userDetails = result.userDetails; 
    generateUserProfilePage(userDetails); 

} 

function generateUserProfilePage(userDetails){ 
    var userID = userDetails.userID; 
    var display_name = userDetails.display_name; 
    var email_address = userDetails.email_address; 

    var profile_image = userDetails.profile_image; 
    $("#profile_pic").attr('src', profile_image); 

    var safe_email_address_for_html = $ESAPI.encoder().encodeForHTML(email_address); 
    $("#profile_email_address").html(safe_email_address_for_html); 

    var safe_email_for_attribute = $ESAPI.encoder().encodeForHTMLAttribute(email_address); 
    $("#hidden_input_for_email").val(safe_email_for_attribute); 
    $("#contact_form_email").val(safe_email_for_attribute); 

} 

编辑: 我刚才发现,支持什么@Cheran Shunmugavel在下面他的评论说,文件: 规则#2浏览: https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet “重要的是要注意,当设置一个不执行代码的HTML属性时,该值直接在HTML元素的object属性中设置,所以不用担心注入问题。”...“适当的编码要使用只有JavaScript编码才能禁止攻击者关闭单引号和内联代码,或转义到HTML并打开新的脚本标记。“

遵守这个规则,我刚才想编码的电子邮件地址的JavaScript,而不是编码为HTML属性如下:

function generateUserProfilePage(userDetails){ 
     var safe_email_address = $ESAPI.encoder().encodeForJavaScript(userDetails.email_address); 
     $("#contact_form_email").val(safe_email_address); 

} 

但是似乎这样也造成显示问题: JS encode display problems

你能确认我需要JavaScript编码吗?谢谢

回答

1

如果您使用jQuery val方法在文档中插入数据,则不需要encodeForHTML和encodeForHTMLAttribute函数。我在官方文档中找不到任何东西,但是在这个StackOverflow问题上有一个很好的解释:Do jQuery's val() and prop() methods html-escape values?。重要的是,val在内部设置DOM value属性,并且该属性不会尝试将文本解释为HTML标记,因此不需要转义。

+0

这很有道理。谢谢你的帮助。 :) – Sarah

+0

我发现官方文档来支持你说的话。我编辑了我的问题,正如文档声明给JavaScript编码数据。你对此有何看法?因为它也没有正确显示?谢谢 – Sarah

相关问题