小迪安全 Web安全 PHP开发 – 第十四天 – 个人博客项目&输入输出类&留言板&访问IP&UA头
一、输入输出类
(一)PHP实现搜索查询功能
1、网站获取用户输入的数据后,连接到数据库检索用户输入的信息,再将搜索结果返回给用户,从而实现搜索查询的功能。
2、代码示例
(1)index主页,搜索框
php搜索查询
(2)config/conn.php数据库连接配置文件
<?php #设定参数 $servername = "localhost"; $username = "root"; $password = "root"; $database = "mysql"; #创建连接 $conn = mysqli_connect($servername, $username, $password,$database); #检查连接 if(!$conn){ die("连接失败:" . mysqli_connect_error()); } $db_select = mysqli_select_db($conn,'mysql'); if(!$db_select){ die("连接失败:" . mysqli_connect_error()); } #echo "连接成功!"; ?>
(3)search.php文件,处理用户输入的数据
<?php include('config/conn.php'); $s = $_POST['search']; $sql = "SELECT * FROM engine_cost WHERE cost_name LIKE '%$s%'"; $result = mysqli_query($conn,$sql); #检测查询错误 if (!$result) { printf("Error: %s\n", mysqli_error($conn)); exit(); } echo '你搜索的:'. "$s" . '结果如下:'; #输出搜索结果 while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)){ echo '
'; echo $row['engine_name'] . '
'; echo $row['device_type'] . '
'; echo $row['cost_name'] . '
'; } ?>
(二)搜索查询界面容易出现的漏洞
1、由于需要把用户输入的数据连接到数据库中进行查询,再将查询结果结果返回给用户,因此容易出现SQL注入。
2、搜索框输入过滤若处置不当,则容易引发XSS跨站漏洞,用户输入代码会被执行,用户可通过XSS跨站攻击窃取网站cookie。
二、留言板
(一)PHP实现留言功能
1、留言板的功能:
(1)加载之前的内容
(2)提交留言
(3)提交留言后被加载
(4)留言内容会被存储在数据库中。
2、代码示例
(1)前端主页面
php留言板 留言板
留言内容:
(2)后端liuyan.php文件处理用户提交数据
<?php #设置php编码格式 header("Content-type:text/html;Charset=utf-8"); include('config/conn.php'); $a = $_POST['account']; $n = $_POST['name']; $m = $_POST['mail']; $c = $_POST['content']; #测试留言输入显示 #echo 'ID:' . $a . ', 昵称:' . $n . ', 邮箱:' . $m . ', 内容:' . $c . '
'; #将留言插入数据库 $sql1 = "INSERT INTO liu_yan_ban(account,name,mail,content) VALUES('$a','$n','$m','$c');"; mysqli_query($conn,$sql1); #若ID为空,语句不执行 /* if(!empty($i)){ $sql1 = "INSERT INTO liu_yan_ban(account,name,mail,content) VALUES('$a','$n','$m','$c');"; mysqli_query($conn,$sql1); }*/ #将保存到数据库的留言内容显示出来 $sql2 = "SELECT * FROM liu_yan_ban"; $result = mysqli_query($conn,$sql2); #检查查询错误 if (!$result) { printf("Error: %s\n", mysqli_error($conn)); exit(); } while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)){ echo '
'; echo '账号:' . $row['account'] . '
'; echo '昵称:' . $row['name'] . '
'; echo '邮箱:' . $row['mail'] . '
'; echo '内容:' . $row['content'] . '
'; } ?>
(3)config/conn.php文件
<?php #设定参数 $servername = "localhost"; $username = "root"; $password = "root"; $database = "liu_yan_ban"; #创建连接 $conn = mysqli_connect($servername, $username, $password,$database); #检查连接 if(!$conn){ die("连接失败:" . mysqli_connect_error()); } $db_select = mysqli_select_db($conn,'liu_yan_ban'); if(!$db_select){ die("连接失败:" . mysqli_connect_error()); } #echo "连接成功!"; ?>
(二)易出现的漏洞
1、由于留言、评论、私信等用户输入输出数据会被存储到数据库中,若站点对用户数据处理不当,则易出现存储型跨站攻击。
(三)发现该类型漏洞思路
1、代码审计。
2、寻找用户能够控制页面输出内容的地方。
三、PHP全局变量$_SERVER
1 、 $_SERVER全局变量可用于获取浏览器、IP地址、设备系统等信息。
四、CSRF跨站点请求伪造
(一)概述
1、攻击者知道某个管理员的习惯,在某个管理员喜欢浏览的平台上植入JS代码网页,能够获取管理员管理的网站信息。
2、管理员去访问该平台会触发代码
3、由于管理员浏览器可以直接登录网站,攻击者从而获取网站管理权限。
(二)防范方法
1、管理的网站:检测来源,过滤攻击。
五、$_SERVER详解
$_SERVER[‘HTTP_ACCEPT_LANGUAGE’]//浏览器语言
$_SERVER[‘REMOTE_ADDR’] //当前用户 IP 。
$_SERVER[‘REMOTE_HOST’] //当前用户主机名
$_SERVER[‘REQUEST_URI’] //URL
$_SERVER[‘REMOTE_PORT’] //端口。
$_SERVER[‘SERVER_NAME’] //服务器主机的名称。
$_SERVER[‘PHP_SELF’]//正在执行脚本的文件名
$_SERVER[‘argv’] //传递给该脚本的参数。
$_SERVER[‘argc’] //传递给程序的命令行参数的个数。
$_SERVER[‘GATEWAY_INTERFACE’]//CGI 规范的版本。
$_SERVER[‘SERVER_SOFTWARE’] //服务器标识的字串
$_SERVER[‘SERVER_PROTOCOL’] //请求页面时通信协议的名称和版本
$_SERVER[‘REQUEST_METHOD’]//访问页面时的请求方法
$_SERVER[‘QUERY_STRING’] //查询(query)的字符串。
$_SERVER[‘DOCUMENT_ROOT’] //当前运行脚本所在的文档根目录
$_SERVER[‘HTTP_ACCEPT’] //当前请求的 Accept: 头部的内容。
$_SERVER[‘HTTP_ACCEPT_CHARSET’] //当前请求的 Accept-Charset: 头部的内容。
$_SERVER[‘HTTP_ACCEPT_ENCODING’] //当前请求的 Accept-Encoding: 头部的内容
$_SERVER[‘HTTP_CONNECTION’] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER[‘HTTP_HOST’] //当前请求的 Host: 头部的内容。
$_SERVER[‘HTTP_REFERER’] //链接到当前页面的前一页面的 URL 地址。
$_SERVER[‘HTTP_USER_AGENT’] //当前请求的 User_Agent: 头部的内容。
$_SERVER[‘HTTPS’]//如果通过https访问,则被设为一个非空的值(on),否则返回off
$_SERVER[‘SCRIPT_FILENAME’] #当前执行脚本的绝对路径名。
$_SERVER[‘SERVER_ADMIN’] #管理员信息
$_SERVER[‘SERVER_PORT’] #服务器所使用的端口
$_SERVER[‘SERVER_SIGNATURE’] #包含服务器版本和虚拟主机名的字符串。
$_SERVER[‘PATH_TRANSLATED’] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER[‘SCRIPT_NAME’] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER[‘PHP_AUTH_USER’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER[‘PHP_AUTH_PW’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER[‘AUTH_TYPE’] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型