小迪安全 Web安全 第十六天 - PHP开发 - 个人博客项目&JS-Ajax&前端逻辑&购物&登录&上传


一、ajax实现简单的文件上传

(一)代码示例



    
    ajax


class="upload" method="post" enctype="multipart/form-data" action=""> class="uploadfile" type="file" name="upload" onchange="checkFileExt(this.value)"/>
class="sub" type="submit" name="submit" value="开始上传"/>
<?php //php做处理 //php实现,验证的代码看不到,只能黑盒测试 //js实现,验证的代码能看到,可以白盒测试 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 . "
"; echo $file_type . "
"; echo $file_size . "
"; echo $file_tmpname . "
"; echo $file_error . "
"; if(@$file_error>0){ echo "文件上传出错!"; }else{ move_uploaded_file(@s_FILES["upload"]["tmp_name"],"upload/" . @$_FILES["upload"]["name"]); echo "文件存储在:" . "upload/" . @$_FILES["upload"]["name"]; } ?>

(二)如何判断文件上传是js验证还是php验证

1、浏览器查看源代码,源代码中有验证文件的js代码即为js验证。

2、查看验证时间,js验证时间非常快,php相对有延迟。

(三)js验证文件易出现的漏洞

1、js验证在前端实现,用户可在浏览器中直接看到验证过程的源代码,用户可以直接进行白盒测试,通过禁用js或修改源代码或修改参数的方式直接绕过验证。

2、php验证在后端服务器中实现,用户看不到源代码,只能进行黑盒测试,绕过概率很低,验证相对安全。

二、ajax实现登录验证

(一)代码示例

1、前端

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Ajax Logintitle>
head>
<body>
    账号:<input type="user" class="user">
    密码:<input type="password" class="password">
    <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:$('.password').val()
                },
                success:function (res) {
                    if(res.infocode==1){
                        alert('登录成功!')
                    }else{
                        alert('登录失败!')
                    }
                }
            })
        })
    script>
body>
html>

2、后端

<?php
$success = array('msg'=>'ok');
$username = $_POST['myUname'];
$password = $_POST['myUpass'];
//验证用户提交的账号和密码,由于这里只做测试,只做简单实现,实际项目中应连接到数据库进行验证
if($username=='xiaodi' && $password=='123456'){
    $success['infocode'] = 1; //1为成功登录
}else{
    $success['infocode'] = 0; //0为登录失败
}

echo json_encode($success);
?>

(二)判断登录验证是js还是php

1、js代码ajax请求验证后,读取返回的数据,浏览器还会对js ajax代码进行解析,然后才会显示请求结果,此过程用户可以干预、篡改结果参数实现绕过。

2、php验证直接在服务器端完成,完成验证后直接将结果返回给客户端,此过程用户无法干预,就算篡改结果服务器也不会再予以理会。

注:能否实现绕过最终要看处理结果由谁操作,若最终处理结果由前台控制,则可以绕过。

三、ajax实现购物功能

(一)代码示例

<?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);

?>

(二)易出现的漏洞

1、若处理结果以js代码实现,则用户可以通过修改传递参数实现验证绕过