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