回顾
会话技术:cookie和session
cookie:将数据保存到浏览器(HTTP协议设置响应头)
设置cookie:setcookie(名字,值,过期时间,作用域,域名);
读取cookie:$_COOKIE
session:将数据保存到服务器(默认是文件形式存在),依赖cookie(PHPSESSID=sessionid)
流程:开启session(session_start);$_SESSION处理数据(读和写);写入session/session_destroy
什么时候用cookie?什么时候用session?
数据安全性要求较高的使用session;安全性不高的就存放到cookie。
面试题:浏览器可以禁用cookie,session基于cookie实现。如果浏览器禁用了cookie,还能使用session吗?如果可以,如何实现?
session是基于cookie,需要cookie保存sessionid,如果禁用了cookie,session不能脱离cookie。如果用户在浏览器端自己禁用了cookie,用户得自己承担不能使用网站的责任。
可以模拟:
利用a标签的href,但是可以通过修改配置项,让系统自动的为a标签增加sessionID参数,并且session_start能自动去获取这些信息
修改配置文件
禁用只允许使用cookie保存sessionid 的配置
使用a标签的href属性来保存sessionid
效果1:系统自动为a标签增加sessionid
效果2:系统自动在session_start的时候从a标签中的url中获取sessionid
利用session_id和session_name函数,session_name获取PHPSESSID,session_id可以获取sessionid的值,还可以修改sessionid的值
记住用户登录信息
1. 在登录界面的时候,给用户提供一个表单选项,让用户能够选择是否记住用户信息。/admin/templates/login.html
checkbox:只有被勾选才会被提交,否则不会提交
2. 接收数据。/admin/privilege.php?act=check
3. 修改判断用户登录的逻辑。/admin/index.php
4. 通过保存的cookie帮助用户登录系统。/admin/index.php
5. 新增通过用户id获取用户信息的方法。/admin/includes/User.class.php
6. 接收执行结果,并进行判断。/admin/index.php
7. 登录成功要更新用户信息。/admin/index.php
8. 修改退出逻辑:用户如果主动点击退出,意味着希望下次不要直接登录,希望自己手动登录。/admin/privilege.php?act=logout
SQL注入
SQL注入:利用SQL语句的语法漏洞,以及程序员的操作漏洞,使用一组能够截断一条正常的SQL语句的数据,将数据拼凑到对应的SQL语句中,SQL语句就不能正常工作,从而实现破解。
万能密码:1’ or ‘1 = 1’; #
正常SQL语句
$sql = “select * from sh_user where u_username = ‘{$name}’ and u_password = ‘{$pass}’”;
SQL注入之后
select * from sh_user where u_username = ‘1’ or ‘1=1’;#’ and u_password = ‘345678’;
SQL注入防止
1. 将用户名和密码查询方式修改:使用用户名获取信息,然后在外部进行密码判断
$sql = “select * from sh_user where u_username = ‘{$name}’;
外部进行密码判断,必须密码一致才能成功。
2. 对数据进行特殊字符转义:引号,语句结束符,注释符
addslashes:增加转义符号
验证码
1. 什么是验证码?
验证码是用于判断人和机器的。机器能识别文字,不能识别图片,人能够轻而易举的将图片中的文字给识别处理。
验证:captcha:Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的图灵测试)
验证码逻辑:服务器在图片上保存一堆文字,用户选出图片上的文字,服务器比较两堆文字。
php本身不能处理图片,必须借助图片处理扩展。有很多扩展
加载图片扩展
加载GD扩展,当时在安装ecshop已经加载了gd扩展。
图片操作
1. 准备一张画布:长和宽
imagecreatetruecolor:创建一个指定长和宽的画布,返回一个图片资源
2. 在图片资源上进行操作:背景,文字,图片…
a) 背景:
图片如果要使用某种颜色,那么事先必须先分配颜色到该图片资源上,之后才能使用。
imagecolorallocate:给画布分配一个颜色,返回的是一个颜色句柄(整型)
int imagecolorallocate (图片资源, 红色整型, 绿色整型 , 蓝色整型 ),值的范围是0-255或者十六进制的0x00-0xff
分配背景色
imagefill:填充背景色
bool imagefill ( resource $image , 起始点x , 起始点y , 颜色 );从某个点开始,只要是相邻的且颜色一致的点都会被渲染
b) 文字:将一堆文字印在图片(在图片的某个位置写字)
imagestring:在指定图片资源的某个位置写字
bool imagestring ( resource $image ,字体1-5 ,起始x , 起始y , 要写的文字 , 文字颜色 )
3. 保存图片:输出和保存成文件
imagepng:将图片以png的格式输出
bool imagepng ( resource $image [, 文件名字 ] ):如果没有第二个参数,就是输出图片,如果有第二个参数就是保存图片
a) 输出图片
必须告诉浏览器当前返回结果的类型是图片类型:image/png
b) 保存图片
4. 释放资源
imagedestroy:释放制定的图片