冬令营模块一
思考问题
1. 每次的 HTTP 请求都相互独立,如何做到登录之后服务器知道你是谁?(Cookie 与 Session)
HTTP 的无状态性
HTTP 协议是无状态的,即每次请求都是独立的,服务器不会记住之前的请求。为了在多次请求中保持用户的身份信息,通常使用 Cookie 和 Session 机制。
Session 的实现原理
- 用户登录时,服务器创建 Session,并生成唯一的 Session ID。
- 服务器将 Session ID 通过
Set-Cookie
发送给客户端,存储在 Cookie 中(默认名PHPSESSID
)。 - 后续请求时,浏览器自动携带该 Session ID,服务器根据 Session ID 识别用户。
2. PHP 如何开启 Session?如何使用 Session?对应的 Cookie 有什么特征?
开启与使用 Session
在 PHP 中,使用 session_start()
来开启 Session。
1 |
|
读取 Session
1 |
|
销毁 Session
1 |
|
Session 相关的 Cookie 特征
- 默认名称:
PHPSESSID
,可以通过session_name()
修改。 - 生命周期:默认在浏览器关闭时失效,可用
session.cookie_lifetime
配置。 - 安全性:
- 通过
HttpOnly
使其无法被 JavaScript 访问,防止 XSS 攻击。 - 通过
Secure
选项仅允许 HTTPS 传输。 - 服务器端可以通过
session_regenerate_id()
生成新的 Session ID,提高安全性。
- 通过
3. PHP 如何与 MySQL 连接?如何在 PHP 中查询数据库中的数据?
(部分信息来自chatGPT)
PHP 连接 MySQL 有多种方式,常用的包括:
- MySQLi(面向过程 / 面向对象)
- PDO(PHP Data Objects,推荐使用)
使用 MySQLi 连接数据库(面向过程)
1 |
|
查询数据
1 |
|
使用 PDO 连接 MySQL(推荐)
1 |
|
使用 PDO 查询数据
1 |
|
4. PHP 发送 SQL 语句的几种方式?有什么不同?
方式 | 适用场景 | 是否支持预处理 | 安全性 |
---|---|---|---|
mysqli_query() |
简单查询 | 否 | 低,容易被 SQL 注入 |
mysqli_prepare() |
预处理查询 | 是 | 高,防止 SQL 注入 |
PDO::query() |
适用于简单查询 | 否 | 低 |
PDO::prepare() |
预处理查询 | 是 | 高 |
使用 mysqli_prepare()
进行预处理
1 |
|
使用 PDO::prepare()
进行预处理
1 |
|
5. 如何在服务器上让 PHP 跑起来?什么是 Web 服务器?默认 PHP 文件应该放在哪里?
Web 服务器的作用
Web 服务器(如 Apache、Nginx)负责处理 HTTP 请求,并执行 PHP 代码,将生成的 HTML 返回给浏览器。
PHP 运行方式
使用 Apache + PHP(mod_php)
- 默认 PHP 文件存放在
/var/www/html/
(Linux) 或C:\xampp\htdocs\
(Windows)。 - 配置 Apache 解析 PHP 文件,并访问
http://localhost/index.php
。
- 默认 PHP 文件存放在
使用 Nginx + PHP-FPM
- 需要
fastcgi_pass
配置 PHP 解析。
- 需要
使用 PHP 内置服务器(开发测试用)
1
2
3
4
5sh
复制编辑
php -S localhost:8000访问
http://localhost:8000
。
6. 尝试在只有纯命令行的服务器上执行一些命令
基础 Linux 命令
1 | # 查看当前目录 |
运行 PHP
1 | php -v # 查看 PHP 版本 |
管理 MySQL
1 | mysql -u root -p # 登录 MySQL |
总结
- Session 通过
session_start()
维护登录状态,Session ID 存储在 Cookie 中。 - PHP 连接 MySQL 可使用
mysqli
或PDO
,推荐使用PDO
进行预处理查询。 - PHP 可以通过 Apache、Nginx 或内置服务器运行。
- 在 Linux 服务器上可以使用
php
命令执行 PHP 代码,并管理 MySQL 数据库。
XSS
关于XSS可见之前的笔记
https://linjiang29.github.io/2024/10/20/XSS/
SQL注入漏洞
初步了解SQL注入
SQL注入漏洞的成因?
SQL 注入(SQL Injection)漏洞的根本原因是 Web 应用程序未对用户输入进行充分的校验和处理,导致攻击者可以通过精心构造的输入,篡改 SQL 语句,执行恶意数据库操作。
用户输入未经过滤或转义
- 直接将用户输入的字符串拼接到 SQL 语句中,导致 SQL 语句结构被篡改。
服务器权限过大
- 数据库账号使用 root 或者 高权限用户 运行 SQL,攻击者可能执行 DROP TABLE、DELETE、UPDATE 等操作,造成严重破坏。
错误信息暴露
- 如果 SQL 语法错误,服务器会返回 详细的错误信息,攻击者可以利用这些信息来推测数据库结构(如
Table 'users' doesn't exist
之类的提示)。
SQL注入造成的影响?
SQL 注入可能会导致以下严重后果:
影响类型 | 描述 |
---|---|
💀 数据泄露 | 攻击者可以获取数据库中的敏感信息,如 用户名、密码、信用卡信息 |
🛠 数据篡改 | 可以修改数据库中的信息,例如修改管理员密码 |
🚀 绕过身份验证 | 直接登录管理员账号,不需要密码 |
🔥 服务器权限提升 | 在某些情况下,可以执行 系统命令(如 xp_cmdshell 在 SQL Server 中) |
💣 数据库破坏 | 使用 DROP TABLE 删除所有数据,导致数据库崩溃 |
🦠 挂马 & 植入后门 | 通过 SQL 语句执行系统命令,植入木马或后门 |
SQL注入漏洞的类型?
基本 SQL 注入
特点:直接插入 SQL 语句,改变原有 SQL 逻辑
1
' OR '1'='1' --
报错注入(Error-based SQL Injection)
特点:利用数据库错误信息获取数据
1
' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), 0x7e, FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x) a) --
盲注(Blind SQL Injection)
(不回显数据,通过布尔值或时间判断是否正确)
布尔型盲注:
1
2
3
4
5sql
复制编辑
' AND (SELECT 1 FROM users WHERE username='admin' AND LENGTH(password) > 10) --- 如果返回正常页面:说明管理员密码长度大于 10。
时间盲注(Time-based Blind SQL Injection)
1
2
3
4
5sql
复制编辑
' OR IF(SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1)='a', SLEEP(5), 0) --- 如果服务器 延迟 5 秒,说明 **管理员密码的第一个字符是
a
**。
如何进行防范?(预处理)
最有效的方法:使用 预处理(Prepared Statements)
预处理语句可以防止 SQL 语法被用户输入破坏,从而 彻底杜绝 SQL 注入。
其他防御措施
防御方法 | 描述 |
---|---|
✅ 使用预处理 | 最有效的防御方式,所有 SQL 查询都用 Prepared Statements |
✅ 输入校验 | 限制用户名、密码的输入格式(如只允许 字母+数字) |
✅ 最小权限原则 | 数据库用户权限最小化,禁止 DROP / UPDATE 等高危操作 |
✅ 关闭详细错误信息 | 避免 SQL 错误信息回显,防止泄露表名、列名 |
✅ WAF(Web 应用防火墙) | 使用防火墙 拦截 SQL 注入,如 ModSecurity |
- 本文作者: 林姜
- 本文链接: http://example.com/2025/02/04/冬令营模块一/