云计算百科
云计算领域专业知识百科平台

Web安全基础相关知识3.0(后端服务器)

PHP语言

PHP(全称:PHP: Hypertext Preprocessor,即“超文本预处理器”)是一种开源、通用的服务器端脚本语言,尤其适合 Web 开发。它可嵌入 HTML,在服务器上执行并生成动态内容(如网页、接口),再将结果返回给浏览器。

发展历史

* 1994年:Rasmus Lerdorf 为管理个人主页创建了 PHP 雏形。
* 1995年:发布 PHP/FI (Personal Home Page / Forms Interpreter),标志着 PHP 的诞生。
* 1998年:PHP 3 发布,重写了解析器并正式更名为 PHP,开始支持面向对象编程。
* 2000年:PHP 4 基于 Zend Engine 1.0,性能和扩展性大幅提升。
* 2004年:PHP 5 引入 Zend Engine 2.0,全面支持面向对象编程(OOP)。
* 2015年:PHP 7 发布,性能翻倍,并引入标量类型声明、返回类型声明等新特性。
* 2020年至今:PHP 8 引入 JIT(即时编译)和联合类型、属性、match 表达式等现代语言特性,持续提升性能与开发体验。

核心特点

* 开源免费:可自由使用、修改和分发,社区活跃,生态丰富。
* 服务器端执行:代码在服务器运行,生成 HTML 发送给客户端,保障源码安全。
* 易于嵌入 HTML:可在 
".php" 文件中混合编写 HTML、CSS、JavaScript 和 PHP 代码。
* 跨平台:支持 Windows、Linux、macOS 等多种操作系统。
* 数据库集成能力强:原生支持 MySQL、PostgreSQL、SQLite 等,并提供 PDO 等通用接口。
* 语法简单:语法接近 C/Perl,对初学者友好,开发效率高。
* 支持多种协议:除 HTTP/HTTPS 外,还支持 FTP、IMAP、POP3、SMTP 等。
* 扩展性强:拥有大量内置函数和扩展(如 GD、cURL),也支持用 C 语言编写自定义扩展。

主要应用场景

* 动态网站与内容管理系统 (CMS):如 WordPress、Drupal、织梦等。
* 电子商务平台:各类在线商城、订单系统。
* 社交网络与社区论坛:如早期的 Facebook、各类 BBS。
* Web 应用与 API 接口:开发后端服务、RESTful API、微服务。
* 命令行脚本:用于定时任务、批量数据处理等。
* 图像处理与文件操作:生成验证码、缩略图,处理文件上传下载。

基本语法示例

PHP 文件通常以 
".php" 为扩展名,可包含 HTML 和 PHP 代码。

1. Hello World

php

<?php

echo "Hello, World!";

?>

说明:
"<?php … ?>" 是 PHP 代码块标签             "echo" 用于输出内容             语句以分号    ";" 结尾

2. 变量与数据类型

PHP 是弱类型语言,变量以 "$" 开头,无需预先声明类型。

php

<?php

$name = "Alice";     // 字符串

$age = 25;            // 整数

$price = 9.99;        // 浮点数

$isStudent = true;    // 布尔值

$colors = ["red", "green", "blue"]; // 数组

echo " name is  age years old.";

?>

3. 控制结构

支持常见的 "if/else"、"switch"、"for"、"while"、"foreach" 等流程控制语句。

php

<?php

$score = 85;

if ($score >= 90) {

echo "优秀";

} elseif ($score >= 70) {

echo "良好";

} else {

echo "一般";

}

for ( i = 1;  i <= 5; $i++) {

echo $i . " ";

}

?>

4. 函数

使用 
"function" 关键字定义可复用的代码块。

php

<?php

function greet($name) {

return "Hello, " . $name . "!";

}

echo greet("Bob");

?>

5. 表单处理

通过超全局数组 
"$_GET" 和 
"$_POST" 获取用户提交的数据。

php

<!– form.html –>

<form method="post" action="process.php">

<input type="text" name="username">

<button type="submit">提交</button>

</form>

<!– process.php –>

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {

 username = htmlspecialchars( _POST['username']); // 简单过滤

echo "Welcome, " . $username;

}

?>

6. 数据库操作 

使用 MySQLi 扩展连接并操作 MySQL 数据库。

php

<?php

$conn = new mysqli("localhost", "root", "password", "test_db");

if ($conn->connect_error) {

die("连接失败: " . $conn->connect_error);

}

$sql = "SELECT id, name FROM users";

 result =  conn->query($sql);

if ($result->num_rows > 0) {

while( row =  result->fetch_assoc()) {

echo "ID: " .  row["id"]. " – Name: " .  row["name"]. "<br>";

}

} else {

echo "0 结果";

}

$conn->close();

?>

运行机制

1. 用户请求:浏览器向服务器请求一个 
".php" 页面。
2. 服务器解析:Web 服务器(如 Apache/Nginx)将请求交给 PHP 引擎处理。
3. 代码执行:PHP 引擎执行脚本,可能连接数据库、处理业务逻辑等。
4. 生成结果:脚本执行完毕后,生成纯 HTML 内容。
5. 返回响应:Web 服务器将生成的 HTML 发送回用户的浏览器进行渲染。

核心组件

* Zend 引擎:PHP 的核心,负责将 PHP 代码编译为 opcode 并执行。
* OPcache:缓存 opcode,避免重复编译,显著提升性能。
* PHP-FPM:一个高效的 FastCGI 进程管理器,用于处理并发请求。

GET与POST

首先,一个最形象的比喻:

* GET 就像是在图书馆查书目录。你只是去获取信息,这个行为本身不会改变任何东西。
* POST 就像是向图书馆提交一份新书申请或借书单。你通过它来向系统提交数据,并希望系统能根据这些数据做出一些改变或处理。

核心区别对比表

特征                       GET                                                   POST
主要用途               从服务器获取(查询)数据                向服务器提交(创建/更新)数据
数据位置               附加在 URL 之后 (Query String)         包含在 HTTP 请求体 (Body) 中

可见性            GET明文显示在地址栏,对用户可见且可被浏览器历史记录保存 对用户不可见,不                         直接显示在地址栏
                       POST安全性 较低。因为数据暴露在 URL 中,不适合传输密码等敏感信息  相对较                         高。敏感信息放在 Body 里更安全(注意:这不代表加密,HTTPS才是加密保障)

数据长度限制      GET         有     受限于浏览器和服务器对 URL 长度的限制(通常为几千个字符)

                            POST      理论上无    理论上可以发送非常大的数据包(取决于服务器的配置)

数据类型              GET      只允许 ASCII 字符,需要进行 URL 编码。

                             POST   没有限制。可以是二进制数据(如图片、文件)、文本等。

后退/刷新按钮      GET无害。浏览器通常会重新发起 GET 请求,不会提示用户。

                             POST有风险。浏览器会弹出一个警告,提示用户是否要重新提交表单,因为可                              能会导致数据被再次处理。

书签/分享 可以将带参数的 URL 直接添加为书签或分享给他人。 不可以直接通过书签或分享 URL 来重现一次 POST 请求。

举例说明

1. GET 请求示例

当你在百度搜索 "PHP" 时,你的浏览器会向百度的服务器发送一个 GET 请求。

* URL 看起来像这样:
"https://www.baidu.com/s?wd=PHP"
* 发生了什么?
   * 你在浏览器的地址栏可以看到完整的搜索词 
"wd=PHP"。
   * 你可以点击“刷新”按钮,重新进行这次搜索,没有任何问题。
   * 你可以复制这个 URL 发给朋友,他们点开就能看到同样的搜索结果。
* 这是否符合预期? 完全符合!你只是想获取关于 "PHP" 的搜索结果,没有对服务器做任何更改。

2. POST 请求示例

当你在一个电商网站(如淘宝)上填写完收货信息并提交订单时,你的浏览器会向服务器发送一个 POST 请求。

* URL 看起来像这样:
"https://trade.taobao.com/trade/itemlist/list_buy.htm"(注意:URL 中没有包含你的姓名、地址等信息)
* 发生了什么?
   * 你的收货地址、商品信息等数据被打包在了请求的 Body 里发送给了服务器。
   * 浏览器地址栏看不到这些信息。
   * 如果你提交订单后点击“刷新”,浏览器会弹出警告框:“确认重新提交表单吗?”,因为这可能会导致你下了两份一模一样的订单!
* 这是否符合预期? 完全符合!你是在创建一笔新的交易记录,这个行为改变了服务器的状态。

总结与最佳实践

选择 GET 当… 选择 POST 当…
从服务器获取数据(如加载一个页面、搜索、查看商品列表)。 向服务器提交数据(如登录、注册、发表评论、下订单、上传文件)。
数据不敏感,可以公开。 数据敏感,如密码、银行卡号。
需要书签或分享某个特定状态。 需要修改或创建服务器上的资源。
数据量很小,且是简单的文本。 数据量很大,或者是文件、图像等复杂数据。

重要提醒:

* 安全不是由 GET/POST 决定的,而是由 HTTPS 决定的。 使用 HTTPS 协议会对整个通信过程(包括 URL 和请求体)进行加密,从而保护数据安全。
* 不要仅依赖 GET 来“隐藏”敏感数据。 因为 URL 会被保存在服务器日志、浏览器历史记录、Referer 头中,这些地方都可能泄露数据。
* 永远不要将关键操作(如删除、支付)通过 GET 实现。 这非常危险,因为用户可能无意中触发了带有恶意链接的页面,或者搜索引擎爬虫访问了这些 URL。

理解并正确应用 GET 和 POST 是构建安全、可靠、符合规范的 Web 应用的基础。
好的,我们来详细讲解一下 PHP 中的各种运算符和常见的标签。

PHP中运算符

1. 算术运算符

用于基本的数学运算。

运算符    名称           描述                                             示例          结果

"+"          加法    左右操作数之和                                 "10 + 2"      "12"

"-"           减法    左右操作数之差                                 "10 – 2"        "8"

"*"           乘法    左右操作数之积                                 "10 * 2"       "20"

"/"           除法    左操作数除以右操作数                       "10 / 2"        "5"

"%"         取模    左操作数除以右操作数的余数            "10 % 3"      "1"

"**"         求幂    左操作数的右操作数次方                    "2 ** 3"        "8"

2. 赋值运算符

用于为变量赋值。

运算符                 描述                                                         等价于

"="                       最基本的赋值运算符                                "$a = $b"

"+="                     加后再赋值 "$a += $b" →                       "$a = $a + $b"

"-="                      减后再赋值 "$a -= $b" →                        "$a = $a – $b"

"*="                     乘后再赋值 "$a *= $b" →                         "$a = $a * $b"

"/="                      除后再赋值 "$a /= $b" →                         "$a = $a / $b"

".="                     连接字符串后再赋值 "$a .= $b" →            "$a = $a . $b"

"%="                   取模后再赋值 "$a %= $b" →                    "$a = $a % $b"

"**="                   求幂后再赋值 (PHP 5.6+) "$a **= $b" → "$a = $a ** $b"

3. 比较运算符

用于比较两个值,返回"true" 或 "false"。

运算符           名称          描述                                                       示例              结果 (当 a=5, b=10)

"=="                等于        如果值相等则为真                                      "$a == $b"        "false"

"==="             全等        如果值和类型都相等则为真                        "$a === 5"         "true"

"!="或  "<>"    不等于    如果值不相等则为真                                   "$a != $b"           "true"

"!=="              不全等    如果值或类型不相等则为真                         "$a !== '5' "        "true"

">"                 大于        如果左操作数大于右操作数则为真              "$a > $b"            "false"

"<"                 小于        如果左操作数小于右操作数则为真              "$a < $b"            "true"

">="               大于等于 如果左操作数不小于右操作数则为真          "$a >= 10"          "false"

"<="               小于等于 如果左操作数不大于右操作数则为真          "$a <= 5"             "true"

"<=>"            太空船运算符 比较大小,左边大返回1,相等

                     返回0,右边大返回-1                                                  "$a <=> $b"            "-1"

4. 逻辑运算符

用于组合条件语句。

运算符       名称        描述                                         示例                    结果 (当 a=true, b=false)

"and"          与           如果左右都为真则为真             "$a and $b"        "false"

"or"             或           如果左右有一个为真则为真      "$a or $b"           "true"

"xor"         异或         如果左右只有一个为真则为真   "$a xor $b"          "true"

"!"               非           取反,如果为假则为真                 "!$a"                "false"

"&&"           与           与"and" 同,但优先级更高         "$a && $b"         "false"

"\\|\\|"            或          与  "or" 同,但优先级更高           "$a \\|\\| $b"          "true"

注意:
"and"/ "or" 的优先级低于 "=",而 "&&"/ "||" 的优先级高于 "="。

5. 递增/递减运算符

对变量进行 +1 或 -1 操作。

运算符       名称                描述                                      示例               (假设 $a=5)

"++$a"       前递增     先让 a 加 1,再返回  a 的值       "echo ++$a;"      输出 "6"

"$a++"       后递增     先返回 a 的值,再让  a 加 1        "echo $a++;"     输出 "5"

"–$a"         前递减    先让 a 减 1,再返回  a 的值         "echo –$a;"       输出 "4"

"$a–"         后递减    先返回 a 的值,再让  a 减 1         "echo $a–;"       输出 "5"

6. 字符串运算符

专门用于连接字符串。

运算符        名称             描述                                                             示例                 结果

"."                连接            将左右两个字符串连接起来                     " "Hel" . "lo" "     ""Hello""

".="              连接赋值     将右边的字符串追加到左边的变量后面   "$str = "Hi"; $str .= " there!";" 
"$str" 的值为""Hi there!""

7. 数组运算符

专门用于合并和操作数组。

运算符                   名称 

"+"                          联合 

描述
"$a + $b",返回一个包含了 
"$a" 中所有元素和 
"$b" 中所有元素的并集。
"$b" 中与 
"$a" 键名相同的元素会被忽略。

"=="                         相等 

描述
"$a == $b",如果 
"$a" 和 
"$b" 具有相同的键/值对则为 
"true"。

"==="                       全等

描述 
"$a === $b",如果 
"$a" 和 
"$b" 具有相同的键/值对并且顺序相同、类型相同则为 
"true"。

"!="                             或 

描述
"<>" 不相等 
"$a != $b",如果 
"$a" 不等于 
"$b" 则为 
"true"。

"!=="                         不全等 

描述
"$a !== $b",如果 
"$a" 不全等于 
"$b" 则为 
"true"。

PHP 的常见标签

PHP 脚本需要用特殊的界定符包围起来,以便服务器识别哪部分是 PHP 代码。

1. 标准标签

这是最常用的写法,在所有版本的 PHP 中都可用。

<?php
// 这里是 PHP 代码
?>

2. 短标签

这是一种简短的写法,但依赖于服务器的配置(
"short_open_tag")。

<?
// 这里是 PHP 代码
?>

3. ASP 风格标签

模仿 ASP/JSP 风格的写法,同样依赖于服务器的配置(
"asp_tags")。

<%
// 这里是 PHP 代码
%>

4. HTML 脚本标签

一种兼容旧系统的写法。

<script language="php">
// 这里是 PHP 代码
</script>

建议

1. 首选标准标签 ("<?php ?>"):为了保证代码的可移植性和兼容性,强烈建议始终使用标准标签。避免使用短标签或 ASP 标签,因为你无法保证部署代码的服务器开启了相应配置。
2. 省略结束标签 ("?>"):当一个 PHP 文件只包含 PHP 代码(没有 HTML)或者在文件的末尾时,最佳实践是省略最后的结束标签 "?>"。这可以避免因意外的空格或换行导致的头部已发送错误 (Headers already sent)。
<?php
// … 一大堆 PHP 代码 …
// 这里什么都不写,不写 ?>
3. 合理使用运算符
   * 在进行数值比较时,如果需要严格的类型和值都相同,请务必使用 
"===" 和 
"!=="。
   * 对于复杂的逻辑判断,优先使用 
"&&" 和 
"||",因为它们比 
"and"/
"or" 更直观且优先级不易出错。
   * 在处理用户输入或不确定数据时,使用松散比较 (
"==") 时要格外小心。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Web安全基础相关知识3.0(后端服务器)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!