这章主要有关安全性问题:
一个管理员页面用于删除数据库数据的,首先就不能每个人都能访问得到的,保护页面可以用的办法:HTTP认证
HTTP认证需要用到首部,首部是什么呢?
平时常说的浏览器发出一个请求,web服务器就返回一个html页面,那么发出的那些请求具体的就是首部(个人理解)
浏览器发出首部告诉服务器我要访问admin.php,然后服务器就运行php,在php代码中利用header()函数发出首部,告诉浏览器先去获取账号密码,对了就运行怎样的代码,错了又运行怎样的代码,完全在php中定义。
要求HTTP认证的首部是:
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate:Basic realm="Guitarwars"');
如果按cancel代码会往下执行,按确定会重新执行代码(网上关于这个的运行流程几乎没有关资料,这个是我自己实验得到的结论),用户填写的账号密码保存在超级全局变量中:$_SERVER['PHP_AUTH_USER']和
$_SERVER['PHP_AUTH_PW']
一般的用法:
<?php
if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']))
{
//如果不存在账号密码,表明是第一次打开这个页面
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate:Basic realm="Guitarwars"');
exit('你按取消按钮了');
}
else//浏览器把用户输入的账号密码发过来了
{
if($_SERVER['PHP_AUTH_USER']=='123' && $_SERVER['PHP_AUTH_PW']=='123')//账号密码正确
{
echo 'Welcome!';
}
else//账号密码有问题
{
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate:Basic realm="Guitarwars"');
exit('你按取消按钮了');
}
}
?>
从admin.php中产生到remove.php的连接,remove.php并没有设置HTTP认证,完全可以绕过admin.php的认证,直接使用remove.php,所以remove.php同样也是需要有个HTTP认证的,只要保证那个realm=""的东西相同,那么浏览器会在你第一次填写好账号密码记录下来,不需要多次填写。
HTTP认证的作用有2个:(1)使得有限制的页面需要钥匙才能打开(2)记录用户的存在,多个需要登录才能访问的页面,只要登录了一次,去其他页面都不需再填写登录信息,因为已经记录你了(并且这个记录是你没办法注销的,这是缺点)
针对于SQL注入攻击:
利用表单域填写好完整的sql语句,再来个SQL的注释符号就能使得你原本在php中设计好的query语句作废,转而使用他的语句来进行攻击。避免这样的情况:
trim($username);可以去掉$username的前后空格
mysqli_real_escape_string($dbc,$username);把有危险的字符进行转义
另外保证那些可以赋予默认值的数据库表列的值不好主动赋值,例如设置了AUTO_INCRMENT自动增加就没必要在INSERT里面赋值,也可以用DEFAULT来为列指定默认值
ALTER TABLE guitarwars MODIFY COLUMN approved TINYINT DEFAULT 0;