PHP&小迪学习笔记
后台-插件-广告管理-内容页头部广告(手机) |
PHP开发
- PHP开发
- 个人博客项目-数据库操作-数据库接受
- 开发环境
- PHP操作MySQL
- PHP 中GET、POST、REQUEST用法
- 个人博客项目-文件操作类-编辑器-上传下载删除读写
- 知识点
- 文件上传
- HTML上传表单(上传文件)
- PHP_FILES函数
- move_uploaded_file() 函数
- 编辑器编写代码(ueditor)
- thinkphp框架
- 文件下载
- 直接下载
- 传参下载
- 总结
- 文件删除
- 文件夹删除
- 文件读取
- 文件写入
- 个人博客项目&输入&输出&留言板&访问IP
- 知识点
- 个人博客项目&登陆验证&Cookie&Session&验证码安全
- 知识点
- 登陆模块流程
- cookie验证
- 万能密码
- 个人博客项目&JS-Ajax&前端逻辑&购物&上传
- 知识点
- 1.文件上传 - 类型 - 过滤
- 2.状态回显- 登陆 - 状态码
PHP开发
个人博客项目-数据库操作-数据库接受
开发环境
DW + PHPStorm + PhpStudy + Navicat Premium
DW : HTML&JS&CSS开发(Dreamweaver) PHPStorm : 专业PHP开发IDE PhpStudy :Apache MYSQL环境 Navicat Premium: 全能数据库管理工具- 1
- 2
- 3
- 4
HTML横向导航 超链接设置
PHP操作MySQL
1.连接数据库
mysqli_connect()函数 填写连接数据库的账号密码
$conn=mysqli_connect('127.0.0.1','root','root');//连接数据库,返回连接的对象- 1
2.选择数据库
mysqli_select_db()函数,第一个参数是你之前的连接返回的对象,第二个参数是你的数据库
mysqli_select_db($conn,'ceshi');//选择数据库- 1
3.设置字符集
mysqli_set_charset()函数
mysqli_set_charset($conn,'utf-8'); //设置字符集- 1
4.执行查询语句
直接给一个查询语句字符串
这个是定义SQL语句
$sql='select * from test'; //查询语句- 1
mysqli_query()
执行SQL语句
$result=mysqli_query($conn,$sql); //在$conn这个数据库执行$sql查询语句- 1
5.关闭数据库
使用完以后一定要关闭数据库
mysqli_close($conn); //关闭数据库- 1
Whlie( o b j = m y s q l f e t c h o b j e c t ( obj = mysql_fetch_object( obj=mysqlfetchobject(result)){
echo $row[‘id’];
echo $row[‘content’];
}
Php里面可以插入HTML代码,HTML里面可以插入PHP代码 PHP中有变量就用双引号,双引号不会解析变量- 1
- 2
为了避免麻烦,出现了数据库配置文件。
源码泄露会导致数据库配置文件泄露,就表示账号密码被泄露。数据泄露,管理员账号泄露。
用include来包含
比如: include("/config/conn.php");- 1
- 2
PHP 中GET、POST、REQUEST用法
GET方法:GET方法用于从URL中获取参数。通过GET方法发送的参数会附加在URL后面,形成类似于example.com/page.php?param1=value1¶m2=value2的形式。在PHP中,通过$_GET超全局变量可以获取这些参数的值。例如,如果想获取名为id的参数的值,可以使用$_GET['id']来获取。 $i = $_get[id]; echo $i;- 1
- 2
- 3
POST方法
POST方法:POST方法用于通过HTTP请求体发送参数。与GET方法不同,POST方法将参数放在请求体中,而不是URL上。 在PHP中,可以通过$_POST超全局变量来获取通过POST方法发送的参数的值。例如,如果想获取名为param1的参数的值,可以使用$_POST['param1']来获取。- 1
- 2
REQUEST方法
REQUEST方法:REQUEST是一个包含了GET、POST和COOKIE参数的超全局变量。它可以用于获取通过GET和POST方法发送的参数,以及通过COOKIE设置的参数。在PHP中,可以通过$_REQUEST超全局变量来获取这些参数的值。例如,如果想获取名为param1的参数的值,可以使用$_REQUEST['param1']来获取。- 1
需要注意的是,使用GET方法传递的参数会显示在URL上,因此不适合传递敏感信息。而POST方法将参数放在请求体中,更适合传递敏感信息。选择使用哪种方法取决于具体的需求和安全性考虑。
项目一:个人博客
文章阅读 sql注入
会员中心
模板引入
留言板 xss
后台
登陆验证 csrf 弱密码 无验证码 验证绕过
文章添加 配置修改
个人博客项目-文件操作类-编辑器-上传下载删除读写
知识点
1、文件操作类代码编写
2、文件上传&下载&删除3、文件内容&读取&写入
4、第三方编辑器引用实例
文件操作&上传&下载&删除&读取&写入
文件上传类 1.自写代码验证上传 //验证核心在代码 2.引用外部编辑器实现 //验证核心在编辑器 3.引用开发框架实现 //验证核心在框架- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
文件上传
HTML上传表单(上传文件)
先构造一个html的上传页面
action:是提交给谁处理,写upload.php的话就交由upload.php处理,为空就是自己处理
PHP_FILES函数
<?php //获取文件的名字 $name=$_FILES['upload']['name']; //获取文件的类型 $type=$_FILES['upload']['type']; //获取文件的大小 $size=$_FILES['upload']['size']; //获取上传文件的错误代码 $error=$_FILES['upload']['error']; //获取上传文件的临时文件名 $tmpname=$_FILES['upload']['tmp_name']; echo $name.""; echo $type."
"; echo $size."
"; echo $error."
"; echo $tmpname."
";
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
move_uploaded_file() 函数
语法
move_uploaded_file(file,newloc)
file | 必须。规定要移动的文件 |
---|---|
newloc | 必需,规定文件的新位置 |
文件上传
if(!move_uploaded_file($tmpname,'upload/'.$name)){ echo '文件移动失败'; } else{ echo '文件上传成功'; echo '/upload/'.$name; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
编辑器编写代码(ueditor)
thinkphp框架
在分析漏洞时,要考虑他的源码是框架或者编辑器写入的,还是自己编写的- 1
文件下载
直接下载
http://www.xiaodi8.com/soft/ 软件.zip
getchwd() 函数返回当前工作目录 scandir() 函数返回指定目录中的文件和目录的数组- 1
- 2
文件下载加php数组取值
<?php //获取可以下载的文件列表 function getfilename(){ //定义一个函数,将文件名拿出来 $filepath=getcwd(); //获取到当前路径 //var_dump($filepath); $filename=scandir($filepath.'/soft/'); //把当前路径下的soft文件夹下的东西都显示出来 //var_dump($filename); foreach($filename as $key =>$value){ if(is_array($value)){ getValue($value); } else{ echo $value.""; } } } //直接下载函数 function geturldown(){ $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; echo $url; } ?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
传参下载
http://www.xiaodi8.com/soft/down.php?filename=软件.zip
总结
直连下载更安全 传参下载后面的参数可以更改,能直接获取源码- 1
- 2
文件删除
文件夹删除
文件读取
function fileread($name){ $myfile = fopen($name, mode: "r"); echo fread($myfile,filesize($name)); fclose($myfile); }- 1
- 2
- 3
- 4
- 5
文件写入
function filewrite($name,$txt){ $myfile = fopen($name,mode: "w+"); fwrite($myfile,$txt); fclose($myfile);- 1
- 2
- 3
- 4
个人博客项目&输入&输出&留言板&访问IP
知识点
1.PHP全局变量 &_SERVER
PHP 有 9 个超全局变量 $_SERVER、$_GET、$_POST、$_REQUEST、$_COOKIE、$_SESSION、$_FILES、$_ENV、$GLOBALS- 1
- 2
S E R V E R 是一个在 P H P 中预定义的全局变量,它包含了有关服务器和当前脚本的信息。 _SERVER是一个在PHP中预定义的全局变量,它包含了有关服务器和当前脚本的信息。 SERVER是一个在PHP中预定义的全局变量,它包含了有关服务器和当前脚本的信息。_SERVER数组中的每个元素都是服务器环境的一个参数,如请求的方法、请求的URI、客户端IP地址等。
以下是$_SERVER数组中一些常用的元素及其含义:
- $_SERVER[‘HTTP_ACCEPT_LANGUAGE’]:浏览器语言
- $_SERVER[‘REMOTE_ADDR’]:客户端IP地址
- $_SERVER[‘PHP_SELF’]:正在执行脚本的文件名
- $_SERVER[‘argv’]:传递给该脚本的参数
- $_SERVER[‘argc’]:传递给该脚本的参数个数
- $_SERVER[‘HTTP_USER_AGENT’] :返回用户使用的浏览器信息
- $SERVER[‘SERVER_NAME’] 当前运行脚本所在服务器主机的名称
- $SERVER[‘REQUEST_METHOD’] 访问页面时的请求方法。例如:GET、HEAD,POST
你可以使用$_SERVER数组来获取这些信息,例如:
$language = $_SERVER['HTTP_ACCEPT_LANGUAGE']; $ip = $_SERVER['REMOTE_ADDR']; $file = $_SERVER['PHP_SELF']; $arguments = $_SERVER['argv']; $argumentCount = $_SERVER['argc'];- 1
- 2
- 3
- 4
- 5
这样就可以获取到相应的信息了。
控制user-agent,利用JS语句实现弹窗。
- HTTP-REFERER伪造来源
u a = ua= ua=_SERVER[‘HTTP_REFERER’]
查看代码有没有检测来源,如果没有,容易引发CSRF攻击。
- 伪造IP
2.MYSQL-插入语法INSERT
3.输入输出-XSS&反射&存储
接受值,对值进行输出,评论区,留言区,私信都有可能存在。
4.安全问题-XSS跨站&CSRF等
个人博客项目&登陆验证&Cookie&Session&验证码安全
知识点
1.后台验证-登陆用户逻辑安全
2.后台验证-COOKIE&SESSION
3.后台验证-验证码&万能密码等
登陆模块流程
1.发送登陆请求 账号 密码
2.接受账号密码
3.判断账号密码的准确性
正确 成功登陆->跳转成功页面
错误 失败登陆-> 重新登陆
后台管理系统有多个文件页面,为了方便验证,一般会选用cookie或session进行验证。
cookie:身份验证 存储到客户端浏览器内(可能被盗取) cookie安全:cookie修改 伪造 盗取 session:身份验证 存储到服务端服务器内,登陆一次,产生一次 session安全:会话劫持 (session劫持)- 1
- 2
- 3
- 4
- 5
- 6
cookie验证
先验证登陆,才进行代码的操作
u s e r = user= user=_COOKIE[‘user’];
if($user != ‘’){
echo ‘这里就是后台’
}else{
echo ‘不能进入’
}
基础验证:只验证cookpie里面的user是不是为空,利用BP抓包,修改cookie,比如user=1.即可登陆。成功以后会设置登陆信息并记住天数。 setcookie 安全隐患:COOKIE伪造- 1
- 2
- 3
万能密码
where username = '' or 1=1 ' or 1=1# 数值型万能账号 a or true # a or 1 # a or 1=1 # a or true – a a or 1 – a a or 1=1 – a 单引号字符型万能密码 a’ or true # a’ or 1 # a’ or 1=1 # a’ or true --a a’ or 1 – a a’ or 1=1 – a 双引号字符型万能密码 a" or true # a" or 1 # a" or 1=1 # a" or true – a a" or 1 – a a" or 1=1 – a 万能账号的使用 账号输入: a or true # 密码随便输入,比如:123456 数 admin # admin – a 单引号字符串型万能密码 admin’ # admin’ – a 双引号字符串型万能密码 admin” # dmin" – a 万能密码的使用 用户名输入: admin’ # 密码随便输入,比如: 123456- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
个人博客项目&JS-Ajax&前端逻辑&购物&上传
知识点
1.JS前端验证-文件上传 2.JS-Ajax传递-登录-状态 3.JS-AJax传递-购物-参数- 1
- 2
- 3
- 4
- 5
1.文件上传 - 类型 - 过滤
对文件上传的后缀名进行验证,符合要求的才能上传
这个功能的实现可以由Php或JS去实现
两种去验证的区别:
PHP验证的代码看不到 只能黑盒测试
JS验证的代码可以看到 白盒测试
如果用JS写前端上传代码,就可以直接绕过。- 1
- 1
- 2
2.状态回显- 登陆 - 状态码
通过AJax传递数据进行用户登陆验证- 1
AJax是什么?交互性
Ajax 不是一种新的[编程语言],而是一种用于创建更好更快以及更强的Web应用程序的技术。Ajax 在浏览器与 Web 服务器之间使用异步数据传输HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面- 1
JS AJax
流浪其请求-返回-读取返回数据-JS AJax代码进行解析(代码判断)->结果
inforcode = 1 成功
如果页面是用ajax写的,但是看不到,包含在了文件夹里面- 1
PHP
请求-返回->返回结果 (服务器不理会)
Do intercept -> Response to this request- 1
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |