面试经常提问
一:如果chmod-x/bin/chmod执行上述命令后,如何恢复
- 重装coreutils
- 安装busybox,使用busybox chmod + x /bin/chmod改回来
per版:sudo perl-e’chmod 0775,”/bin/chmod”
python3版:sudo python-c”import os;os.chmod(“/bin/chmod”,0755)”
二:一台电脑配置无限好,可以同时打开多少个网页?
65535-1024=64511(端口数)
三:ip地址能被伪造吗?
http头部可以被篡改,但是只能修改x_forwarded_for,真实ip地址(remote_addr)很难修改(除非是路由器去修改),因为真实ip是底层会话ip地址,而且因为tcp3次握手的存在,连接无法建立,伪造的意义不大,至于udp的话,一般是内网才使用udp通信。
四:有100万个奖品,每个人可以中奖3次,先到先得,怎么控制并发,不能发超,并保证完全的先到先得模式?
如果奖品相同,则在redis中初始化一个值5为100万的kv值,每当一个用户抽奖时,现在redis判断该用户的抽奖记录,如果抽奖记录小于3则可去抽奖,并增加抽奖记录。否则重定向到静态页面,直到100w奖品抽完为止。如果奖品不通,需要根据奖品种类初始化奖品种类数量的kv值,重复上面过程。
五:memcache和redis的区别?
- redis中,并不是所有的数据都一直存储在内存中的,这是和memcache相比一个最大的区别。
- redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而memcache只是简单的k/v缓存。
- 他们的扩展都需要做集群;实现方式:master-slave、hash。
- 在100k以上的数据中,memcache性能要高于redis
- 如果要说内存使用效率,使用简单的key-value存储的话,memcached的内存利用率更高,而如果redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memcache。当然这和你的应用场景和数据特性有关。
- 如果你对数据持久化和数据同步有所要求,那么推荐你选择redis,因为这两个特性memcache都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择redis也是明智的。
- redis和memcache在写入性能上面差别不打,读取性能上面尤其是批量读取性能上面memcache更强
- redis支持多种数据结构,如string,list,dict,set,,zset,hyperloglog一个网页从输入地址回车,到完整展示网页内容这段时间里,做了哪些工作,越详细越好。
- 浏览器本地缓存匹配
- 本地hosts映射对比
- 本地dns缓存解析
- 远程dns解析获得服务器ip地址
- 浏览器发送tcp连接请求包(syn)
- 请求包经过传输层、网络层、数据链路层封装通过网卡到达路由器
- 路由器转发数据包到所属运营商服务器
- 运营商服务器通过寻址最短路径通过中继节点到达指定ip地址
- 服务器端可能存在反向代理或者负载均衡,都是直接转发请求之上游服务器,当然也可以制定安全防御规则直接丢齐请求包
- 上游服务器收到连接请求,在自身可用的情况下,返回(syn+ack)
- 浏览器校验ack,再次发送(syn+ack)
- 服务器校验ack切换连接状态至established,然后根据请求传输数据包
- 当transform-encoding为chunked时浏览器开始渲染页面;四次挥手,连接关闭
- 渲染数据完成
六:http keep-alive是什么?
http协议采用“请求-应答”模式,当使用普通模式,即5非keepalive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(http协议为无连接的协议),当时用keep-alive模式(又称持久连接、连接重用)时,keep-alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,keep-alive功能避免了建立或者重新建立连接。
http1.0中默认是关闭的,需要在http头加入“connection:keep-alive”,才能启用keep-alive;http1.1中默认启用keep-alive如果加入“connection:close”,才关闭目前大部分浏览器都是用http1.1协议,也就是说默认都会发起keep-alive的连接请求了,所以是否能完成一个完整的keep- alive连接就看服务器设置情况。
七:myisam跟innodb有什么区别?
- innodb支持事务,myisam不支持,对于innodb每一条sql语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条sql语言放在begin和commit之间,组成一个事务;
- innodb支持外键,而myisam不支持。对一个包含外键的innodb表转为myisam会失败;
- innodb是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而myisam是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
- innodb不保存表的具体行数,执行select count(*) from table时需要全表扫描。而myisam用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
- innodb不支持全文索引,而myisam支持全文索引,查询效率上myisam要高;
八:什么是 csrf 攻击 ?xss 攻击?如何防范?
xss定义的主语是“脚本”,是一种跨站执行的脚本,也就是javascript脚本,指的是在网站上注入我们的javascript脚本,执行非法操作。
csrf定义的主语是”请求“,是一种跨站的伪造的请求,指的是跨站伪造用户的请求,模拟用户的操作。
防御xss攻击可以通过以下两方面操作:
对用户表单输入的数据进行过滤,对javascript代码进行转义,然后再存入数据库;
在信息的展示页面,也要进行转义,防止javascript在页面上执行。
csrf攻击的防御可以通过以下两方面操作:
所有需要用户登录之后才能执行的操作属于重要操作,这些操作传递参数应该使用post方式,更加安全;
为防止跨站请求伪造,我们在某次请求的时候都要带上一个csrf_token参数,用于标识请求来源是否合法,csrf_token参数由系统生成,存储在session中。