网安入门之PHP后端基础

举报
天启互联网工作室 发表于 2025/01/02 21:52:32 2025/01/02
【摘要】 网安入门之PHP后端基础

网安入门之PHP后端基础

PHP 基本概念详解

PHP是一种服务器端脚本语言,常用于动态网站开发和 web 应用程序。以下是 PHP 的基本概念与特点的详细说明:

1. PHP 文件的默认文件扩展名

  • PHP 文件的扩展名通常为 .php,例如 php
  • PHP 文件可以包含 PHP 代码、HTML、CSS 和 JavaScript。
  • Web 服务器会通过 PHP 解析器处理 .php 文件中的 PHP 代码,并将结果返回给浏览器。

2. PHP 脚本的位置

PHP 脚本可以嵌套在 HTML 文档的任意位置。典型的嵌套示例:

<html>
<body>
    <h1>欢迎访问我的网站</h1>
    <?php
        echo "这是一个 PHP 脚本块。";
    ?>
</body>
</html>

也可以使用纯 PHP 脚本文件,无需包含 HTML:

<?php
    echo "这是一个纯 PHP 文件。";
?>

3. PHP 脚本标记

PHP 脚本以 <?php 开头,以 ?> 结束。示例:

<?php
    echo "Hello, World!";
?>

注意:短标签 <? ... ?> 在某些服务器配置中可能被禁用,建议使用完整标签 <?php ... ?>

4. PHP 语句结束标记

PHP 中的每个语句必须以分号 (;) 结束。如果遗漏分号,可能导致解析错误。

示例:

<?php
    echo "这是第一条语句。";
    echo "这是第二条语句。";
?>

5. PHP 注释语法

单行注释:使用 //# 注释单行代码:

<?php
    // 这是一个单行注释
    # 这是另一个单行注释
    echo "Hello, PHP!";
?>

多行注释:使用 /* 开始,*/ 结束,适用于多行:

<?php
    /* 这是一个多行注释
       用于解释代码的功能或逻辑 */
    echo "多行注释结束后运行的代码。";
?>

6. PHP 是一门弱类型语言

弱类型语言意味着变量的类型可以根据赋值自动转换,无需显式声明类型。PHP 使用 $ 符号定义变量,类型可以是字符串、整数、浮点数、数组等:

<?php
    $text = "这是一个字符串";  // 字符串
    $number = 42;            // 整数
    $price = 19.99;          // 浮点数
?>

PHP 会根据上下文自动调整变量类型:

<?php
    $x = "5";
    $y = 3;
    $sum = $x + $y;  // $x 被自动转换为整数
    echo $sum;       // 输出 8
?>

7. PHP 的特点

  • 跨平台:PHP 可以运行在 Windows、Linux 和 macOS 等多种操作系统上。
  • 开源:PHP 是免费的,且有广泛的社区支持。
  • 嵌套能力:PHP 可与 HTML 紧密结合,用于生成动态内容。
  • 丰富的扩展库:PHP 提供大量扩展,用于处理数据库、文件、网络协议等。

PHP 中的变量及其类型详解

1. PHP 中变量的定义

PHP 中的变量以 $ 开头,后跟变量名。变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。变量名区分大小写。

示例:

<?php
    $name = "Alice"; // 字符串
    $age = 25;       // 整数
?>

2. PHP 变量的类型

PHP 是弱类型语言,变量的类型可以根据赋值自动确定。以下是 PHP 支持的主要变量类型:


1) 字符串 (String)

用于存储文本数据。字符串可以用单引号 ' 或双引号 " 包裹。双引号支持变量解析和转义字符,单引号不支持变量解析。

示例:

<?php
    $str1 = "Hello, PHP!";  // 双引号字符串
    $str2 = 'Hello, World!'; // 单引号字符串
    $name = "Alice";
    echo "My name is $name"; // 输出:My name is Alice
    echo 'My name is $name'; // 输出:My name is $name
?>


2) 整数 (Integer)

用于存储整数值(正数、负数或 0)。必须是无小数点的数字。支持十进制、八进制(以 0 开头)、十六进制(以 0x 开头)和二进制(以 0b 开头)。

示例:

<?php
    $int1 = 42;       // 十进制
    $int2 = 0b101010; // 二进制
    $int3 = 0x2A;     // 十六进制
    $int4 = 052;      // 八进制
    echo $int1;       // 输出:42
?>


3) 浮点数 (Float)

用于存储带小数点的数字或科学计数法表示的数字。

示例:

<?php
    $float1 = 3.14159;   // 小数
    $float2 = 1.2e3;     // 科学计数法 (1.2 * 10^3)
    $float3 = 7E-10;     // 科学计数法 (7 * 10^-10)
    echo $float1;        // 输出:3.14159
?>


4) 布尔值 (Boolean)

用于存储逻辑值:truefalse。常用于条件判断。

示例:

<?php
    $isPHPFun = true;
    $isHard = false;
    if ($isPHPFun) {
        echo "PHP is fun!";
    }
?>


5) 数组 (Array)

数组用于存储多个值。PHP 中数组分为以下三类:

索引数组 (Indexed Array): 使用数字索引。

关联数组 (Associative Array): 使用键值对,键为字符串。

多维数组 (Multidimensional Array): 包含多个数组作为其元素的数组。

  1. a) 索引数组

元素按数字索引从 0 开始。

示例:

<?php
    $fruits = array("Apple", "Banana", "Cherry");
    echo $fruits[0]; // 输出:Apple
?>

也可以使用 [] 语法定义:

<?php
    $fruits = ["Apple", "Banana", "Cherry"];
    echo $fruits[1]; // 输出:Banana
?>

  1. b) 关联数组

元素使用字符串作为键。

示例:

<?php
    $person = array(
        "name" => "Alice",
        "age" => 25,
        "city" => "New York"
    );
    echo $person["name"]; // 输出:Alice
?>

  1. c) 多维数组

数组的元素可以是另一个数组。

示例:

<?php
    $matrix = array(
        array(1, 2, 3),
        array(4, 5, 6),
        array(7, 8, 9)
    );
    echo $matrix[1][2]; // 输出:6
?>


6) 对象 (Object)

PHP 使用类和对象支持面向对象编程。

示例:

<?php
    class Person {
        public $name;
        public $age;

        function __construct($name, $age) {
            $this->name = $name;
            $this->age = $age;
        }

        function greet() {
            return "Hello, my name is $this->name and I am $this->age years old.";
        }
    }

    $person = new Person("Alice", 25);
    echo $person->greet();
    // 输出:Hello, my name is Alice and I am 25 years old.
?>


7) NULL

NULL 是一个特殊的值,用于表示变量没有值。可以通过赋值 NULL 来清空变量。

示例:

<?php
    $var = "Hello, PHP!";
    $var = NULL; // 现在 $var 没有值
?>


3. 变量类型的动态转换

PHP 会根据上下文自动转换变量类型(类型转换)。

示例:

<?php
    $x = "5";
    $y = 10;
    $sum = $x + $y; // 自动将 $x 转换为整数
    echo $sum;      // 输出:15
?>

如何自定义 PHP 变量

在 PHP 中,变量是用来存储数据的标识符,可以是任何类型的值,例如字符串、整数、数组等。以下是自定义变量的详细规则和示例:

1. 使用 $ 定义变量

所有变量必须以美元符号($)开头。后面紧跟变量的名称,这个名称可以是一个有效的标识符。赋值时,使用等号 = 将值赋给变量。

示例

<?php
    $name = "Alice";  // 定义变量 $name,并赋值为字符串 "Alice"
    $age = 25;        // 定义变量 $age,并赋值为整数 25
    $isStudent = true; // 定义变量 $isStudent,并赋值为布尔值 true
?>


2. 变量名称规则

(1) 变量名称不能以数字开头

变量名必须以字母或下划线开头。

不允许以下格式:

<?php
    $1var = "Invalid"; // 错误
    $123name = "Invalid"; // 错误
?>

正确的格式:

<?php
    $var1 = "Valid"; // 正确
    $_name = "Valid"; // 正确
?>

(2) 变量名称只能包含字母、数字和下划线

有效字符包括字母 (A-Z, a-z)、数字 (0-9) 和下划线 _

不允许的格式:

<?php
    $my-var = "Invalid"; // 错误,包含非法字符 "-"
    $my var = "Invalid"; // 错误,包含空格
?>

正确的格式:

<?php
    $my_var = "Valid"; // 正确,使用下划线
    $var123 = "Valid"; // 正确,包含数字
?>

(3) 变量名称对大小写敏感

PHP 中的变量名称是区分大小写的。

示例:

<?php
    $name = "Alice";
    $Name = "Bob";
    echo $name; // 输出:Alice
    echo $Name; // 输出:Bob
?>

$name$Name 是两个不同的变量。

3. 变量的赋值与初始化

变量在第一次赋值时被初始化。PHP 中未赋值的变量默认为 NULL,但建议显式赋值。

示例

<?php
    $count = 10;      // 定义并初始化变量
    $text = "Hello";  // 定义字符串变量
    $empty;           // 未初始化变量,默认为 NULL
    echo $empty;      // 输出为空
?>


4. 动态变量

PHP 支持动态变量,即变量的名称可以由另一个变量的值确定。

示例:

<?php
    $varName = "greeting"; // 定义变量名
    $$varName = "Hello, World!"; // 定义动态变量
    echo $greeting; // 输出:Hello, World!
?>

解释:$$varName 等价于 $greeting

5. 命名约定与最佳实践

遵循清晰和语义化的命名规则:变量名应该能够描述其用途。

不推荐:

<?php
    $x = "Alice"; // 变量名没有意义
    $y = 25;      // 变量名模糊
?>

推荐:

<?php
    $userName = "Alice"; // 清晰的变量名
    $userAge = 25;       // 变量名具有语义
?>

使用驼峰式命名下划线命名

驼峰式命名:$userName, $productPrice

下划线命名:$user_name, $product_price

避免使用保留字作为变量名:如 class, function, echo 等。

6. 变量的作用域

全局变量:定义在函数外部,作用域为整个脚本。

局部变量:定义在函数内部,仅在函数内可用。

示例:

<?php
    $globalVar = "I am global"; // 全局变量

    function testScope() {
        $localVar = "I am local"; // 局部变量
        echo $localVar; // 输出:I am local
    }

    testScope();
    echo $globalVar; // 输出:I am global
    // echo $localVar; // 错误:未定义
?>

PHP 预定义超全局变量

PHP 的 超全局变量是一组预定义的变量,可以在脚本的任何地方使用,而无需显式地声明为 global。它们为处理用户输入、服务器环境信息、会话数据等提供了便利。

1. $GLOBALS

功能:包含所有全局作用域的变量。它是一个超全局数组,变量名作为键。作用:在函数或方法中访问全局变量。

示例

<?php
    $x = 10;
    $y = 20;

    function calculateSum() {
        $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; // 使用$GLOBALS访问全局变量
    }

    calculateSum();
    echo $z; // 输出:30
?>


2. $_SERVER

功能:存储服务器和执行环境的信息。它是一个数组,包含诸如请求头、路径和脚本位置等信息。

常用键值

$_SERVER['PHP_SELF']:当前执行脚本的文件名。

$_SERVER['SERVER_NAME']:服务器的主机名。

$_SERVER['HTTP_HOST']:当前请求的主机头。

$_SERVER['REMOTE_ADDR']:客户端的 IP 地址。

$_SERVER['REQUEST_METHOD']:请求方法(如 GET、POST)。

$_SERVER['QUERY_STRING']:URL 中的查询字符串。

  • 示例

<?php
    echo $_SERVER['PHP_SELF']; // 输出当前脚本名
    echo $_SERVER['SERVER_NAME']; // 输出服务器名
    echo $_SERVER['REMOTE_ADDR']; // 输出客户端 IP
?>


3. $_GET(很常见)

功能:通过 URL 的查询字符串传递的变量。

用途:接收通过 HTTP GET 方法发送的数据。

特点

数据附加在 URL 后(如 example.com/index.php?name=Alice)。适合小型、非敏感数据的传递。

示例

<?php
    // URL: example.com/index.php?name=Alice&age=25
    $name = $_GET['name']; // 获取 URL 中的 name 参数
    $age = $_GET['age'];   // 获取 URL 中的 age 参数
    echo "Name: $name, Age: $age"; // 输出:Name: Alice, Age: 25
?>


4. $_POST(网安在抓包的时候经常看到POST请求)

功能:通过 HTTP POST 方法传递的变量。

用途:接收表单中通过 POST 方法发送的数据。

特点:数据不会显示在 URL 中,适合传递大量或敏感数据。

示例

<?php
    // 表单提交后接收数据
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $username = $_POST['username'];
        $password = $_POST['password'];
        echo "Username: $username, Password: $password";
    }
?>


5. $_REQUEST

功能:包含通过 GET、POST 或 COOKIE 方法传递的所有输入。

用途:访问用户输入的通用方法,但推荐使用 $_GET 和 $_POST 来明确区分来源。

示例

<?php
    $name = $_REQUEST['name']; // 可能来自 GET 或 POST
    echo "Hello, $name!";
?>


6. $_SESSION

功能:存储会话变量,用于跨页面维持用户数据。特点

需要启动会话:session_start()

数据存储在服务器端。

数据会在浏览器关闭后失效,除非配置会话持续时间。

示例

<?php
    session_start(); // 开启会话
    $_SESSION['user'] = "Alice"; // 设置会话变量
    echo $_SESSION['user']; // 输出:Alice
?>


7. $_COOKIE

功能:通过客户端存储的小型数据,用于持久化跨会话的信息。

特点

数据存储在客户端浏览器中。

设置 Cookie 使用 setcookie()

示例

<?php
    // 设置一个 Cookie
    setcookie("username", "Alice", time() + 3600); // 1小时有效
    echo $_COOKIE['username']; // 输出:Alice
?>


8. $_FILES

功能:处理文件上传的数据。

用途:在表单中上传文件,并获取文件信息。

常用键值

$_FILES['file']['name']:文件名。

$_FILES['file']['tmp_name']:临时文件的路径。

$_FILES['file']['size']:文件大小。

$_FILES['file']['error']:错误代码。

示例

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $fileName = $_FILES['file']['name'];
        $tmpPath = $_FILES['file']['tmp_name'];
        move_uploaded_file($tmpPath, "uploads/" . $fileName); // 保存文件
        echo "File uploaded: $fileName";
    }
?>

总结表

超全局变量

用途

备注

$GLOBALS

全局作用域的所有变量

用于函数中访问全局变量

$_SERVER

服务器和环境信息

提供请求头、服务器信息等

$_GET

URL 查询字符串的数据

数据可见于 URL,适合小型数据传递

$_POST

表单通过 POST 提交的数据

数据不显示在 URL,适合敏感数据传递

$_REQUEST

GET、POST 或 COOKIE 数据的集合

不推荐用于明确来源的数据

$_SESSION

会话变量

数据存储在服务器端,需启动会话

$_COOKIE

客户端存储的小型数据

数据存储于客户端浏览器

$_FILES

文件上传相关信息

处理文件上传表单的数据

HTTP GET 和 POST 方法的区别

在 HTTP 协议中,GET 和 POST 是最常用的两种请求方法,用于客户端与服务器之间的数据交互。虽然它们的功能相似,但在用途和技术实现上有显著差异。


1. 数据传输方式

GET

POST

通过 URL 的查询字符串传输数据

通过请求体(Body)传输数据

数据直接附加在 URL 后,形式为 example.com?name=Alice&age=25

数据不显示在 URL 中,嵌入请求体,形式不可见。

2. 数据长度限制

GET

POST

数据长度有限制,因为 URL 的长度受到浏览器和服务器的限制(通常为 2048 个字符)。

无明显长度限制,可传输大量数据,具体限制取决于服务器设置。

3. 数据安全性

GET

POST

安全性较低,因为数据包含在 URL 中,容易被拦截或记录在浏览历史中。

相对安全,数据存储在请求体中,不会出现在浏览器地址栏,但仍需使用 HTTPS 保护。

4. 数据用途

GET

POST

用于请求数据。典型用途是获取资源,如网页或 API 数据。

用于提交数据。典型用途是提交表单或上传文件。

示例:查询用户信息。

示例:登录、注册。

5. 可缓存性

GET

POST

可以被缓存。浏览器和中间代理服务器会缓存 GET 请求。

不会被缓存。每次都会提交新的请求。

6. 浏览器行为

GET

POST

可通过浏览器的地址栏直接输入或保存为书签。

不能通过地址栏直接输入,也不能保存为书签。

可被搜索引擎索引。

不会被搜索引擎索引。

7. 常用场景

GET

POST

适用于查询操作,如搜索页面或获取资源信息。

适用于需要对服务器进行修改或提交敏感数据的操作。

示例:在线搜索、分页。

示例:提交表单、上传文件。

8. 示例代码

GET 示例

<?php
    // URL: example.com/index.php?name=Alice&age=25
    echo "Name: " . $_GET['name']; // 获取 GET 参数
    echo "Age: " . $_GET['age'];
?>

POST 示例

<form method="post" action="submit.php">
    Name: <input type="text" name="name">
    Age: <input type="text" name="age">
    <input type="submit">
</form>

<?php
    echo "Name: " . $_POST['name']; // 获取 POST 参数
    echo "Age: " . $_POST['age'];
?>

总结表

特点

GET

POST

数据传输方式

数据附加在 URL 后,通过查询字符串传输

数据存储在请求体中,隐式传输

数据长度限制

有限,依赖于 URL 长度限制

理论上无限,但受服务器配置影响

数据安全性

较低,数据可被记录或拦截

较高,数据不可见,但需要 HTTPS 保护

数据用途

适合获取资源或查询

适合提交表单或敏感数据

可缓存性

可以缓存

不会缓存

浏览器支持

支持通过地址栏直接访问,URL 可分享

不支持通过地址栏访问,无法直接分享

常见用途

搜索、查询、分页

登录、注册、提交表单、文件上传

PHP函数

1. echo

作用:输出字符串或变量到页面。用途:在调试时显示变量值,生成页面内容。

特点

不返回值,直接输出。

可输出多个字符串,逗号分隔。

示例

$message = "Hello, World!";
echo $message; // 输出 Hello, World!
echo "This ", "is ", "a ", "test."; // 输出 This is a test.


2. var_dump

作用:显示变量的详细信息,包括类型和值。

用途:调试时分析变量内容和数据结构。

特点

可显示复杂数据类型(如数组、对象)。

输出包括变量类型和值,调试时非常实用。

示例

$array = [1, "PHP", true];
var_dump($array);
// 输出:
// array(3) {
//   [0]=> int(1)
//   [1]=> string(3) "PHP"
//   [2]=> bool(true)
// }


3. setcookie

作用:在客户端设置一个 cookie。

用途:用于会话管理、跟踪用户状态。

参数

  1. Cookie 名称。
  2. Cookie 值。
  3. 过期时间(时间戳)。
  4. 可选路径、域名和安全选项。

示例

setcookie("user", "Alice", time() + 3600, "/");
// 设置一个名为 user 的 cookie,有效期为 1 小时。


4. session_start

作用:启动一个会话,或恢复现有会话。

用途:用于保存用户状态信息,例如登录状态。

特点

必须在任何输出之前调用。

默认会话数据存储在服务器上,通过客户端的 session ID 匹配。

示例

session_start(); // 开启会话
$_SESSION['user'] = 'Alice'; // 设置会话变量
echo $_SESSION['user']; // 输出会话变量值

补充的安全相关 PHP 函数

在学习和实践网络安全时,这些 PHP 函数可以帮助保护应用程序免受常见漏洞的影响,并用于开发安全的代码。以下是详细的介绍:

1. 文件操作相关

file_get_contents()

作用:读取文件内容并以字符串形式返回。

用途:用于检测本地文件包含漏洞(LFI)或远程文件包含漏洞(RFI)。

示例

$content = file_get_contents("config.txt");
echo $content; // 输出文件内容

file_put_contents()

作用:将数据写入文件(覆盖或追加)。

用途:测试文件操作漏洞或用于日志记录。

示例

file_put_contents("log.txt", "Unauthorized access detected\n", FILE_APPEND);

unlink()

作用:删除指定文件。

用途:用于清理敏感文件或测试文件删除权限。

示例

if (file_exists("temp.txt")) {
    unlink("temp.txt"); // 删除临时文件
}


2. 用户输入处理

htmlspecialchars()

作用:将 HTML 特殊字符转换为实体,防止 HTML 注入。

用途:防止 XSS(跨站脚本攻击)。

示例

$user_input = '<script>alert("XSS")</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// 输出:&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;

strip_tags()

作用:移除字符串中的 HTML 和 PHP 标签。

用途:用于对用户输入的基本清理。

示例

$input = '<p>Hello <b>World</b></p>';
echo strip_tags($input); // 输出:Hello World

addslashes()

作用:在字符串中的引号前添加反斜杠,转义特殊字符。

用途:保护数据免受 SQL 注入攻击。

示例

$unsafe_data = "Alice's home";
$safe_data = addslashes($unsafe_data);
echo $safe_data; // 输出:Alice\'s home


3. 数据库操作

mysqli_real_escape_string()

作用:转义 SQL 查询中的特殊字符。

用途:防止 SQL 注入。

示例

$conn = new mysqli("localhost", "user", "password", "database");
$unsafe_input = "' OR '1'='1";
$safe_input = $conn->real_escape_string($unsafe_input);
$query = "SELECT * FROM users WHERE username = '$safe_input'";

PDO::prepare()

作用:使用预编译语句,防止 SQL 注入。

用途:推荐的安全数据库查询方法。

示例

$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $unsafe_input]);


4. 加密与解密

hash()

作用:生成字符串的哈希值。

用途:用于存储密码或验证数据完整性。

示例

$password = "securepassword";
$hashed_password = hash("sha256", $password);

password_hash()

作用:生成强散列密码。

用途:安全地存储用户密码。

示例

$password = "securepassword";
$hash = password_hash($password, PASSWORD_DEFAULT);

openssl_encrypt() / openssl_decrypt()

作用:加密或解密数据。

用途:用于传输敏感信息的保护。

示例

$data = "Sensitive Information";
$key = "encryptionkey";
$encrypted = openssl_encrypt($data, "AES-128-ECB", $key);
$decrypted = openssl_decrypt($encrypted, "AES-128-ECB", $key);


5. 网络交互与响应

header()

作用:发送原始 HTTP 报头。

用途:用于设置重定向、防止缓存、或指定内容类型。

示例

header("Location: login.php");

http_response_code()

作用:设置 HTTP 响应状态码。

用途:用于返回特定的 HTTP 状态(如 404, 500)。

示例

http_response_code(404);
echo "Page not found";


6. 全局变量管理

$GLOBALS

作用:访问所有全局变量。

用途:在需要跨函数共享数据时使用。

示例

$x = 10;
function test() {
    echo $GLOBALS['x']; // 输出 10
}

session_start()

作用:启动或恢复会话。

用途:管理用户登录状态。

示例

session_start();
$_SESSION['user'] = 'Alice';

总结

以上函数涵盖了文件操作、用户输入过滤、数据库操作、加密解密和网络交互等安全开发的关键领域。结合这些函数,您可以有效防范常见的安全漏洞(如 XSS、SQL 注入、文件包含攻击等),并提高 PHP 应用的安全性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。