小迪安全笔记-16
发表于更新于
南京
小迪安全笔记-16
Kn1ght第16天:PHP开发-个人博客项目_JS-Ajax_前端逻辑_购物_登录_上传
知识点
1.js前端验证-文件上传
2.js-Ajax传递-登录-状态
3.JS-Ajax传递-购物-参数
1.文件上传-类型-过滤
设计:通过javascript进行文件后缀筛选验证
2.状态回显-登录-状态码
设计:通过Ajax传递数据进行用户登录验证
3.参数修改-购物-参数修改
设计:通过Ajax传递数据进行购物验证
设计1:商品价格以前端设置价格为准。数据接收价格后运算
设计2:商品价格以数据库设置价格为准。数据接收价格后运算
JS前端认证
文件上传验证:
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
| <form class="upload" method="post" enctype="multipart/form-data" action=""> <input class="uploadfile" type="file" name="upload" onchange="checkFileExt(this.value)"/><br /> <input class="sub" type="submit" name="submit" value="开始上传" /> </form> <script src="js/shang"></script> <script> function checkFileExt(filename) { var flag = false; var arr = ["jpg","png","gif"];
var index = filename.lastIndexOf("."); var ext = filename.substr(index+1);
for(var i=0;i<arr.length;i++) { if(ext == arr[i]) { flag = true; alert("上传的文件符合要求!"); break; } }
if(!flag) { alert("上传的文件不符合要求,请重新选择!"); location.reload(true); } } </script> //验证代码
|
php代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php header("Content-Type:text/html;charset=utf-8"); @$file_name=$_FILES['upload']['name'];
@$file_type=$_FILES['upload']['type'];
@$file_size=$_FILES['upload']['size'];
@$file_tmpname=$_FILES['upload']['tmp_name'];
@$file_error=$_FILES['upload']['error']; echo $file_name."<hr>"; echo $file_type."<hr>"; echo $file_size."<hr>"; echo $file_tmpname."<hr>"; echo $file_error."<hr>"; if (@$file_error>0){ echo '上传出错!'; } else{ move_uploaded_file(@$_FILES["upload"]["tmp_name"], "../upload/" . @$_FILES["upload"]["name"]); echo "文件存储在: " . "upload/" . @$_FILES["upload"]["name"]; }
|
对文件上传的后缀名进行验证,符合要求的才能上传
这个功能的实现可以由PHP或JS去实现
两种验证的区别:PHP验证的代码看不到 只能黑盒测试 后端 服务端
JS验证的代码可以看到,是白盒测试 前端 浏览器
直接右键查看源代码可以判断代码是否采用js验证
js的后端代码是可以看见的,php的看不见
禁用JS
火狐禁用js:
https://jingyan.baidu.com/article/215817f7ee47a01edb142347.html
Ajax
一种js语言,传递数据的一种方式,实现数据交互
login.html:
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
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax登录</title> </head> <body> 帐号:<input type="text" class="user"> 密码:<input type="password" class="pass"> <button>用户登录</button> <script src="../js/jquery-1.12.4.min.js"></script> <script> $('button').click(function () { $.ajax({ type:'post', url:'ajax.php', dataType:'json', data:{ myUname:$('.user').val(), myUpass:$('.pass').val() }, success:function (res) { if(res.infoCode==1){ alert('登录成功'); }else{ alert('登录失败'); } } }); }); </script> </body> </html>
|
js,ajax 请求->返回->js读取返回的数据->js,ajax代码进行解析->结果
——验证过程要是在js代码中完成,则可以绕过,具体情况具体对待
php 请求->返回->返回结果
先抓个包:
设计1:商品价格以前端设置价格为准。数据接收价格后运算
user.php——前端页面
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
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>购买设计1</title> </head> <body>
<img src="iphone.jpg" width="270" height="270" alt=""/><br> 价格:8888<br> 数量:<input type="text" class="num"> <button>购买</button>
<script src="js/jquery-1.12.4.min.js"></script> <script> $('button').click(function () { $.ajax({ type:'post', url:'shop.php', dataType:'json', data:{ price:'8888', number:$('.num').val()
}, success:function (res) { if(res.code==1){ alert('购买成功'); }else{ alert('购买失败');
} } });
}); </script> </body> </html>
|
shop.php——进行验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php header("Content-Type:text/html;charset=utf-8"); $success=array('msg'=>'ok'); $price=$_POST['price']; $num=$_POST['number']; $m=$price*$num;
if($m<10000){ $success['code']=1; }else{ $success['code']=0; }
echo json_encode($success);
?>
|
设计2:商品价格以数据库设置价格为准。数据接收价格后运算
user1.php
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 57 58 59
| <?php header("Content-Type:text/html;charset=utf-8"); include('/config/conn.php'); //
$sql="select * from shop where id=1";
$result=mysql_query($sql,$conn); while($row=mysql_fetch_array($result)){ $imgsrc=$row['imgsrc']; $price=$row['price']; echo "<img src='$imgsrc' width='270' height='270' alt=''/><br>"; echo "价格:$price<br>"; echo "数量:<input type='text' class='num'>"; echo "<button>购买</button>";
}
?>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>购买设计2</title> </head> <body>
<script src="js/jquery-1.12.4.min.js"></script> <script> $('button').click(function () { $.ajax({ type:'post', url:'shop1.php', dataType:'json', data:{ price:<?php echo $price;?>, number:$('.num').val()
}, success:function (res) { //console.log(res); if(res.code==1){ alert('购买成功'); }else{ alert('购买失败');
} } });
}); </script> </body> </html>
|
shop1.php
<
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ?php header("Content-Type:text/html;charset=utf-8"); $success=array('msg'=>'ok'); $price=$_POST['price']; $num=$_POST['number']; $m=$price*$num;
if($m<10000){ $success['code']=1; }else{ $success['code']=0; }
echo json_encode($success);
?>
|
案例:
JS&Ajax 前端&上传&登录&购物
某违法 APP 登录找回密码验证机制(验证短信验证码):
先利用自己的账号进行找回密码功能
通过抓取数据包,找到返回数据包中正确的返回状态码
再对目标账号进行找回密码操作
随意输入验证码,抓到返回的数据包
修改返回数据包中的状态码为正确的状态码
操作结束后,成功进入修改密码界面
这个例子中的app的状态码并非随机,非动态的状态码,并且采用的是前端验证,所以我们可以利用它的唯一状态码进行找回操作。
如果状态码是随机且动态的,即使我们利用自己的正确状态码进行操作,依旧无法绕过前端验证。