小迪安全 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 认证功能,这个变量便是认证的类型