给公司搭建一个人才库系统,前台(信息填写+简历上传)后台(筛选功能+下载简历)

news2024/12/26 23:37:04

首先指出目前代码的不足之处:
如果公司使用,代码还存在风险问题,需要增加防火墙、防PHP攻击、后台加验证等操作
以下指南:
1.Mod Security 和 Fail2Ban 是开源的安全软件,您可以在宝塔面板上安装和配置这些软件来增强您的服务器安全性。
首先,您需要登录到宝塔面板,然后打开“软件商店”页面。在搜索框中输入“Mod Security”或“Fail2Ban”,然后按下“搜索”按钮,您将看到可用的安装包。
选择要安装的软件包,然后点击“安装”按钮。在安装完成后,您可以进入软件包的设置页面,通过编辑配置文件来定制 Mod Security 和 Fail2Ban 的安全规则。这些规则可以帮助您识别并阻止针对您的PHP网站的SQL注入、跨站点脚本攻击等安全威胁。
注意,如果您对配置规则不太熟悉,最好在安装和配置Mod Security 和 Fail2Ban 之前做好备份工作,以免意外影响您的网站运行。

2.一些防止XSS漏洞、CSRF漏洞等攻击的建议。
1. 防止XSS攻击
(1)输入过滤:过滤输入的特殊字符,例如 HTML,CSS和JavaScript代码,可以使用PHP内置的函数 htmlspecialchars() 、urlencode() 、htmlentities() 等过滤。
(2)输出过滤:对输出的内容进行标准化处理,比如使用HTML标签件,限制输入长度和类型等
(3)使用HTTP-only:使用HTTP-only cookie,防止 cookie 被盗取后用于 XSS 攻击。
(4)使用 content-security-policy:使用 content-security-policy 设置、限制页面资源获取来源,防止恶意代码的成功注入。
2.防止CSRF攻击
(1)使用Token:生成一个加密的随机 Token ,作为请求参数或 Cookie 属性,验证提交的表单是否来自合法域名,防止跨站攻击。
(2)检查Referer:检查请求的Referer地址,合法的请求才会被通过,防止 CSRF 攻击。
(3)CI框架:使用 CI 框架预防 CSRF 攻击, CI已经自带了 CSRF 攻击预防机制,直接在需要预防的表单上加上 csrf_protection 就可以了。
在编写 PHP 代码时,建议采用标准的编程规范,如编写清晰易懂的注释、避免使用危险的函数等,这样可以有效地降低代码出现漏洞的概率,增加代码的可读性和可维护性。
总之,防止各类漏洞攻击是开发安全的Web应用程序的基本要求。需要我们在代码的编写过程中,养成安全思维,采用标准的编程规范,并运用已有的技术手段,如输入输出过滤、使用 HTTP-only ,设置 CSRF Token 等来提升应用的安全性。

截图展示:

HTML源码:
 

<!DOCTYPE html>
<html>
  <head>
    <title>人才库</title>
    <meta charset="utf-8">
    <style>
      body {
        background-color: #F5F5F5;
        font-family: Arial, sans-serif;
      }
      h1 {
        text-align: center;
        font-size: 36px;
        color: #333;
      }
      form {
        max-width: 600px;
        margin: 0 auto;
        padding: 20px;
        background-color: #FFFFFF;
        border-radius: 5px;
        box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
      }
      .form-group {
        margin-bottom: 20px;
      }
      label {
        display: block;
        margin-bottom: 10px;
        font-weight: bold;
        color: #333;
      }
      input[type="text"],
      textarea {
        width: 100%;
        padding: 10px;
        border: 1px solid #DDD;
        border-radius: 5px;
        font-family: inherit;
        font-size: 16px;
        color: #666;
      }
      input[type="file"] {
        margin-top: 10px;
      }
      input[type="radio"] {
        margin-right: 10px;
      }
      textarea {
        height: 150px;
      }
      button[type="submit"] {
        display: block;
        width: 100%;
        padding: 10px;
        background-color: #4CAF50;
        border: none;
        border-radius: 3px;
        color: #FFF;
        font-size: 18px;
        font-weight: bold;
        cursor: pointer;
      }
      button[type="submit"]:hover {
        background-color: #357D5E;
      }
      ::-webkit-file-upload-button {
        color: #FFF;
        background-color: #4CAF50;
        border: none;
        border-radius: 3px;
        padding: 10px;
        font-size: 18px;
        font-weight: bold;
        cursor: pointer;
      }
      ::-webkit-file-upload-button:hover {
        background-color: #357D5E;
      }
      .error {
        color: red;
        font-size: 14px;
        margin-top: 5px;
      }
    </style>
  </head>
  <body>
    <h1>基本信息</h1>
    <form action="up.php" method="post" enctype="multipart/form-data">
      <div class="form-group">
        <label>姓名</label>
        <input type="text" name="name" required>
      </div>
      <div class="form-group">
        <label>手机号</label>
        <input type="text" name="phone" required>
      </div>
      <div class="form-group">
        <label>邮箱</label>
        <input type="text" name="email" required>
      </div>
      <div class="form-group">
        <label>教育信息</label>
        <input type="text" name="university" placeholder="学校" required>
        <input type="radio" name="level" value="双一流" required> 双一流
        <input type="radio" name="level" value="985"> 985
        <input type="radio" name="level" value="211"> 211
        <input type="radio" name="level" value="其他"> 其他
        <input type="text" name="major" placeholder="专业" required>
        <input type="text" name="gpa" placeholder="绩点/均分/排名" required>
        <div id="edu-error" class="error"></div>
      </div>
      <div class="form-group">
        <label>高考信息</label>
        <input type="text" name="exam_score" placeholder="高考总分、数学成绩、理综成绩" required>
      </div>
      <div class="form-group">
        <label>知情信息</label>
        <label>现在出校实习的话,你的导师和家里人是否同意呢?</label>
        <input type="radio" name="consent" value="yes" required> 同意
        <input type="radio" name="consent" value="no"> 不同意
        <div id="consent-error" class="error"></div>
        <label>我们的岗位是线下办公,不接受任何线上形式的工作,位置在成都市武侯区,你看你可以吗?</label>
        <input type="radio" name="location" value="yes" required> 可以
        <input type="radio" name="location" value="no"> 不可以
        <div id="location-error" class="error"></div>
      </div>
      <div class="form-group">
        <label>实习信息</label>
        <input type="text" name="internship_duration" placeholder="最长实习时间" required>
        <input type="text" name="start_date" placeholder="最快到岗时间" required>
        <label>找工作最在意关于公司或者岗位的什么因素</label>
        <input type="text" name="concerns" placeholder="请说明" required>
        <div id="concerns-error" class="error"></div>
      </div>
      <div class="form-group">
        <label>技能信息</label>
        <input type="text" name="script_languages" placeholder="脚本语言掌握情况" required>
        <input type="text" name="digital_circuit" placeholder="数电和verilog掌握情况" required>
        <div id="skills-error" class="error"></div>
      </div>
      <div class="form-group">
        <label>项目经历</label>
        <textarea name="project_duration" placeholder="项目经历" rows="2" required></textarea>
      </div>
      <div class="form-group">
        <label>上传简历(只允许上传PDF、DOC、DOCX、PNG或JPEG格式的10M以下文件)</label>
        <input type="file" name="file" accept=".pdf,.doc,.docx,.png,.jpg,.jpeg" maxsize="10485760" required>
      </div>
      <button type="submit">提交</button>
    </form>
    <div style="text-align:center; font-size:12px;">
    <p>此系统所填写的所有信息和材料(包括但不限于简历、联系方式等)将被公司收集,并在公司的招聘流程中被使用,</p>
    <p>公司将致力于保护申请人的个人隐私,并根据适用的法律、法规和行业标准来处理个人信息。</p>
    <p>© 2021 XXX公司. All rights reserved.</p>
</div>
  </body>
</html>

up.php源码:

<?php 
    header("content-type:text/html;charset=utf-8");
    //设置时区
    date_default_timezone_set('PRC');
    //获取文件名
    $filename = $_FILES['file']['name'];
    //获取文件临时路径
    $temp_name = $_FILES['file']['tmp_name'];
    //获取大小
    $size = $_FILES['file']['size'];
    //获取文件上传码,0代表文件上传成功
    $error = $_FILES['file']['error'];
    //判断文件大小是否超过设置的最大上传限制
    if ($size > 10*1024*1024){
        //
        echo "<script>alert('文件大小超过10M大小');window.history.go(-1);</script>";
        exit();
    }
    //phpinfo函数会以数组的形式返回关于文件路径的信息 
    //[dirname]:目录路径[basename]:文件名[extension]:文件后缀名[filename]:不包含后缀的文件名
    $arr = pathinfo($filename);
    //获取文件的后缀名
    $ext_suffix = strtolower($arr['extension']);
//  echo "<script>alert('$ext_suffix');</script>";
    //设置允许上传文件的后缀
    $allow_suffix = array('jpg','jpeg','png','pdf','doc','docx');
    //判断上传的文件是否在允许的范围内(后缀)==>白名单判断
    if(!in_array($ext_suffix, $allow_suffix)){
        //window.history.go(-1)表示返回上一页并刷新页面
        echo "<script>alert('上传的文件类型只能是jpg,jpeg,png,pdf,doc,docx');window.history.go(-1);</script>";
        exit();
    }
    //检测存放上传文件的路径是否存在,如果不存在则新建目录
    if (!file_exists('resume')){
        mkdir('resume');
    }
    //为上传的文件新起一个名字,保证更加安全
    $new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;
    //将文件从临时路径移动到磁盘
    if (move_uploaded_file($temp_name, 'resume/'.$new_filename)){
        echo "<script>alert('文件上传成功,现在进行数据传输!');window.history.go(-1);</script>";
        //连接数据库
        $servername = "localhost:3306";
        $username = "数据库名";
        $password = "数据库密码";
        $dbname = "数据表名";
    
        $conn = mysqli_connect($servername, $username, $password, $dbname);
        // 检测连接
        if (!$conn) {
            die("连接失败: " . mysqli_connect_error());
        }
    
        //获取表单数据,使用mysqli_real_escape_string函数对各个字段进行SQL注入防护
        $name = mysqli_real_escape_string($conn, $_POST['name']);
        $phone = mysqli_real_escape_string($conn, $_POST['phone']);
        $email = mysqli_real_escape_string($conn, $_POST['email']);
        $university = mysqli_real_escape_string($conn, $_POST['university']);
        $level = mysqli_real_escape_string($conn, $_POST['level']);
        $major = mysqli_real_escape_string($conn, $_POST['major']);
        $gpa = mysqli_real_escape_string($conn, $_POST['gpa']);
        $exam_score = mysqli_real_escape_string($conn, $_POST['exam_score']);
        $consent = mysqli_real_escape_string($conn, $_POST['consent']);
        $location = mysqli_real_escape_string($conn, $_POST['location']);
        $internship_duration = mysqli_real_escape_string($conn, $_POST['internship_duration']);
        $start_date = mysqli_real_escape_string($conn, $_POST['start_date']);
        $concerns = mysqli_real_escape_string($conn, $_POST['concerns']);
        $script_languages = mysqli_real_escape_string($conn, $_POST['script_languages']);
        $digital_circuit = mysqli_real_escape_string($conn, $_POST['digital_circuit']);
        $project_duration = mysqli_real_escape_string($conn, $_POST['project_duration']);
        $resume_path = mysqli_real_escape_string($conn, $new_filename);
    
        //插入数据
        $sql = "INSERT INTO resume (name, phone, email, university, level, major, gpa, exam_score, consent, location, internship_duration, start_date, concerns, script_languages, digital_circuit, project_duration, file, created_at)
        VALUES ('$name', '$phone', '$email', '$university', '$level', '$major', '$gpa', '$exam_score', '$consent', '$location', '$internship_duration', '$start_date', '$concerns', '$script_languages', '$digital_circuit', '$project_duration', '$resume_path', NOW())";
    
        if (mysqli_query($conn, $sql)) {
            echo "<script>alert('提交成功!')</script>";
            header("Location: success.php");
        } else {
            echo "Error: " . $sql . "<br>" . mysqli_error($conn);
        }
    
        //关闭数据库连接
        mysqli_close($conn);
    }else{
        echo "<script>alert('文件上传失败,错误码:$error');</script>";
    }

 ?>

数据库创建口令:
 

CREATE TABLE `resume` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `phone` varchar(11) NOT NULL,
  `email` varchar(255) NOT NULL,
  `university` varchar(255) NOT NULL,
  `level` varchar(255) NOT NULL,
  `major` varchar(255) NOT NULL,
  `gpa` varchar(255) NOT NULL,
  `exam_score` varchar(255) NOT NULL,
  `consent` varchar(255) NOT NULL,
  `location` varchar(255) NOT NULL,
  `internship_duration` varchar(255) NOT NULL,
  `start_date` varchar(255) NOT NULL,
  `concerns` text NOT NULL,
  `script_languages` text NOT NULL,
  `digital_circuit` text NOT NULL,
  `project_duration` varchar(255) NOT NULL,
  `file` varchar(255) NOT NULL,
  `created_at` datetime DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JUC】ThreadLocal

【JUC】ThreadLocal 文章目录 【JUC】ThreadLocal1. 概述2. Thread、ThreadLocal、ThreadLocalMap 关系2.1 Thread 和 ThreadLocal2.2 ThreadLocal 和 ThreadLocalMap2.3 三者之间的关系 1. 概述 ThreadLocal 提供线程局部变量。这些变量与正常的变量不同&#xff0c;因为每一…

Java 基础入门篇(一)—— Java 概述

文章目录 一、Java 概述二、Java 的产品 JDK2.1 JDK 安装2.2 Java与 Javac 介绍2.3 Java 程序的开发步骤 三、Java 程序的执行原理四、JDK 的组成五、Java 的跨平台工作原理 一、Java 概述 Java 是 sun 公司在 1995 年推出的一门计算机高级编程语言&#xff0c;其语言风格接近人…

音视频技术开发周刊 | 291

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 谷歌将 AI 芯片团队并入云计算部门 追赶微软和亚马逊 OpenAI推出的ChatGPT获得一定成功&#xff0c;微软是OpenAI的重要投资者&#xff0c;它将ChatGPT植入必应搜索&#…

Java 基础入门篇(三)—— 数组的定义与内存分配

文章目录 一、数组的定义1.1 静态初始化数组1.2 动态初始化数组1.3 数组的访问 二、数组的遍历三、数组的内存图 ★3.1 Java 的内存分配3.2 数组的内存图3.3 两个数组变量指向同一个数组对象 四、数组使用的常见问题补充&#xff1a;随机数 Random 类 一、数组的定义 数组就是…

机器视觉工程师职场四点“心态>交流=思路>知行合一”

视觉人机器视觉团队,他们热爱机器视觉行业,爱学习,爱分享。这一路上,首先感谢粉丝们805天一如既往的支持。我想团队拥有这些粉丝,是富有的,也是我们一直创作的动力。 是否记得毕业季,自己的豪言壮语。希望你毕业三年后,无论结果如何,不忘初心,继续前行。 机器视觉工程…

Dart - 爬取Android Studio历史版本信息

文章目录 前言开发环境开发过程1. 遵循robots协议2. 页面结构分析3. Dart项目创建4. Dart项目运行与调试5. 第三库依赖6. 项目完整源码 运行结果最后 前言 整理Android Studio历史版本信息时发现有点多&#xff0c;于是想一劳永逸写一个简单的爬虫抓取一下数据并生成我想要的格…

【ansys】网格划分-优化、改善网格质量、修复网格、减小skewness、增大Orthogonal Quality的技巧

一、分析几何结构网格划分拓扑关系&#xff0c;调整网格尺寸 优化策略1&#xff1a;如果发现质量差的网格单元聚集在某一个实体附近&#xff0c;基本说明是这个实体的网格划分定义存在优化的地方。 例如下面这个几何模型。一个薄壁状长方体&#xff0c;加上一个模具框架&#x…

代码优美,搬砖不累:探索高质量代码之路

一、 前言 写出高质量代码是每个程序员的追求&#xff0c;也是提高自己编程能力的必经之路。高质量的代码可以提高软件的可维护性、可读性、可扩展性和可移植性等&#xff0c;降低软件开发和维护的成本。本文将介绍一些如何写出高质量代码的实用技巧和方法。 二、高质量代码的…

搞定Maven全功能,来从根上理解Maven拉包原理

依赖 生命周期与插件 模块聚合 模块继承 属性 版本管理 环境配置 私服 <dependencyManagement>的作用 在一次需求迭代中&#xff0c;我要求同事把写好的 RPC 接口打好包上传到公司私服上。然而&#xff0c;她并不熟悉 Maven&#xff0c;仅仅掌握了最基础的使用方…

【24】linux进阶——初识shell

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

管家婆辉煌Ⅱ 13.32版安装方法

因管家婆辉煌版已经长期不更新&#xff0c;现已经出现蓝屏的问题&#xff0c;故此新开此贴&#xff0c;慢慢更新安装方法。 首先管家婆下载地址&#xff1a;http://www.grasp.com.cn/download.aspx?id116 先安装sql server 2008 下载后&#xff0c;运行安装&#xff0c;请注…

《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第八章课后习题参考答案

第八章 面向对象技术与UML 课后习题参考答案 一、单项选择题 D &#xff08;2&#xff09;C &#xff08;3&#xff09;B &#xff08;4&#xff09;D &#xff08;5&#xff09;C &#xff08;6&#xff09;B &#xff08;7&#xff09;A &#xff08;8&#xff09;C&…

【LeetCode】343. 整数拆分

343. 整数拆分&#xff08;中等&#xff09; 方法一&#xff1a;数学推导 思路 将数字 n 拆分为若干个数字之和&#xff0c;即 n n1 n2 ... na &#xff0c;本道题等价于求解 max(n1 * n2 * ... * na) &#xff0c;根据数学推导&#xff0c;可以得到两个结论&#xff1a;…

【51单片机】LED点阵屏

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Waiting For Love】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f354;74HC595图片 &#x1f354;74HC59…

多层感知器模型与模型训练

文章目录 1. 多层感知器模型与模型训练1.1 多层感知器模型1.2 损失函数1.3 优化器与初始化模型1.4 编写训练循环1.5 案例代码整合 最近看了日月光华老师的《PyTorch深度学习简明实战》&#xff0c;将里面的代码自己动手复现了一遍&#xff0c;还是受益良多&#xff0c;书里面的…

【Python】狂肝两万字带你学会——类与对象

目录 01-初始对象 生活中的数据组织 程序中的数据组织​编辑 使用对象组织数据 总结01 02-类的成员方法 类的定义和使用 成员变量和成员方法 成员方法的定义语法 注意事项 成员方法——代码演示 总结02 03-类和对象 现实世界的事物和类 类和对象 使用类和对象…

Android 9.0 原生SystemUI下拉通知栏每条通知默认展开

1.前言 在9.0的系统rom原生开发中,在产品对SystemUI下拉通知栏做定制的时候,在下拉状态栏的时候,通知栏中 最后一条通知默认是收缩的 点击按钮 就会展开 原生系统systemui就是如此,为了更美观 所以要求最后一条通知也默认展开,显得更美观 最终效果图: 2.原生SystemUI下拉通…

网络通信原理

网络通信原理目录 1.网络通信基础1.1 IP地址1.2 端口号 2. 通信协议2.1 协议简介2.1 协议分层 3. 封装和分用 1.网络通信基础 &#x1f604;网络通信的目的是网络数据传输&#xff0c;是主机的不同进程间&#xff0c;基于网络实现的数据传输。那么&#xff0c;首先我们应该先弄…

Java实现调用外部程序

Java实现调用外部程序 Java库Runtime类与ProcessBuilder类参数传递执行结果Runtime类的使用ProcessBuilder类的使用无参数调用简单参数调用复杂参数调用 Apache Commons Exec库使用步骤介绍使用实例 Java库 在Java中&#xff0c;可以通过Runtime类或ProcessBuilder类来实现调用…

看看人家的MyBatis批量插入数据优化,从120s到2.5s,那叫一个优雅!

粗略的实验 最后 最近在压测一批接口的时候&#xff0c;我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪&#xff0c;因为我们之前已经对这些接口进行了优化。但是&#xff0c;当我们进行排查时&#xff0c;发现问题出在数据库批量保存这块。 我们的项目使用了 myb…