一、几种常见的攻击方式及预防手段。
1.SQL注入攻击
SQL注入攻击是攻击者在HTTP请求中注入恶意的SQL代码,服务器使用参数构建数据库SQL命令时,恶意SQL被一起构造,并在数据库中执行。
防范:一般我们会从两个方面同时入手。使用预编译的PrepareStatement和Web端有效性检验。限制字符串输入的长度,服务端不用拼接SQL字符串。有效性检验。(为什么服务端还要做有效性检验?第一
准则,外部都是不可信的,防止攻击者绕过Web端请求) 过滤SQL需要的参数中的特殊字符。比如单引号、双引号。
2.XSS攻击
XSS攻击是跨站点脚本攻击,指攻击者通过篡改网页,嵌入恶意脚本程序,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。
防范:前端服务端,同时需要字符串输入的长度限制。前端服务端,同时需要对HTML转义处理。将其中的”<”,”>”等特殊字符进行转义编码。
3.CSRF攻击
CSRF攻击是跨站点请求伪造,指攻击者通过跨站请求,以合法的用户的身份进行非法操作。可以这么理解CSRF攻击:攻击者盗用你的身份,以你的名义向第三方网站发送恶意请求。CRSF能做的事情包括
利用你的身份发邮件,发短信,进行交易转账,甚至盗取账号信息。
防范:token机制。在HTTP请求中进行token验证,如果请求中没有token或者token内容不正确,则认为CSRF攻击而拒绝该请求。
验证码。通常情况下,验证码能够很好的遏制CSRF攻击,但是很多情况下,出于用户体验考虑,验证码只能作为一种辅助手段,而不是最主要的解决方案。 referer识别。在HTTP
Header中有一个字段Referer,它记录了HTTP请求的来源地址。如果Referer是其他网站,就有可能是CSRF攻击,则拒绝该请求。但是,服务器并非都能取到Referer。很多用户出于隐私保护的考虑,限制了Referer的发送。在某些情况下,浏览器也不会发送Referer,例如HTTPS跳转到HTTP。
4.文件上传漏洞
文件上传漏洞,指的是用户上传一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。
防范:文件上传的目录设置为不可执行。 判断文件类型。在判断文件类型的时候,可以结合使用MIME Type,后缀检查等方式。因为对于上传文件,不能简单地通过后缀名称来判断文件的类型,因为攻击者可以将可执行文件的后缀名称改为图片或其他后缀类型,诱导用户执行。 对上传的文件类型进行白名单校验,只允许上传可靠类型。 上传的文件需要进行重新命名,使攻击者无法猜想上传文件的访问路径,将极大地增加攻击成本,同时向shell.php.rar.ara这种文件,因为重命名而无法成功实施攻击。 限制上传文件的大小。 单独设置文件服务器的域名。
5.垂直权限管理
访问控制,一般来说,“基于URL的访问控制”是最常见的。
二、http1.x和http2.x的区别。
HTTP1.0与HTTP1.1的区别:长连接、节约带宽、HOST域
1、HTTP1.0需要使用keep-alive参数来告知服务器建立一个长连接,而HTTP1.1默认支持长连接
2、HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返 回401。接收到100,才开始请求body发送给服务器,如果接收到的是401,客户端就不用发送body信息了,节约了带宽
3、如今web server上的多个虚拟站点可以共享同一个IP和端口,而HTTP1.0是没有HOST域的,HTTP1.1才支持这个参数
HTTP1.1与HTTP2.0的区别:多路复用、二进制分帧、首部压缩、服务器推送
1、在HTTP1.1协议中,浏览器客户端在同一时间针对统一域名的请求有一定的数据限制,超过限制数目的请求会被阻塞;HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级
2、HTTP2.0在应用层和传输层之间加了一个二进制分帧层,改进了传输性能,实现了低延迟和高吞吐量
3、HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快
4、在HTTP2.0中,服务器可以对客户端的一个请求发送多个响应。当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器获取,这种方式非常适合加载静态资源。服务器推送可以缓存,并且在遵循同源的情况下,不同页面之间可以共享缓存
三、mysql查询语句怎么做性能分析。
mysql explain用于分析sql语句的执行机数据库索引的使用。直接在sql语句上加上explain即可
每次使用都会得到id,select_type,table,possible_keys,key,key_len,ref,rows,Extra这几个参数,其中与效率息息相关的则是type,key,ref,rows
id是select的查询序列号,与执行顺序无关
select_type就是select的类型,分为SIMPLE,PRIMARY,UNION,DEPENDENT UNION,UNION RESULT,SUBQUERY,DEPENDENT SUBQUERY,DERIVED
table是显示这一行的数据是关于哪张表的
type这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用EXPLAIN命令分析性能瓶颈的关键项之一,结果值排序:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,一般来说,得保证查询至少达到range级别,最好达到ref,否则就可能出现性能问题
possible_keys指出Mysql能使用哪个索引在该表中找到行
key显示mysql实际决定使用的键(索引),如果没有选择索引,键是null
key_len显示mysql决定使用的键长度,使用索引的长度,在不损失精确性的情况下,长度越短越好
ref显示使用哪个列或常数与key一起从表中选择行
rows显示mysql认为它执行查询时必须检查的行数
Extra包含mysql解决查询的详细信息。
因此通过explain命令查看sql语句的执行计划,根据执行计划可以对sql进行相应的优化
四、HashMap和HashTable的区别,并说明其底层实现数据结构。
区别:1、HashTable是线程安全的,而HashMap是非线程安全的
2、HashMap可以使用null作为key,而HashTable则不允许null作为key。
3、HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类
4、HashMap的初始容量为16,扩容时当前容量翻倍,HashTable初始容量为11,扩容时是容量翻倍+1,两者的填充因子默认都是0.75
5、两者计算hash的方法不同,HashTable计算hash是直接使用key的hashcode对table数组的长度直接进行取模,HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取模
底层实现数据结构:HashMap和HashTable的底层实现都是数组+链表结构实现,添加、删除、获取元素时都是先计算hash,根据hash和table.length计算index也就是table数组的下标,然后进行相应操作
五、HashMap满了之后怎么扩容?
HashMap采用懒加载,当第一次向里面存放键值时才初始化。当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阀值--即当前数组的长度乘以加载因子的值时候,就要自动扩容了。扩容就是重新计算容量,想HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组。将原来数组中的元素拷贝到新的数组里。
六、Linux中远程传输文件有什么方式?
scp:secure copy,是用来进行远程文件拷贝的,数据传输用ssh,并且和ssh使用相同的认证方式,提供相同的安全保证。简单方便,安全可靠,支持限速参数,但是不支持排除目录
rcp:目标主机需要事先打开rcp功能,并设置好rcp的权限,把源主机加入到可信任主机列表中,否则无法再源主机上使用rcp远程复制文件到目标主机
wget:是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三种最常见的TCP/IP协议下载,并可以使用HTTP代理。简单方便,支持排除目录和限速参数,但是只能从远程机器将文件或文件夹下载到本地,并且远程机器需要支持ftp服务;参数较多,使用上比scp复杂
rsync:rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。它的操作方式和scp和相似,但是比scp强大很多。
七、TCP和UDP的区别,TCP为什么是三次握手,不是两次。
TCP:面向连接的协议,传输过程比较可靠,可以传输的数据量相对比较大,但是传输速度相对较慢
UDP:面向非连接的协议,传输过程不可靠,可以传输少量的数据,但是传输速度相对较快
采用三次握手是防止已失效的连接请求报文段突然又传送到了服务器。造成服务端的资源浪费
八、说说数据库设计的三范式,可以违反三范式吗?
第一范式:原子性,即每个字段都不可以再分割了
第二范式:唯一性,确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(针对联合主键而言)
第三范式:确保数据表中的每一列数据都和主键直接相关,而不能间接相关
在实际应用中,可以存在违反三范式。三范式是理论上的范式,它代表着最合理的数据结构,但不一定是最合理的数据模型。最好和最优是针对应用场景来说的,任何数据结构和市级规范都不能脱离实际应用而存在。