安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性

开发环境

DW + PHPStorm + PhpStudy + Navicat Premium

DW : HTML&JS&CSS开发

PHPStorm : 专业PHP开发IDE

PhpStudy :Apache MYSQL环境

Navicat Premium: 全能数据库管理工具

eb17fae2fb7f2446786cbeef57193af9_6cf94819b2c74f64bcbb520546a28ca9.png


数据导入-mysql架构&库表列

1、数据库名,数据库表名,数据库列名

2、数据库数据,格式类型,长度,键等


数据库操作-mysqli函数&增删改查

PHP函数:连接,选择,执行,结果,关闭等

参考:https://www.runoob.com/php/php-ref-mysqli.html

常用:

mysqli_connect() 打开一个到MySQL的新的连接。

mysqli_select_db() 更改连接的默认数据库。

mysqli_query() 执行某个针对数据库的查询。

mysqli_fetch_row() 从结果集中取得一行,并作为枚举数组返回。

mysqli_close() 关闭先前打开的数据库连接。


MYSQL增删改查:


查:select * from 表名 where 列名=‘条件’;

增:insert into 表名(列名1, 列名2) value(‘列1值1’, ‘列2值2’);

删:delete from 表名 where 列名 = ‘条件’;

改:update 表名 set 列名 = 数据 where 列名 = ‘条件’;

基础的PHP语句

<form id="form1" name="form1" method="post" action="">

    用户名:<input type="text" name="username" maxlength="2000"><br>

  内容:

    <textarea id="content" rows="10" cols="70" name="content" style="border:1px solid #E5E5E5;">
    </textarea>
    <script type="text/javascript">
        UE.getEditor("content");

        //实例化编辑器传参,id为将要被替换的容器。
    </script>


    <input type="submit" name="submit" id="submit" value="提交">
  
</form>

<?php
include 'config.php';


function add_gbook($con){
    $u = @$_POST['username'];
    if (isset($u)) {
        $c = @$_POST['content'];
        $i = @$_SERVER['REMOTE_ADDR'];
        $ua = @$_SERVER['HTTP_USER_AGENT'];
        $sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) value('$u', '$c','$i','$ua');";
        if (mysqli_query($con, $sql)) {
            echo "<script>alert('留言成功!')</script>";
        }
    }
}

function show_gbook($con,$del){
    $sql1="select * from gbook";
    $data=mysqli_query($con,$sql1);
    while ($row=mysqli_fetch_row($data)) {
        echo '<hr>';
        echo '用户名:'.$row[0].'<br>';
        echo '内容:'.$row[1].'<br>';
        echo 'IP地址:'.$row[2].'<br>';
        echo 'UA浏览器:'.$row[3].'<br>';
        if($del=='del'){
            echo "<a href='gbook-admin.php?del=$row[0]'>删除</a>";
        }
    }
}

效果如下

数据接收输出-html混编&超全局变量

1、html混编:使HTML(JS)在PHP语言中运行

<?php
echo '<script>alert('x');</script>'
?>

2、超全局变量:

参考:

https://www.w3school.com.cn/php/php_superglobals.asp

https://www.php.net/manual/zh/language.variables.superglobals.php

$GLOBALS:这种全局变量用于在 PHP 脚本中的任意位置访问全局变量
$_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。
$_REQUEST:$_REQUEST 用于收集 HTML 表单提交的数据。
$_POST:广泛用于收集提交method="post" 的HTML表单后的表单数据。
$_GET:收集URL中的发送的数据。也可用于收集提交HTML表单数据(method="get") $_FILES:文件上传且处理包含通过HTTP POST方法上传给当前脚本的文件内容。
$_ENV:是一个包含服务器端环境变量的数组。
$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。
$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。

第三方插件引用-js传参&函数对象调用

引用:

函数对象调用:

var obj = {
    value : 0,
    increment : function (inc) {   
        this.value += typeof inc === 'number' ? inc :1;
        //设置inc且为数字时 value=inc 反之 value=1
    }
}
obj.increment();
console.log(obj.value);  //1
obj.increment(2);
console.log(obj.value);  //2

身份验证-Cookie使用

生成cookie的原理图过程:见图

1、客户端向服务器发送HTTP请求。
2、服务器检查请求头中是否包含cookie信息。
3、如果请求头中包含cookie信息,则服务器使用该cookie来识别客户端,否则服务器将生成一个新的cookie。
4、服务器在响应头中设置cookie信息并将其发送回客户端。
5、客户端接收响应并将cookie保存在本地。
6、当客户端发送下一次HTTP请求时,它会将cookie信息附加到请求头中。
7、服务器收到请求并检查cookie的有效性。
8、如果cookie有效,则服务器响应请求。否则,服务器可能会要求客户端重新登录。

PHP中:

setcookie(): 设置一个cookie并发送到客户端浏览器。

unset(): 用于删除指定的cookie。

当然这里的认证功能也是不安全的,存在sql注入以及cookie伪造等问题……

预编译写法:

$stmt = $con->prepare("SELECT * FROM admin WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $user, $pass);
$stmt->execute();
$result = $stmt->get_result();

身份验证-Session使用

1、客户端向服务器发送HTTP请求。
2、服务器为客户端生成一个唯一的session ID,并将其存储在服务器端的存储器中(如文件、数据库等)。
3、服务器将生成的session ID作为一个cookie发送给客户端。
4、客户端将session ID保存为一个cookie,通常是在本地浏览器中存储。
5、当客户端在发送下一次HTTP请求时,它会将该cookie信息附加到请求头中,以便服务器可以通过该session ID来识别客户端。
6、服务器使用session ID来检索存储在服务器端存储器中的与该客户端相关的session数据,从而在客户端和服务器之间共享数据。

session_start(): 启动会话,用于开始或恢复一个已经存在的会话。

$_SESSION: 用于存储和访问当前会话中的所有变量。

session_destroy(): 销毁当前会话中的所有数据。

session_unset(): 释放当前会话中的所有变量。

Session存储路径:PHP.INI中session.save_path设置路径

40d5889685172fe761c26c16720800c1_181c8cb4c0104cac852278106a56fcf8.png


唯一性判断-Token使用

1、生成Token并将其存储在Session

2、生成Token并将其绑定在Cookie触发

3、尝试登录表单中带入Token验证逻辑

4、思考Token安全特性

Token保证每次请求的唯一性,表单每次刷新都会重新生成token,增加暴力破解成本


具体安全知识点:

Cookie和Session都是用来在Web应用程序中跟踪用户状态的机制

1、存储位置不同:

Cookie是存储在客户端(浏览器)上的,而Session是存储在服务器端的。

2、安全性不同:

Cookie存储在客户端上,可能会被黑客利用窃取信息,而Session存储在服务器上,更加安全。

3、存储容量不同:

Cookie的存储容量有限,一般为4KB,而Session的存储容量理论上没有限制,取决于服务器的硬件和配置。

4、生命周期不同:

Cookie可以设置过期时间,即便关闭浏览器或者重新打开电脑,Cookie仍然存在,直到过期或者被删除。而Session一般默认在浏览器关闭后就会过期。

5、访问方式不同:

Cookie可以通过JavaScript访问,而Session只能在服务器端进行访问。

6、使用场景不同:

Cookie一般用于存储小型的数据,如用户的用户名和密码等信息。而Session一般用于存储大型的数据,如购物车、登录状态等信息。

总之,Cookie和Session都有各自的优缺点,选择使用哪一种方式,取决于具体的应用场景和需求。一般来说,如果需要存储敏感信息或者数据较大,建议使用Session;如果只需要存储少量的数据,并且需要在客户端进行访问,可以选择使用Cookie。


在Web应用程序中,使用token和不使用token的主要差异在于身份验证和安全性

1.身份验证:采用token机制的Web应用程序,用户在登录成功后会收到一个token,这个token可以在每次请求时发送给服务器进行身份验证。而不采用token机制的Web应用程序,一般会使用session机制来保存用户登录状态,服务器会在用户登录成功后创建一个session,之后的每个请求都需要在HTTP头中附带这个session ID,以便服务器能够验证用户身份。

2、安全性:采用token机制的Web应用程序,在服务器上不会存储用户的登录状态,只需要存储token即可。因此,即使token被盗取,黑客也无法获得用户的密码或者其他敏感信息。而不采用token机制的Web应用程序,一般会在服务器上存储用户的登录状态,因此如果服务器被黑客攻击,黑客可能会获得用户的敏感信息。

3、跨域访问:采用token机制的Web应用程序,在跨域访问时,可以使用HTTP头中的Authorization字段来传递token信息,方便实现跨域访问。而不采用token机制的Web应用程序,在跨域访问时,需使用cookie或session来传递用户身份信息,比较麻烦。

总之,采用token机制可以提高Web应用程序的安全性,并且方便实现跨域访问。不过,使用token机制也需要开发者自己来实现身份验证和token的生成和验证,相对来说比较复杂。而不采用token机制,使用session机制则相对简单,但是安全性相对较低。因此,具体采用哪种机制,需要根据实际情况进行权衡和选择。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
设计模式 安全 测试技术
深入理解PHP 7的新特性及其对现代开发的意义
【6月更文挑战第20天】在数字时代的浪潮中,PHP作为一门流行的服务端脚本语言,其最新主要版本PHP 7带来了显著的性能提升和语法改进。本文将探讨PHP 7的关键新特性,包括性能优化、类型声明、匿名类以及错误处理机制的变革,并分析这些变化如何影响现代Web开发实践,为开发者提供更高效、更安全的编码体验。
|
10天前
|
设计模式 安全 关系型数据库
PHP开发涉及一系列步骤和技术
【7月更文挑战第2天】PHP开发涉及一系列步骤和技术
114 57
|
4天前
|
安全 编译器 PHP
深入理解PHP 8的新特性及其对现代Web开发的影响
【7月更文挑战第8天】随着PHP 8的发布,这个广受欢迎的服务器端脚本语言迎来了重大更新,带来了性能提升和更现代化的编程特性。本文将探索PHP 8中的新特性,并分析它们如何改变开发者构建和维护Web应用的方式,同时指出这些变化对现有项目升级可能带来的挑战与机遇。
|
7天前
|
设计模式 Rust 安全
深入理解PHP 7的新特性及其对现代Web开发的影响
本文通过数据驱动的分析,探讨了PHP 7的发布如何革新了Web开发的面貌。文章首先概述了PHP 7带来的性能提升与新特性,然后通过实际案例和性能测试数据,详细讨论了这些新特性对提高代码效率、增强安全性和支持现代编程范式的具体影响。最后,文章将评估PHP 7在当前Web开发环境中的地位,并对其未来的发展做出展望。
|
19天前
|
安全 编译器 PHP
探索PHP 8的新特性及其对现代Web开发的影响
【6月更文挑战第22天】随着PHP 8的发布,这一广泛使用的服务器端脚本语言迎来了重大升级。本文将深入探讨PHP 8引入的关键新特性,包括JIT编译器、联合类型、命名参数、匹配表达式以及错误处理和异常改进等。这些新特性不仅提升了性能,还增强了类型系统和语言的表达能力,为现代Web开发带来了新的机遇和挑战。我们将分析这些变化如何影响编码实践,优化策略,并讨论开发者如何适应这些变革以构建更快、更安全、更易于维护的应用程序。
|
13天前
|
安全 编译器 API
探索PHP 8的新特性及其对现代Web开发的影响
随着PHP 8的正式发布,这一版本带来了多项重大改进和新特性,旨在提升性能、增加语言的灵活性并简化开发流程。本文将详细探讨PHP 8中的关键更新,包括JIT编译器、联合类型、命名参数、匹配表达式等,并分析这些新特性如何影响现代Web开发的实践。通过引用最新的性能数据和开发者反馈,我们将深入理解PHP 8带来的变革,以及它对现有项目和未来趋势的潜在影响。
|
13天前
|
安全 大数据 PHP
深入理解PHP 7中的新特性及其对现代Web开发的影响
【6月更文挑战第28天】本文将深入探讨PHP 7带来的革新,从性能提升到语法改进,揭示这些变化如何重塑Web开发领域。我们将一窥未来PHP的发展趋势,并分析开发者如何利用这些新特性来构建更快、更安全、更易于维护的应用程序。
20 1
|
15天前
|
程序员 PHP 数据库
深入理解PHP 7的新特性及其对现代Web开发的影响
【6月更文挑战第26天】随着互联网技术的飞速发展,PHP作为服务端脚本语言的佼佼者,其最新版本PHP 7带来了性能和功能上的显著提升。本文将深度剖析PHP 7中的新特性,并探讨这些变化如何优化现代Web开发实践,提升应用性能及开发效率。我们将从语言本身的变化到实际应用案例,全面解读PHP 7给开发者带来的福音。
12 1
|
2天前
|
安全 编译器 数据处理
PHP 8新特性及其对现代Web开发的影响
随着PHP 8的发布,这一广泛使用的服务器端脚本语言引入了多项新特性和性能改进。本文将深入探讨PHP 8的关键更新,包括JIT编译器、联合类型、命名参数、匹配表达式等,并分析这些变化如何影响现代Web开发实践,以及开发者如何利用这些新工具来构建更快、更安全、更易维护的应用程序。
6 0
|
2天前
|
编译器 API PHP
PHP 8新特性及其对现代Web开发的影响
随着PHP 8的发布,这一广泛使用的服务器端脚本语言迎来了其发展历程中的一个重要里程碑。本文将深入探讨PHP 8引入的关键新特性,如JIT编译器、联合类型、匹配表达式等,并分析这些变化如何影响现代Web开发的实践和原则。通过具体案例和性能数据,我们将展示PHP 8如何优化代码编写、增强程序性能以及提升项目维护性,从而为开发者提供更高效、更可靠的开发体验。
7 0