标签:形式 上传 happy car 判断 严格 hang 不包含 regexp
XHTML 元素必须被正确地嵌套
在 HTML 中,某些元素可以像这样彼此不正确地嵌套
<b><i>This text is bold and italic</b></i>
在 XHTML 中,所有的元素必须像这样彼此正确地嵌套
<b><i>This text is bold and italic</i></b>
<ul>
<li>Coffee</li>
<li>Tea
<ul>
<li>Black tea</li>
<li>Green tea</li>
</ul>
</li>
<li>Milk</li>
</ul>
XHTML 元素必须被关闭
非空标签必须使用结束标签
<p>This is a paragraph</p>
<p>This is another paragraph</p>
空标签也必须被关闭,空标签也必须使用结束标签,或者其开始标签必须使用/>结尾
A break: <br />
A horizontal rule: <hr />
An image: <img src="happy.gif" alt="Happy face" />
标签名必须用小写字母:XHTML 规范定义标签名和属性对大小写敏感
<body>
<p>This is a paragraph</p>
</body>
XHTML 文档必须拥有根元素:所有的 XHTML 元素必须被嵌套于<html>
根元素中。其余所有的元素均可有子元素。子元素必须是成对的且被嵌套在其父元素之中
<html>
<head> ... </head>
<body> ... </body>
</html>
-webkit-
-webkit-
-moz-
-ms-
-o-
<div class="huanDengPic"></div>
.huanDengPic {
width: 237px;
height: 160px;
margin: 50px auto 0;
overflow: hidden;
box-shadow: 0 0 5px rgba(0,0,0,1);
background-size: contain;
animation: loops 10s infinite;
}
@keyframes loops {
0% {background:url(https://github.com/AnsonZnl/images/blob/master/Unclassified/WechatIMG1.jpeg?raw=true) no-repeat;
}
50% {
background:url(https://github.com/AnsonZnl/images/blob/master/Unclassified/WechatIMG2.jpeg?raw=true) no-repeat;
}
100% {
background:url(https://github.com/AnsonZnl/images/blob/master/Unclassified/WechatIMG3.jpeg?raw=true) no-repeat;
}
}
XSS
含义:跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表 CSS 混淆,故将跨站脚本攻击缩写为 XSS)。恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的
分类:
触发:
<script>alert(‘xss‘)</script>
或者其他脚本https://www.baidu.com?jarttoTest=<script>alert(document.cookie)</script>
XSS防御
输入过滤,避免 XSS 的方法之一主要是将用户输入的内容进行过滤。对所有用户提交内容进行可靠的输入验证,包括对 URL、查询关键字、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。(客户端和服务器都要)
输出转义
往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码 HTML 字符实体
function htmlEncodeByRegExp (str){
var s = "";
if(str.length == 0) return "";
s = str.replace(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/\'/g,"'");
s = s.replace(/\"/g,""");
return s;
}
var tmpStr="<p>123</p>";
var html=htmlEncodeByRegExp (tmpStr)
console.log(html) //<p>123</p>
document.querySelector(".content").innerHTML=html; //<p>123</p>
将用户数据输出到html 标签的属性时,必须经过标签属性的转义。注意:不包含href, src, style和事件处理函数属性(比如onmouseover)。除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 &#xHH; (以&#x开头,HH则是指该字符对应的十六进制数字,分号作为结束符)
<div attr=...【用户数据】...>content</div> //数据不在引号内
<div attr='... 【用户数据】...'>content</div> //数据在单引号内
<div attr="...【用户数据】...">content</div> //数据在双引号内
对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(Event Handler,如onmouseover, onload)等进行Javascript编码。使用“”对特殊字符进行转义,除数字字母之外,小于127的字符编码使用16进制“\xHH”的方式进行编码,大于用unicode(非常严格模式)
var JavaScriptEncode = function(str){
var hex=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function changeTo16Hex(charCode){
return "\\x" + charCode.charCodeAt(0).toString(16);
}
function encodeCharx(original) {
var found = true;
var thecharchar = original.charAt(0);
var thechar = original.charCodeAt(0);
switch(thecharchar) {
case '\n': return "\\n"; break; //newline
case '\r': return "\\r"; break; //Carriage return
case '\'': return "\\'"; break;
case '"': return "\\\""; break;
case '\&': return "\\&"; break;
case '\\': return "\\\\"; break;
case '\t': return "\\t"; break;
case '\b': return "\\b"; break;
case '\f': return "\\f"; break;
case '/': return "\\x2F"; break;
case '<': return "\\x3C"; break;
case '>': return "\\x3E"; break;
default:
found=false;
break;
}
if(!found){
if(thechar > 47 && thechar < 58){ //数字
return original;
}
if(thechar > 64 && thechar < 91){ //大写字母
return original;
}
if(thechar > 96 && thechar < 123){ //小写字母
return original;
}
if(thechar>127) { //大于127用unicode
var c = thechar;
var a4 = c%16;
c = Math.floor(c/16);
var a3 = c%16;
c = Math.floor(c/16);
var a2 = c%16;
c = Math.floor(c/16);
var a1 = c%16;
return "\\u"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+"";
}
else {
return changeTo16Hex(original);
}
}
}
var preescape = str;
var escaped = "";
var i=0;
for(i=0; i < preescape.length; i++){
escaped = escaped + encodeCharx(preescape.charAt(i));
}
return escaped;
}
将不可信数据插入到HTML URL里时,对这些数据进行URL编码。除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 %HH (以 % 开头,HH则是指该字符对应的十六进制数字)
对URI使用encodeURI()
对参数使用encodeURIComponent()
使用 HttpOnly Cookie:将重要的cookie标记为httponly,这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在js脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie。现代web开发框架如vue.js、react.js等,在设计的时候就考虑了XSS攻击对html插值进行了更进一步的抽象、过滤和转义,我们只要熟练正确地使用他们,就可以在大部分情况下避免XSS攻击
CSRF
含义:CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点相似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户,但它们的攻击类型是不同维度上的分 类。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求
触发:
http://www.mybank.com/Transfer.php?toBankId=11&money=1000
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
防御
标签:形式 上传 happy car 判断 严格 hang 不包含 regexp
原文地址:https://www.cnblogs.com/EricZLin/p/12215914.html