网络安全-Web应用基础6
Web应用基础
PHP表单
PHP超级全局变量
什么是PHP超级全局变量
- PHP中预定义了几个超级全局变量(super globals)
- 在一个脚本的全部作用域中都可用,不需要特别说明,就可以在函数及类中使用
PHP接收表单数据
$_GET、$POST和$_REQUEST
- $POST接受所有以post方式发送的请求
- $_GET接受所有以get方式发送的请求
- $_REQUEST接受get和post方式发送的请求,但是比较慢
表单get请求
表单提交方式为get请求
- 创建login.html,关键内容如下
1 | <meta charset="utf-8"> |
- 创建login.php文件,内容如下
1 |
|
表单post请求
表单提交方式为post请求
- 修改login.html文件,将提交方式修改为post
1 | <meta charset="utf-8"> |
- 修改login.php文件,使用$_POST接收数据
1 |
|
为空验证
为了提高安全性,通常需要对用户的表单输入做验证和处理
必需字段
- 如果是必需字段,可以使用empty函数做验证
1 | if(empty($_POST["username"])){ |
正则验证
正则匹配
如果需要精确验证,可以使用preg_match()函数进行正则匹配
- 案例:验证名称只能包含字母和空格
1 | $username = $_POST["username"]; |
数据处理
对输入的数据处理
- trim()函数去除用户输入数据中不必要的字符(如:空格,tab,换行)
- stripslashes()函数去除用户输入数据中的反斜杠(\)
- htmlspecialchar()函数把一些预定义的字符转换为HTML实体
1 | $data = 'NTD 123'; |
PHP Cookie和Session
PHP超级全局变量
S_COOKIE和$_SESSION
- Cookie和Session都是为了保存会话状态
- $_COOKIE保存设置的cookie值
- $_SESSION保存和设置session值
PHP Cookie介绍
- HTTP协议本身是无状态的
- Cookie是保存会话状态的一种方式
- Cookie服务器将数据存储在客户端浏览器中
PHP Cookie的使用
创建cookie
- setcookie()函数用于设置cookie
- setcookie()函数必须位于<html>标签之前
- 如果成功,该函数返回true,如果失败则返回false
语法
1 | setcookie(name,value,expire) |
参数说明
- name:必选,cookie的名称
- value:必选,cookie的值
- expire:可选,cookie的过期时间,默认浏览器关闭后失效
案例
1 |
|
获取cookie
- PHP的$_COOKIE变量用于取回cookie的值
在获取前,可以使用isset()函数来确认是否已设置了cookie
1 |
|
删除cookie
- 通过设置cookie的时间为过去的时间点来删除cookie
1 |
|
PHP Session介绍
- HTTP协议本身是无状态的
- Session是另外一种保存会话状态的方式
- Session将数据存储在服务器端
- 与Cookie相比,数据相对安全
- 与Cookie相比,可以存储比较多的数据
PHP Session的使用
启动会话
- 必须先启动会话,然后才可以使用Session
- session_start()函数用于启动会话
- session_start()函数必须位于html标签之前
1 |
|
设置和获取Session
- 设置和获取Session,都是通过PHP $_SESSION变量实现
1 |
|
销毁和删除Session
- 删除某些session数据,可以使用unset()或session_destroy()函数
- unset()函数用于释放指定的session变量
- session_destroy()函数用于彻底销毁session
1 |
|
PHP访问MySQL数据库
PHP访问MySQL数据库
- 通过PHP,可以连接和操作数据库
- MySQL是跟PHP配套使用的最流行的开源数据库系统
- MySQL是非常快速,可靠,且易于使用的
MySQLi介绍
- MySQLi extension(“ i “ 意为improved)MySQL扩展
- MySQLi 只针对MySQL数据库
- MySQLi是面向对象的,但也提供了API 接口
- MySQLi支持预处理语句
MySQLi使用
创建mysqli连接对象
1 |
|
使用query()方法插入数据
1 | $sql = "insert into user(name,pwd) values('admin','123456')"; |
使用query()方法更新数据
1 | $sql = "update user set pwd='456789' where name = 'admin'"; |
使用query()方法删除数据
1 | $sql = "delete from user where id = 1"; |
使用query()方法查询数据
1 | $sql = "select id,name,pwd from user"; |
关闭数据库
1 | $conn->close(); |
总结
- 使用query()函数执行增删改操作返回bool值,表示执行是否成功
- 使用query()函数执行查询操作返回结果集,从结果集中获取数据
MySQLi的预处理
为什么要使用预处理?
- 预处理语句用于执行多个相同的SQL语句,并且执行效率更高
- 预处理语句对于防止MySQL注入是非常有用的
预处理的使用
1 | // 预处理及绑定 |
代码解析
1 | "insert into user (name,pwd) values (?,?)" |
在 SQL 语句中,我们使用了问号(?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。
1 | $stmt -> bind_param("ss",$username,$userpwd); |
- 该函数绑定了SQL的参数,且告诉数据库参数的值
参数有以下四种类型:
- i - integer(整形)
- d - double(双精度浮点型)
- s - string(字符串)
- b - BLOG(binary large object:二进制大对象)
每个参数都需要指定类型
- 通过告诉数据库参数的数据类型,可以降低SQL注入的风险
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Nicopilot!