| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
在使用持久连接的情况下,某个连接上消息的传递类似于
请求1->响应1->请求2->响应2->请求3->响应3
管线化,变成了以下情况(把所有的请求都打包📦发到服务端,然后服务端所有响应也打包📦响应回来)
请求1->请求2->请求3->响应1->响应2->响应3
管线化机制通过持久连接完成,仅HTTP/1.1支持此技术
只有GET和HEAD请求可以完成管线化,而POST则有所限制
初次创建连接时不应启动管线化,因为对方(服务器)不一定支持HTTP/1.1版本的协议
管线化不会影响响应到来的顺序
HTTP/1.1要求服务器端支持管线化,但并不要求服务器端也对响应进行管线化处理,只是要求对于管线化的请求不失败即可
function ajax(url,fnSucc,fnFaild) {
//1.创建ajax对象
if(window.XMLHttpRequest){
var iAjax = new XMLHttpRequest();
}else{
var iAjax = new ActiveXObject("Microsoft.XMLHTTP");
}
//2.连接服务器
//open(方法、文件名、异步传输)
iAjax.open('GET',url,true);
//3.发送请求
iAjax.send();
//4.接受返回
iAjax.onreadystatechange = function () {
//iAjax.readyState 浏览器和服务器进行到哪一步了
if(iAjax.readyState === 4){
if(iAjax.status === 200 || iAjax.status === 304){
fnSucc(iAjax.responseText);
}
else{
if(fnFaild){
fnFaild(iAjax.status);
}
alert('失败'+iAjax.status);
}
}
}
}<script src="http://www.abc.com/?data=name&callback=jsonp" charset="utf-8"></script>
<script>
jsonp({
data:{
<!-- 全局函数接受回掉信息 -->
}
})
</script>var util = {};
/*[function 在页面注入脚本]*/
util.createScript = function(url,charset){
var script = document.createElement('script');
script.setAttribute('type','text/javascript');
charset && script.setAttribute('charset',charset);
script.async = true;
return script;
}
/*[function jsonp]*/
util.jsonp =function(url,onsuccess,onerror,charset){
var callbackName = util.getName('tt_player');
window[callbackName] = function () {
if(onsuccess && util.isFunction(onsuccess)){
onsuccess(arguments[0]);
}
};
var script = util.createScript(url + '&callback=' + callbackName,charset);
script.onload = script.onreadystatechange = function () {
if(!script.readyState || /loaded|complete/.test(script.readyState)){
script.onload = script.onreadystatechange = null;
//移除该script 的DOM 对象
if(script.parentNode){
script.parentNode.removeChild(script);
}
//删除函数或变量
window[callbackName] = null;
}
};
script.onerror = function(){
if(onerror && util.isFunction(onerror)){
onerror();
}
};
document.getElementsByTagName('head')[0].appendChild(script);
}//利用hash,场景是当前页面A通过iframe或iframe嵌入了跨域的页面 B
//A中伪代码
var B = document.getElementsByTagName('iframe');
B.src = B.src + '#' +'data';
//在B中的伪代码如下
window.onhashchange = function(){
var data = window.location.hash;
}postMessage(HTML5新增)
A窗口下的
//postMessage
//窗口A(http://A.com)向跨域窗口(http://B.com)发送信息
window.postMessage('data','http://B.com');//窗口B中监听;
window.addEventListener('message',function(event) {
console.log(event.origin);// http://A.com
console.log(event.source);// A window
console.log(event.data);// data!
},false);//Websocket
var ws = new WebSocket('wss://echo.websocket.org');
ws.onopen = function(evt) {
console.log('Connection open ...');
ws.send('Hello WebSockets!');
};
ws.onmessage = function(evt) {
console.log('Received Message:' + evt.data);
ws.close();
}
ws.onclose = function(evt) {
console.log('Connection closes.');
}// url (必须), options (可选)
fetch('/some/url',{
method: 'get',
}).then(function(response) {
}).catch(function(err) {
//出错了;等价于then的第二个参数,但这样更好用更直观
})获取页面数据
获取Cookies
劫持前端逻辑
发送请求
。。。
偷取网站任意数据
偷取用户资料
偷取用户密码和登录态
欺骗用户
。。。
“微博病毒”攻击事件回顾:
2011年6月28日晚,新浪微博出现了一次比较大的XSS攻击事件。大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉团团高清普通话版种子”,“这是传说中的神仙眷侣啊”,“惊爆!范冰冰艳照真流出了”等等微博和私信,并自动关注一位名为hellosamy的用户。
事件的经过线索如下:
20:14,开始有大量带V的认证用户中招转发蠕虫
20:30,某网站中的病毒页面无法访问
20:32,新浪微博中hellosamy用户无法访问
21:02,新浪漏洞修补完毕
URL参数直接注入
反射型XSS攻击传播,需要攻击把带有脚本的URL传播给用户 http://loacalhost:8080/?from<script>alert(1)</script>Google
一般都会看出URL有问题
所以攻击者会对URL做出变换 利用短网址,可以通过dwz.cn进行转换
<div>
#{content}
</div>
<div>
<script>
</script>
</div><img src="#{image}" alt="图片">
<img src="1" onerror="alert(1)"/><!-- 正常情况下搜索到id为1的图片 -->
<img src="/image/1" ><!-- 改变后的情况 -->
<img src="/image/1" onerror="alert(1)" >
<!-- " onerror="alert(1) --><script>
var data = "#{data}";
var data = "hello";alert(1);"";
</script><script>
var from = "Google"//此段代码是传递到页面上
</script><!-- 正常情况下搜索到id为1的图片 -->
<script>
var from = "Google"//此段代码是传递到页面上
</script><!-- 改变后的情况 -->
<script>
var from = "Google";alert(1);""//此段代码是传递到页面上
</script>
<!-- ";alert(1);" --><div>
#{content}
</div>var escapeHtml = function(str) {
if(!str) return '';
str = str.replace(/</g,'<');//替换成html实体
str = str.replace(/>/g,'>');
return str;
}<img class="#{class}" />
<img class="hello" onload="alert(1)" />var = escapeHtmlProperty = function(str) {
if(!str) return '';
str = str.replace(/"/g,'&quto');
str = str.replace(/'/g,'&39');
str = str.replace(/ /g,'&32');
return str;
}var escapeHtml = function(str) {
if(!str) return '';
str = str.replace(/</g,'<');//替换成html实体
str = str.replace(/>/g,'>');
str = str.replace(/"/g,'&quto');
str = str.replace(/'/g,'&39');
str = str.replace(/ /g,'&32'); //遵循书写规则,可以不做转义
return str;
}child-src
child-src:为 web workers和其他内嵌浏览器内容定义 合法的源,例如用<frame> 和<iframe>加载到页面的内容。
connect-src
connect-src:限制能通过脚本接口加载的URL。
default-src
default-src:为其他取指令提供备用服务fetch directives.
font-src
font-src:限制通过@font-face加载的字体源。
frame-src
frame-src: 限制通过类似<frame> 和<iframe> 标签加载的内嵌内容源。
img-src
img-src: 限制图片和图标源
manifest-src
manifest-src : 限制 application manifest 文件源。
media-src
media-src:限制通过<audio> 或<video> 标签加载的媒体文件源。
object-src
object-src:限制通过 <object>, <embed> ,<applet> 标签加载源。
script-src
script-src:限制javascript 源。
style-src
style-src:限制层叠样式表文件源。
worker-src
worker-src:限制Worker, SharedWorker, 或者 ServiceWorker脚本源。<!-- 在Content中设置规则 -->
<meta http-equiv="Content-Security-Policy" content="default-src https:"><!-- 这样设置页面上的脚本会失效,但是外链引用的脚本会有效 -->
<meta http-equiv="Content-Security-Policy" content="default-src self">
<!-- 但是这样还会导致页面图片失效 因为没有设置相应的'img-src'规则 ,所以他只会信赖本域下的图片 -->
<!-- 为了更精准的操作放置XSS攻击,则采用script-src 这样图片不会受到影响 -->
<meta http-equiv="Content-Security-Policy" content="script-src self"><!-- nonce+随机🔀字符串 -->
<meta http-equiv="Content-Security-Policy" content="script-src self nonce-1234"><script type="text/javascript" nonce="1234">
</script><script type="text/javascript">
document.write(`<form method="post" name="commentForm" target="csrf" action="http://loacalhost">
<input type="hidden" name="postId" value="13">
<textarea name="content" >来自csrf</textarea>
</form>`);
var irame = document.createElement('iframe');
iframe.name = 'csrf';
iframe.style.display = 'none';
document.body.appendChild(iframe);
setTimeout(() => {
document.querySelector('[name=commentForm]').submit();//执行在攻击页面该脚本
}, 1000);
</script>通过 referer、token 或者 验证码 来检测用户提交。
尽量不要在页面的链接中暴露用户隐私信息。
对于用户修改删除等操作最好都使用post 操作 。
避免全站通用的cookie,严格设置cookie的域。
禁止第三方网站带Cookies
Cookie新属性same-site属性
只有Chrome支持
| Back | FazBrowse Home | New Git URL |