一 :传统web服务和api服务器的区别

1;传统的web服务由nginx或者apache这种的中间件搭配web项目(php,java,go,python),在web项目当中包含html,css,js代码;返回会的是一个界面;

2,api服务器由nginx或者apache这种的中间件搭配web项目(php,java,go,python);没有资源文件(html,css,js)没有界面!,最大的区别是:API服务器返回的是JSON->{"code": 200,"msg":"登录成功"}

API服务器中前端和后端是分离的,后端的API服务器单独运行在一个服务器上(主机),界面的项目(HTML,CSS,JS)编写的项目存放在另一台服务器上(主域名解析在这个主机上),

NGINX(当作提供web服务的软件,能负载均衡(C语言编写))

二,SQL注入

###   ///localhost/index.php?username=admin&password=123123

### $username = $_POST['username '];   //通过post协议获得参数的值;

###  $sql=" select * from users where username = ' $username';";

### mysqli_real_escpail($username)   //特殊字符进行转义\

### $mysqli->query($sql);

### echo $result;

1. SQL注入的理解

a. 数据交互的地方(比如上边的例子只有username在代码中进行交互,所以只有真正参与到数据交互的位置才能实现SQL注入)

b. 闭合

c. 拼接(在闭合后面插入自定义的SQL语句)

2.  SQL注入的分类

基本思路:   1,确定数据交互的参数(id)  2,尝试闭合("   ')3.构造语句

    a. 联合查询   ->1.确定列数(order by ?)(union select 1,2,3)

   b. 报错注入->1.前提后端代码必须存在mysql_error()等报错函数,且必须存在网页中(updatexml,floor,extractvalue,polygon,geometrycollection,linestring,multipoint,multlinestring,multipolygon ,exp)

xml:(就是可以自定义标签的html)

200

登录成功

uptatexml原理:第一个参数200登录成功

第二个xpath语法:/resp/code/

第三个位置:一个确切的值

eg:

select uptadexml('200登录成功','/resp/code/',500)

                   xml本体,xpath语法,要修改的值

0x7e波浪线只是链接符可以被替换比如{}

   c.二次注入(一开始插入了恶意字符由与后端有防护并没有起到sql注入作用,但是这个值确确实实存在数据库里面,当项目下次在次使用这个参数时,参数拿出来时没有进行过滤,导致原有的单引号拼接到新的sql语句中去产生sql注入)->1,

  d.堆叠注入->mysql_multi_query;可执行多条的独立的sql语句

  e.宽字节注入->数据库使用的gbk编码;gbk编码中的转义编码为%5c  两个url编码会被识别为一个汉字从而造成单引号的逃逸,(/=%5c %df %5c可以组成一个汉字)

  f.延迟注入->看不到回显的位置(利用if(length(select schema())=8#第一个位置为条件,sleep(5)#第二个位置为真输出的结果,sleep(0)#第三位值为假输出的结果)语句)

通过if语句和其他函数(substring,ascii,length,sleep())

  g.布尔盲注  ->sql语句执行正确页面显示一个效果,执行错误显示另一个效果

盲注的利用手法:DNSLOG数据外带-利用mysql函数load_file() 去远程服务器上加载指定的资源从而实现数据外带;通常用来验证漏洞

三:sql注入怎么防范

1.转义

2.预编译(php(prepare预编译sql语句 ,bind_params给预编译的sql语句变量传值 ))(java  PrepareStatementa类)

3.防火墙设备(WAF)

php开发:

1,$_GET[]    $_POST[]    $_SESSION[]    $_COOKIE[]

2,序列化和反序列化,

a,序列化的意义

b,要能看清序列化的内容

c.能讲出来序列化和反序列化的名字(serialize)(unserialize)

三,文件包含

a,文件包含的意义

b,文件包含的本质——代码的复制

c,文件包含的长用函数有哪些,有那些区别?

require引入一个不存在的文件,会抛出错误,从而终止程序的运行

include引入一个不存在的文件,只会抛出警告,但不影响程序的运行

require_once或者include_once无论在同一个代码中出现多少次,都只会引入一次

PHP项目:

1.先明白PHP在web开发当中的便捷性,以上手,所以PHP成为早期WEB开发的首选

2.使用PHP实现登录功能,在代码层了解业务 (功能)实现原理

3.在代码层面学习Cookie和session身份认证机制

Cookie:

a.SQLITE数据库单文件,存放在客户端的浏览器目录下

b.浏览器每次请求域名都会自动携带该域名下对应的Cookie:(特性);将Cookie的值放在HTTP协议的头部(Cookie);

c.Cookie中的值以键值对的形式存在sessionid=??????;

d.服务端通过SET_Cookie这个函数为客户端设置对应的Cookie;

session

a.存放在服务端的某一个文件夹下,无后缀的文件;

b.文件名称就是SessionID;

c.session虽然不是一个数据库,但是可以以文本的形式查看,所以session文件中可以存放关键信息的;

Cookie和Session协作实现身份认证的机制是什么?

1.用户向服务器发起登录请求

2.服务器允许登录后,创建session,并将sessionid以set_cookie的方式设置到客户端的浏览器中的Cookies数据库中;

3,当用户再次访问该网站时,Cookie就会将该域名下对应的所有的Cookie,包括上一步中SET-cookie中设置的sessionid也带上 ;

4.服务端在请求包中获取Cookie中sessionid 查找服务端有没有和sessionid同名的sesion文件,并查看对应的session文件中是否包含登录的标记,如登录后会将用户名存放在session中,如果有,代表登录过,如果没有,代表没有登录过

 

查看原文