一、web 安全常见的有哪几种,xss 跨站 sql注入,请分别单独说明攻击,危害,防范

1、sql注入

sql注入是将制作好的SQL注入用户输入字段的一种技术,用来绕过自定义登录到网站,也可以用于登录或者接管一个网站。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据。
防范:
– 数据库防火墙
– 过滤的所有输入字段单引号(‘ )
– 过滤器SQL命令的所有输入字段

2、xss跨站脚本攻击

攻击者在网页中嵌入客户端脚本(例如JavaScript), 用户浏览网页就会触发恶意脚本执行。 比如获取用户的Cookie,导航到恶意网站,携带木马等。
防范:

  • 文本输入中对js关键字做编码,让回给用户浏览器的js不可执行
  • 浏览器的同源策略,浏览器只允许访问cookie的IP+port必须同最初创建cookie的ip+port相同
  • web app或者浏览器提供“禁用script”的选项

  • 验证所有输入数据,有效检测攻击(某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。 );

  • 对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行(数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。)。

3、 DDos拒绝服务攻击

利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。这种请求不可避免,但可以加强防御。
攻击:
– 消耗包括网络带宽、存储空间、CPU 时间等资源;
– 破坏或者更改配置信息;
– 物理破坏或者改变网络部件;
– 利用服务程序中的处理错误使服务失效

防范:
限流

4、文件上传漏洞

攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。
攻击:
– 上传web脚本程序,使web容器解释执行上传的文件;
– 病毒、恶意程序,并诱导用户下载执行;
– 包含脚本的图片,某些浏览器低版本会执行。

防范:
– 阻止非法文件上传,通过限制上传文件的格式等等。
– 阻止非法文件被执行,存储目录与发布站点隔离、控制可执行权限等等。

二、从 nginx phpfpm php.ini 方面说说如何优化

Nginx:

  • 与PHP通信方式选择,unix_socket低并发下减少不必要的tcp开销,高并发下不稳定,高并发tcp_socket,面向连接保证通信的完整性和正确性。
    unix_socket可以通过下面两种方式提高稳定性:
      1)调高nginx和php-fpm中的backlog
       配置方法为:在nginx配置文件中这个域名的server下,在listen 80后面添加default backlog=1024。
      同时配置php-fpm.conf中的listen.backlog为1024,默认为128。
      2)增加sock文件和php-fpm实例数
      再新建一个sock文件,在Nginx中通过upstream模块将请求负载均衡到两个sock文件背后的两套php-fpm实例上。
  • 合理配置nginx处理请求数
#cat /proc/cpuinfo | grep processor #查看服务器cpu的处理器数量
# vi /etc/nginx/nginx.conf
worker_processes 16;  #修改为处理器数量
events { 
  worker_connections 4096; # 单个woker进程最大连接并发数 
  multi_accept on;  #linux2.6+默认epoll,如果使用了更优秀的kqueue模型,则使用默认off。
}
  • 禁止访问日志文件
    高流量站点涉及大量I/O,必须在线程间同步。
# nginx.conf
access_log off; 
log_not_found off; 
error_log /var/log/nginx-error.log warn;

如果不能关闭日志访问,至少设置缓冲

access_log /var/log/nginx/access.log main buffer=16k;
  • 启用GZip
# nginx.conf
gzip on; 
gzip_disable "msie6"; 
gzip_vary on; 
gzip_proxied any; 
gzip_comp_level 6; 
gzip_min_length 1100; 
gzip_buffers 16 8k; 
gzip_http_version 1.1; 
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  • 缓存经常访问的文件
# nginx.conf
open_file_cache max=2000 inactive=20s; 
open_file_cache_valid 60s; 
open_file_cache_min_uses 5; 
open_file_cache_errors off;
  • 调整客户端超时
# nginx.conf
client_max_body_size 50M; 
client_body_buffer_size 1m; 
client_body_timeout 15; 
client_header_timeout 15; 
keepalive_timeout 2 2; 
send_timeout 15; 
sendfile on; 
tcp_nopush on; 
tcp_nodelay on;
  • 调整输出缓冲区
# nginx.conf
fastcgi_buffers 256 16k; 
fastcgi_buffer_size 128k; 
fastcgi_connect_timeout 3s; 
fastcgi_send_timeout 120s; 
fastcgi_read_timeout 120s; 
fastcgi_busy_buffers_size 256k; 
fastcgi_temp_file_write_size 256k; 
reset_timedout_connection on; 
server_names_hash_bucket_size 100;

php-fpm:

php-fpm优化在开启的fpm进程数,两种方式:静态(static)和动态(dynamic)
两种方式都是根据服务器的内存进行设置,一般一个php-cgi占用的内存是20m,动态方式关键参数:

pm=dynamic
pm.max_children=x   #限定php-fpm的最大进程数
pm.start_servers=x   #起始php-fpm进程数量
pm.min_spare_servers=x  #空闲状态下的最小php-fpm进程数量
pm.max_spare_servers=x #空闲状态下的最大php-fpm进程数量

对于内存足够大的服务器,其实可以使用静态模式,因为php-fpm进程不断开关也会耗费不少资源

另外,还有几个需要注意的参数
– pm.max_requests #单个子进程处理的最大请求数,处理完最大请求数就重启进程
由于php-cgi回收内存不是释放给操作系统的,所以php-cgi占用了大量内存,适当降低该参数能让php-cgi自动释放内存
– request_terminate_timeout #脚本执行的最大时间,0为不限制,生产环境需要设置限制时间
– 开启慢日志
查询慢日志命令

grep -v "^$" www.log.slow.tmp | cut -d " " -f 3,2 | sort | uniq -c | sort -k1,1nr | head -n 50
  • rlimit_files = 1024; 增加php-fpm打开文件描述符的限制

php.ini

  • max_execution_time #设置脚本执行最大时间
  • 开启opcode代码缓存
  • memory_limit #设置单个进程使用系统的内存,默认128M,小型应用可减低该值,中大型可提高该值
  • 文件上传
file_uploads = 1  #是否允许文件上传
upload_max_filesize = 10M #文件上传大小限制
max_file_uploads = 3  #单次请求上传文件个数限制
  • 会话处理
    PHP 默认的会话处理程序会拖慢大型应用,因为这个处理程序会把会话数据存储在硬盘中,需要创建不必要的磁盘 I/O,浪费时间。我们应该把会话数据保存在内存中,例如可以使用 Memcached 或 Redis。这么做还有个额外好处 —— 以后便于伸缩。如果会话数据存储在硬盘中,不便于增加额外的服务器,如果把会话数据存放在 Memcached 或 Redis 里,任何一台分布式 PHP-FPM 服务器都能访问会话数据。
session.save_handler = 'memcached'
session.save_path = '127.0.0.1:11211'
  • 缓冲输出
    默认情况下,PHP 已经启用了输出缓冲功能,PHP 缓冲 4096 字节的输出之后才会把内容发送给 Web 服务器,推荐配置如下:
output_buffering = 4096
implicit_flush = false

注:如果想要修改输出缓冲区的大小,确保使用的值是4(32位系统)或8(64位系统)的倍数。

  • 真实路径缓存
    PHP 会缓存应用使用的文件路径,这样每次包含或导入文件时就无需不断搜索包含路径了,这个缓存叫真实路径缓存(realpath cache),如果运行的是大型的 PHP 文件(如 Composer 组件),使用了大量文件,增加 PHP 真实路径缓存的大小能得到更好的性能。

真实路径缓存的默认大小是 16K,这个缓存所需的准确大小不容易确定,不过可以使用一个小技巧:首先,增加真实路径缓存的大小,设置为特别大的一个值,如 256K,然后,在一个 PHP 脚本的末尾加上 print_r(realpath_cache_size());,输出真实路径缓存的真正大小,最后,把真实路径缓存的大小改为这个真正的值。我们可以在 php.ini 文件中设置真实路径缓存的大小:

realpath_cache_size = 64K

三、如何从nginx log 获取独立访问ip,仅限linux命令

cat nginx/test.feed.ids111.com.access.log | cut -d " " -f 1

四、有一个 abc 索引,a = 1 b > 2 c=3,这个查询条件,能不能命中 abc 索引,如果不能,为什么,如果可以,又是为什么,有优化的空间吗

能命中,但不好。(早期mysql如果顺序不一样不能命中)

最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

五、composer 是如何自动加载的。

基于PHP PSR4规范(自动加载规范)

六、session 如何共享,若使用php自带的session,如何精确的把过期的session清除

放到mencached或者redis,memcache和redis的回收机制不是按照机率的,所以可以精确清除

七、PHP规范

八、redis如何持久化

  • RDB 持久化,将 redis 在内存中的的状态保存到硬盘中,相当于备份数据库状态。
  • AOF 持久化(Append-Only-File),AOF 持久化是通过保存 Redis 服务器锁执行的写状态来记录数据库的。相当于备份数据库接收到的命令,所有被写入 AOF 的命令都是以 redis 的协议格式来保存的。

1 对 “PHPer”的想法;

发表评论

电子邮件地址不会被公开。 必填项已用*标注