记录一次基础面试题。 PS:在面试过程中碰到自己不会的,直接回答不了解就好,毕竟说多错多。
常见的网络攻击&解决方法
XSS攻击
Cross Site Script跨站脚本攻击,它指的是恶意攻击者往Web页面里插入恶意的html+javascript的脚本和代码,当用户浏览该页之时,嵌入其中Web里面的恶意脚本会被执行,从而达到恶意用户的特殊目的。XSS攻击又分:反射型攻击跟持久型攻击。
反射型攻击
:第一种XSS攻击是反射型攻击,可能通过图片或者flash的动图之类的诱导你点击一个URL链接。在这个URL链接里就嵌入他自己的恶意脚本,你点击URL链接之后,URL指向的是黑客自己的服务器上的一段恶意脚本,然后恶意脚本被返回到你的浏览器里就会运行,就可以控制你的浏览器里的行为了,比如说脚本可以自动让你关注某个用户ID,然后控制你自动发布一个带有病毒的微博等。
持久型攻击
:举个例子,比如某个论坛、或者社交网站之类的系统,你可以发布一些帖子,或者是评论,此时黑客就可以在里面写一段恶意脚本,然后把恶意脚本混杂在评论内容里提交到你的网站的数据库里去。后面比如其他用户在社交网站里浏览到了你的这个评论,评论内容会被返回到浏览器里去,此时评论内容是包含恶意js脚本的,马上恶意脚本运行。达到攻击的目的。
解决办法
- 消毒机制,对用户输入的内容进行转义,比如说把>转义为>之类的,这样就可以把恶意脚本里的html标签、js代码之类的东西,都给转义掉,让这些恶意脚本失效.
- HttpOnly方式,如果你在浏览器里存放cookie的时候,可以设置一个HttpOnly属性,比如说存放用户加密认证信息的cookie,这样的话,在浏览器里运行的js脚本是被禁止访问这些HttpOnly cookie的,他就无法窃取你在浏览器里存储的cookie了.
SQL注入
SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,比如删库等。要输SQL注入首先要知道数据库表结构。
获取数据库表结构的方法
:
- 使用开源软件
- 错误回显。程序报错,包含有SQL错误信息的语句显示在浏览器上。
- 根据你的请求参数的名称,大致推测你的数据库表结构
解决办法
- 关闭服务器的错误回显,只显示400之类的错误码
- 用预编译的方法,mybatis、hibernate都是支持预编译的。不要直接拼接SQL语句。
CSRF攻击
CSRF Cross Site Request Forgery,垮站点请求伪造。攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 简单来说,例如利用XSS跨站点脚本攻击,获取cookie,拿到你的用户信息,然后再伪造成你发送垮站点伪造请求。
解决方法
- 给网站的cookie设置HttpOnly属性,禁止被别人的script脚本窃取,防止cookie被窃取。
- 随机token,每次返回一个页面给你的时候,都生成一个随机token附加在页面的隐藏元素里,同时在你的redis里可以存一下,然后页面发送请求的时候附加随机token,验证通过才能执行请求。
- 验证码,页面提交必须验证码通过了才能执行你的请求,避免黑客直接伪造请求发送过来,最好是在用户进行支付交易等重要业务,要求必须在页面上拖拽一个拼图验证码。
- Referer请求头,http请求里有一个referer请求头,带有这个请求的来源,验证这个请求是不是从自己的页面里来的,如果是的话才执行,否则就不要执行。
上传文件攻击
网站允许上传文件的话,文件可能是执行的脚本、病毒或木马文件,如果是脚本的话,可能会在服务器执行,比如黑掉服务器、连接上数据库。
解决办法
- 进行白名单校验,限制上传文件的类型,只能是我们指定的,而且要限制文件的大小,对文件重命名
- 限制文件类型不能简单的根据后缀来判断,后缀可能被篡改,要根据文件二进制数据的开头几个字节代表的magic number来判断文件的类型。读取这个文件的二进制数据流,读取开头的几个字节,提取这个文件的魔数,根据魔数的值去判断他是什么类型的.
- 最好对文件进行一定的压缩,这样可以破坏原来的文件结构,避免文件在服务器执行,利用imagemagick这种开源包,可以很方便进行文件缩放
DDos攻击
distributed denial of service分布式拒绝服务攻击。黑客发送大量的请求,导致你的服务器线程资源全部打满,正常用户根本无法发送请求,网站就宕机了。
解决方法
- 可以采购云厂商的安全服务,比如DDoS高防IP,可以把攻击流量都导入到云厂商的高防IP的服务器上去,他们有专业的技术方案和算法来防御。
- 网关可以用redis做个IP限流。对于恶意IP禁止访问
PHP能否做多线程
资料:https://cloud.tencent.com/developer/article/1485905 PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 –enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。
LNMP下,如果遇到响应慢的情况你会怎么处理
参考资料:https://xrong.net/2016/02/16/lnmp%E8%AE%BF%E9%97%AE%E9%80%9F%E5%BA%A6%E5%8F%98%E6%85%A2%E6%8E%92%E6%9F%A5%E6%96%B9%E6%B3%95/ by the way:LNMP架构下各项配置优化总结:https://www.jianshu.com/p/59505b49d781
UDP与TCP的区别
TCP:传输控制协议,面向连接,需要三次握手 UDP:用户数据报协议,无连接
讲讲TCP连接的三次握手?为什么要三次而不是两次、四次?
三次握手
第一次:建立连接时,客户端发送SYN包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认。
第二次:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次:客户端收到服务器的SYN_ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务端都进入ESTABLEISHED状态。
为什么三次
这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足”在不可靠信道上可靠地传输信息”这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了
完成三次握手后,客户都安与服务器开始传数据。
讲讲TCP的四次挥手
https://juejin.cn/post/7030433088425426980
POST数据最大多少
post请求理论上没有限制,主要是后台服务器做的限制 参考资料:https://www.cnblogs.com/zxwBj/p/8689962.html
mysql数据隔离级别
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
脏读:所谓脏读是指一个事务中访问到了另外一个事务未提交的数据 幻读:一个事务读取2次,得到的记录条数不一致 不可重复读:一个事务读取同一条记录2次,得到的结果不一致
事务隔离级别(高->低) 隔离级别越高,事务的并发度越低
Serializable 避免脏读,不可重复读,幻读 Repeatable 在开启事务时,不再允许修改操作,可避免脏读,不可重复读(mysql 默认) Read committed 可避免脏读 Read uncommitted 啥都不可避免
索引的分类
参考资料:https://blog.csdn.net/qiuchaoxi/article/details/80010489
- 单列索引 普通索引、唯一索引、主键索引
- 组合索引
- 全文索引
- 空间索引
间隙锁
https://www.jianshu.com/p/32904ee07e56 https://cloud.tencent.com/developer/article/1415191
死锁的形成&解决方法
https://www.cnblogs.com/JimmyFanHome/p/9914562.html
索引的原理
https://zhuanlan.zhihu.com/p/113917726
redis使用场景
https://cloud.tencent.com/developer/article/1415674