防xss攻打总结
防xss攻击总结
原则
用户输入什么,数据库就存储什么.
在前端显示时,需要escape.
html标签的title属性也需要escape
看一个title属性未escape得例子:
html代码:
所以html标签的title属性也需要escape.
但是,如果使用jQuery的attr方法设置title,则不需要escape:
setPreviewOrgFullName:function (orgFullName) { if(orgFullName){ //去掉空格 orgFullName=Cjt.util.Format.trim(orgFullName); } var orgCutOffName = Util.omitTooLongString(orgFullName, this.config.truncationLength); $('#preview_orgFullName').html(Cjt.escape(orgCutOffName)).attr('title', orgFullName); }
注意:如果使用jQuery设置title,则不需要escape,
否则需要对title进行escape
如果能够保证title没有双引号,则不管哪种情况,都不需要escape.
jstl escape
title="<c:out value="${bbs.answer}" default="" escapeXml="true"/>"
需要引入jstl的标签库:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>1 2
如何实现企业名称超过14字符就截断
步骤:先截断,再escape
为什么呢?
如果先escape,那么字符串的长度就与原来不一致
js版本:
var orgFullNameTmp = Util.omitTooLongString(orgName, me.config.truncationLength); $('ul.company-name').prepend(me.createOrgDom({ orgId: resp.orgId, orgFullName: Cjt.escape(orgFullNameTmp), orgFullNameTitle: Cjt.escape(orgName) }));
freeMark:
<#if item.orgName=="">未命名企业 <#else> <#escape x as x?html> <#if item.orgName?length lt 15 > ${item.orgName} <#else> ${item.orgName[0..13]}... </#if> </#escape> </#if>
title escape:
title="<#escape x as x?html>${item.orgName}</#escape>"
jQuery中html,text方法
text 可以自动escape,所以不用手动escape,
text根据字面意思,就是不按照html解析,而是仅仅当做普通文本.
html()需要escape,因为html方法就是按照html来解析的.
$('#agentNameP').html(xssTitle12).attr('title', agentFullName); $('#preview_agentName').text(truncatTitle).attr('title', agentFullName);//预览的服务商