小迪安全 Web安全 PHP开发 – 第十四天 – 个人博客项目&输入输出类&留言板&访问IP&UA头
Posted SecurityHacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小迪安全 Web安全 PHP开发 – 第十四天 – 个人博客项目&输入输出类&留言板&访问IP&UA头相关的知识,希望对你有一定的参考价值。
一、输入输出类
(一)PHP实现搜索查询功能
1、网站获取用户输入的数据后,连接到数据库检索用户输入的信息,再将搜索结果返回给用户,从而实现搜索查询的功能。
2、代码示例
(1)index主页,搜索框
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php搜索查询</title> </head> <body> <ul> <li><a href="search.php">访问查询</a></li> </ul> <p> <form id="form1" action="search.php" method="POST"> <label for="search">内容搜索</label> <input type="search" name="search" id="search" /> </form> </P> </body> </html>
(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 \'<br><br><br>\'; echo $row[\'engine_name\'] . \'<br>\'; echo $row[\'device_type\'] . \'<br>\'; echo $row[\'cost_name\'] . \'<br>\'; ?>
(二)搜索查询界面容易出现的漏洞
1、由于需要把用户输入的数据连接到数据库中进行查询,再将查询结果结果返回给用户,因此容易出现SQL注入。
2、搜索框输入过滤若处置不当,则容易引发XSS跨站漏洞,用户输入代码会被执行,用户可通过XSS跨站攻击窃取网站cookie。
二、留言板
(一)PHP实现留言功能
1、留言板的功能:
(1)加载之前的内容
(2)提交留言
(3)提交留言后被加载
(4)留言内容会被存储在数据库中。
2、代码示例
(1)前端主页面
<html> <head> <meta charset=""utf-8"> <title>php留言板</title> </head> <body> <h1>留言板</h1> <form id="form2" action="liuyan.php" name="form2" method="post"> <p> <label for="textfield1">账号:</label> <input type="text" name="account" id="account"> </p> <p> <label for="textfield2">昵称:</label> <input type="text" name="name" id="name"> </p> <p> <label for="textfield3">邮箱:</label> <input type="text" name="mail" id="mail"> </p> <p> <label for="textarea">文本内容</label> <textarea name="content" id="content"></textarea> </p> <p> <input type="submit" name="submit" id="submit" value="提交"> </p> </form> <p> <hr> </p> <p>留言内容:</p> <hr> <p> </p> </body> </html>
(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 . \'<br>\'; #将留言插入数据库 $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 \'<br>\'; echo \'账号:\' . $row[\'account\'] . \'<br>\'; echo \'昵称:\' . $row[\'name\'] . \'<br>\'; echo \'邮箱:\' . $row[\'mail\'] . \'<br>\'; echo \'内容:\' . $row[\'content\'] . \'<br>\'; ?>
(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 认证功能,这个变量便是认证的类型
以上是关于小迪安全 Web安全 PHP开发 – 第十四天 – 个人博客项目&输入输出类&留言板&访问IP&UA头的主要内容,如果未能解决你的问题,请参考以下文章