网络流量攻击带来的危害

JavaScript022

网络流量攻击带来的危害,第1张

从以前网络流量攻击在闲鱼的发布数来看,网络流量攻击造成的破坏远远不止服务瘫痪这么简单。

1.经济损失

电商、信贷、游戏行业等网站一旦网站被攻击,就会造成客户无法打开网站的情况,一旦客户打不开就会造成流量损失,流量损失会直接造成这些企业的经济损失,相关数据显示有很多的损失合同和运营终止都跟DDOS攻击有关,在一系列被攻击过的相关企业里,26%的企业都将DDOS攻击视为最大风险。

2.信誉损失

服务器宕机造成的业务系统崩溃会让企业的信誉扫地,糟糕的客户体验会让**户流失,企业声誉,品牌形象大受打击。

3.信息安全受到危害

在遭受网络流量攻击时企业安全人员都会将维护中心转移到防护流量攻击上,这时不法分子就有机会钻空子,窃取数据、感染病毒、恶意欺骗等犯罪活动将更容易得手。

那么如此危险的网络攻击,我们该如何防护呢?

(1)网络层攻击防御

1.针对TCP类型,syn_fllod可利用协议规范,采用syn_cookie,syn_reset的认证方式。其他类型的tcp报文可通过tcp绘画机制过滤。

2.针对UDP类型的攻击,通常为反射攻击,将一些常被用于反射攻击的udp端口的保统统丢弃,通常可以防御大多数攻击。

(2)应用层攻击

通常可以针对特定IP进行限速,比如可以Nginx上配置,针对http采用js反射校验等机制。

android与js交互有两种方式,第一种是通过系统提供的@JavascriptInterface注解实现,第二种就是js注入。下面来详细讲解一下二者的使用方式,原理,区别。

一、@JavascriptInterface实现

实现步骤:

a.设置WebView支持js脚本

b.为提供给js调用的方法加上@JavascriptInterface注解c.给WebView添加js接口

[java] view plain copy

webView.getSettings().setJavaScriptEnabled(true)webView.addJavascriptInterface(new JSMethod(mContext), "lh")public class JSMethod {

private Context mContext

public JSMethod(Context mContext) {

this.mContext = mContext

}

@JavascriptInterface

public void toast(String msg) {

Toast.makeText(mContext, msg == null ? "" : msg, Toast.LENGTH_SHORT).show()}

}

js端调用android方法:

[javascript] view plain copy

lh.toast("Hello,China!")

android端执行js方法:

[java] view plain copy

webView.loadUrl("javascript:console(" + "'Hello,China!'" + ")"")二、js注入实现

先来说说原理吧,当js调用prompt()方法时,WebChromeClient.onJsPrompt()方法会被触发,当js触发Android提供的接口方法时,将该方法的方法名称、参数类型、参数值转成json,然后通过prompt方法传递给android端,android端解析json并通过反射执行对应的方法,同时也支持执行匿名回调。

整个流程比较复杂,看图:

为WebView绑定WebChormeClient监听,在Html加载进度25%时进行js注入(注入的js是根据android提供给js的对象类名动态生成)动态注入的js代码如下:

[javascript] view plain copy

javascript: (function(b) {

console.log("HostApp initialization begin")var a = {

queue: [],

callback: function() {

var d = Array.prototype.slice.call(arguments, 0)//获取该函数参数并转换为Array数组var c = d.shift()//取得数组第一个元素

var e = d.shift()

this.queue[c].apply(this, d)//新建一个对象 属性名称为取得的c,并将d数组作为他的值。然后将这个对象push到queue数组if(!e) {//e为空的时候,将queue数组属性名称为c的对象删除delete this.queue[c]

}

}

}

//各种赋值,最后都等于同一个函数

a.alert = a.alert = a.alert = a.delayJsCallBack = a.getIMSI = a.getOsSdk = a.goBack = a.overloadMethod = a.overloadMethod = a.passJson2Java = a.passLongType = a.retBackPassJson = a.retJavaObject = a.testLossTime = a.toast = a.toast = function() {var f = Array.prototype.slice.call(arguments, 0)if(f.length <1) {

throw "HostApp call error, message:miss method name"}

var e = []

//此段判断,然后赋值

for(var h = 1h <f.lengthh++) {

var c = f[h]

var j = typeof c

e[e.length] = j

if(j == "function") {

var d = a.queue.length

a.queue[d] = c

f[h] = d

}

}

//将匿名对象{method: f.shift(),types: e,args: f}转换成json字符串并用浏览器弹出确认可输入框,然后取得输入框的值json序列化为js对象var g = JSON.parse(prompt(JSON.stringify({method: f.shift(),

types: e,

args: f

})))

if(g.code != 200) {

throw "HostApp call error, code:" + g.code + ", message:" + g.result}

return g.result

}

//获取a的属性值,然后循环

Object.getOwnPropertyNames(a).forEach(function(d) {var c = a[d]

//判断赋值

if(typeof c === "function" &&d !== "callback") {a[d] = function() {

//concat 连接两个数组

return c.apply(a, [d].concat(Array.prototype.slice.call(arguments, 0)))}

}

})

b.HostApp = a

console.log("HostApp initialization end")})(window)//闭包函数默认执行,然后赋给window。这样window.b就可以执行了 b.HostApp就是执行a的内容,但是a具体处理逻辑不对外开放,避免外部污染a内部逻辑代码不难,可以自行理解,其中回调函数被封装在了a对象里面,确保android端可以通过webview.loadUrl()执行回调。

android端回调js代码如下:

[javascript] view plain copy

javascript:HostApp.callback(0, 0 ,"call back haha")android提供的每一个js方法都对应一个JsCallback对象,android就可以通过JsCallback对象来生成并执行回调js的代码。

三、优缺点

a.第一种方式不安全,不添加addJavascriptInterface,甚至默认false,在低于API17的WebView上默认添加"SearchBoxJavaBridge_"到mJavaScriptObjects中。这样就有可能通过用户信任的客户端获取SD卡的数据;b.第一种方式必须要API大于等于17才能使用

c.第一种方式当有js回调函数需要android端执行时,都需要将匿名回调函数赋值给全局函数才能供android端回调,增加了js和android端通信的封装层的低效代码量;而第二种方式则是通过动态注入js的方式则非常方便。

d.第二种方式也有一定限制,比如android提供的方法必须是static修饰的,且方法第一个参数必须为WebView,不过这不影响使用。

js并不难学。Js给人那种感觉的原因多半是因为它如下的特点:A:本身知识很抽象、晦涩难懂,如:闭包、内置对象、DOM。B:本身内容很多,如函数库、对象库就一大堆。C:混合多种编程思想。它里面不但牵涉面向过程编程思想,又有面向对象编程思想,同时,它的面向对象还和别的编程语言(如:C++,JAVA,PHP)不大一样。就好像又是新的一样,让你对曾经学的面向对象产生了怀疑......D:辛苦学习后又看似和实际应用脱节。通常学了很久的js基础之后,变量、函数、对象你也都略知一二,但一到公司开发项目的时候,却又难以下手。因为公司在开发实际项目的时候通常都是直接用它的衍生库,如:jquery,angular,boostrap,amaze,layui,ueditor等,而这些库又多如牛毛,同时还有自己的难点。让你都不知道该学哪个好,甚至都怀疑自己学的是不是js了,好像有多个版本的js一样,总是学不完......那么,怎么才能在js领域内学的轻松甚至游刃有余呢?我总结了一些实战意义的js学习经验:1.首先要紧紧抓住它的地位时刻都不能忘记,否则很容易犯“一叶障目不见泰山”的错误。不要学了很久就知道js是编程语言,就是写代码,而且特点就是乱七八糟就完了,那样是学不好js的。要时时抓住它的地位,确切的说是它在整个Web中的地位:它属于前端的核心,主要用来操控和重新调整DOM,通过修改DOM结构,从而来达到修改页面效果的目的。要用这个中心思想去指导后续的一切js的学习,并且形成条件反射。 2.要有一条清晰的学习路线这个只能是过来人给你提供参考了。我的学习路线如下:A:js基础部分,如:定义变量、函数、数组、字符串等的处理,内置函数、内置对象等;B:js面向过程编程思想,封装出各个函数,试着用这些去做一些常见的小功能,如:选项卡、自定义多选按钮、自定义播放器、3D幻灯片;C:js面向对象编程思想,试着去封装一些你自己的对象,提供出有意义的接口出来;D:学了上述的内容,然后学常用的库,这里必须学jquery;E:学基于jquery之上的常见插件,如:bootstrap,Layer,富文本编辑器等;F:综合应用上面的多种库写实际项目的模板,多写几套。 3.从多角度去学习和领悟充分调动你所学的东西,从多角度去做某一功能,如:以前你是从面向过程角度做的,现在改为从面向对象的角度再来做,或者继续做成可以直接使用的插件,提供属性、方法等出来。争取让你做的这个功能逐渐能使用到实际项目中来。这样的好处:既综合应用了你的所学,又能有实际意义。 4.注意培养信心此时的你,不适合一来就看很复杂很炫的网页效果的源代码,也不适合一来就学jquery,angular,vue,bootstrap这些东西。这些内容包含了很多深奥的知识在里面,在没有任何基础的情况下直接学这些,会严重打击你的自信心。而此时你是弱小的,你需要的是培养信心,而不是反过来,否则结局很可能是“夭折”,离学有所成也就遥遥无期了。 5. 多写总结这种总结不但包括源代码、显示效果截图,还应该很容易犯的错误和对应的解决方法以及最后一两句精简的结论性语句。对自己写的总结不是写完了就了事了,要多回顾、多改进、多精简。到做项目的时候,应该是看里面的一两句话就知道是讲什么了,而不要再去看长篇大论了。 6.构建知识导图这个可以让你越学越清晰,你可以按你喜欢的任何形式去做,只要自己印象深刻就行。注意:知识导图也应该是经常修改、修正,让它更合理、更清晰。学习编程知识,就来北京尚学堂,优秀的师资和多年的编程教育经验,会让你在学习的道路上快人一步。