后端基础PHP—表单验证
1.什么是表单
表单在网页中主要负责数据采集功能。
一个表单有三个基本组成部分:
表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
使用场景:
登录框 搜索框 留言框 上传框……(各种框)
2.如何创建一个表单
表单标签: <form action= “URL” method=”GET/POST” >
表单域:即表单组件,主要有 文本框、密码框、隐藏域、复选框、单选框、文件上传框 多行文本框(文本域) 下拉选择框 ……
表单按钮: 提交按钮 复位按钮 一般按钮
3.PHP和数据库交互
PHP如何实现人机交互,用户如何才能把自己写的东西给PHP PHP如何接收?
提交使用的就是表单
接收分为三种
$_GET //接收GET传参
$_POST//接收POST传参
$_REQUEST//接收POST 和 GET传参
数组如何命名$cars=array(“Volvo”,”BMW”,”Toyota”);
表单实际上做到的是将数据提交到后端脚本,然后后端脚本接受后进行处理。
我们这里说的是PHP和mysql数据库交互:
我们会用到一个PHP的扩展mysqli (不用担心,这是自带的插件,我们可以理解为是一套函数就行了) 连接数据库:mysqli_connect(‘127.0.0.1′,’root’,’root’,’3_9′) (连接地址,连接账户,连接密码,连接数据库)
执行数据库语句:mysqli_query($conn,$sql) (数据库连接函数,执行的SQL语句)
通过数据库查询语句执行后得到的数据是一个对象,
我们需要将对象转化为数组
从结果集取所有对象变为数组 mysqli_fetch_array($result) (执行数据库获得的结果集)
数据库基础结构:
库 表 字段 数据=> 库就是仓库 表就如同xls表,字段就是表头,数据就是内容
4.实战
描述:写一个登陆表单,并实现其注册 + 登录功能。
2、注册和登录功能都必须有
提示: 登录成功后需要给回显
1) 在Phpstudy的根目录(一般在Phpstudy的WWW目录)创建 login.php和register.php
2) 创建自己的库,表,字段,数据。可以用MySQL-Front
3) 代码
login.php:
<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>登录网页</title> <style> </style> </head> <h1>欢迎来到登陆界面! </h1> <body> <form name="login" action="login.php" method="post"> 用户名:<p><input type=text name="name"></p> 密码:<p><input type=password name="password"></p> <input type="submit" name="submit" value="登录" > <p>还没有账号?请去<a href="./register.php">注册账号</a></p> </form> </body> </html> <?php @$a = $_POST['name'];//'@'清除报错信息 @$b = $_POST['password']; //获取表单数据 $c = mysqli_connect('127.0.0.1','root','root','txtx'); //链接数据库 $s ="select*from wlb where username='$a' and password='$b'"; //查询数据库记录 $result = mysqli_query($c,$s); //执行函数 $d = mysqli_fetch_array($result); //从结果集中取得一行作为关联数组 if (empty($_POST['name']) || empty($_POST['password'])) { die('用户名或密码为空'); } //判断数据是否为空数据 if ($a == $d['username'] and $b == $d['password']) //比对数据库数据并判断 { echo $a.',欢迎回来 '; exit; } else{ echo"登录失败,用户名不存在或密码错误"; } ?>
register.php:
<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>用户注册页面</title> <style> </style> </head> <body> <h1>注册页面</h1> <form action="register.php" method="post"> <p>用户名:<input type="text" name="name"></p> <p>密 码: <input type="password" name="password" ></p> <input type="submit" name="submit" value="注册" > <p>已有账号?请前往<a href="./login.php">登录</a></p> </form> </body> </html> <?php
@$name=$_POST['name'];
@$password=$_POST['password']; //获取表单数据
$conn = mysqli_connect('127.0.0.1','root','root','txtx'); //链接数据库
$sql="select *from wlb where username='$name'";
$result = mysqli_query($conn,$sql); //执行函数
$fetch = mysqli_fetch_array($result);
if (!isset($_POST['name']) || !isset($_POST['password'])) {
die('缺少用户名密码');
}
if (empty($_POST['name']) || empty($_POST['password'])) {
die('用户名或密码为空');
}
//判断数据是否为空数据
if($fetch['username']==$name)
{
die('该用户已注册');
}
else{
$insert="insert into wlb(username,password) values('$name','$password')";
//往数据库插入表单数据
mysqli_query($conn,$insert);
echo "注册成功";
}
?>
4)验证效果:
进入登录页面
输入正确的账号密码: |
输入错误的账号密码: |
输入空的账号或密码: |
进入注册界面
注册非空且账号不为wlb的 账号和密码: |
注册的数据成功进入数据库 |
若注册空的账号或密码 |
若注册相同的用户名 |
用新的账号密码登录
PHP后端基础—正则表达式
1.初识别SQL注入
登录代码后端的php代码
发现在登录密码框里面写 ‘or 1=1# 也能登录成功
什么是注入:
注入攻击的本质,是把用户输入的数据当做代码执行。
两个关键条件:
第一个 是用户能够控制输入
第二个 是原本程序要执行的代码,拼接了用户输入的数据然后进行执行
SQL注入:
户输入的数据当做SQL语句的代码执行
常见的防护软件主流核心:
通过正则来过滤传参
2.什么是正则表达式?
正则表达式(英语:Regular Expression,常简写为regex、regexp或RE),又称正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
正则表达式的特点:
1. 灵活性、逻辑性和功能性非常强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
正则表达式用途:
判断字符串是否符合某一规则(判断是否符合手机号、邮箱规则)。
从一个字符串中找出符合规则的所有子字符串(取HTML标签名)。
3.PHP中的正则表达式:
注:HP中使用正则规则一定要加代表正则的标识/ /
preg_match_all(正则表达式、匹配字符串、匹配到的东西放入数组)
返回匹配到的次数
preg_replace (正则表达式、替换成什么、匹配字符串)
返回替换后的结果
替换支持数组格式
4.正则表达式的语法
字符:
常用转义字符:
数字:\d 非数字:\D
空白字符(空格、制表符、换页符等):\s 非空白字符:\S
单词字符(26个英文字母+数字+下划线_):\w 非单词字符:\W
自定义字符结合
字符集合:[单个字符或字符区间],用于匹配集合内字符.
如:
[a-z]表示a-z这26个小写字母
[0-9a-z]表示0-9这10个数字和a-z26个小写字母
[135a-h]表示包含数字1,3,5和字母a-h这8个字母
注意:两个不同字符段间请勿使用,隔开。
非集:[^单个字符或字符区间],用于匹配非集合内字符。
如:
[^0-9]表示匹配所有非数字字符。
[^a-zA-Z]表示匹配所以非字母字符。
关键字:
() => 和数学一样很像,代表这是一个整体。
^ => 匹配输入字符串的开始位置
$ => 匹配输入字符串的结尾位置
. => 通配符[代表任意字符][不匹配换行]
* => 匹配0次或者多次
+ => 匹配1次或者多次
\ => 转义字符
| => 两项之间的一个选择。
限定符加修饰符:
限定符:
{n} => 例如: 0{8} 意思是指 只有连起来8个0才会被匹配
{n,} =>例如: 0{2,} 意思是 只要有2个0及其以上的就会被匹配
{n,m} => 例如: 0{2,4} 意思是最少匹配2个0,最多匹配4个0
注:被匹配时,默认匹配最多的次数
修饰符:
/i => 不区分大小写
/A => 匹配规则必须从头开始匹配
/s => .将匹配一切字符
/x => 正则表达式中的空白字符会被忽略
5.实战正则
代码段:
<?php $key='flag{********************************}'; $Regular= preg_match("/zkaq.*key.{2,9}:\/.*\/(key*key)/i", trim($_GET["id"]), $match); if( $Regular ){ die('key: '.$key); }
解题思路:
代码中当 if 语句中的 $Regular 为真时,结束运行并输出字符key:和变量key,从而得到flag
preg_match()函数:按正则表达式去匹配字符串,匹配到一次就停止并返回1,没有匹配到则返回0;
trim()函数,去除字符串两端空白符;
正则解析:
1. | zkaq ==>zkaq |
2. | .* ==>除换行符外匹配任意字符0次或多次(可选0次 直接忽略) |
3. | key ==>key |
4. | .{2,9} ==>除换行符外匹配任意字符最少2次最多9次(可选字符2和1) |
5. | : ==>: |
6. | \/ ==>转义斜杠(/) |
7. | ( ) ==>代表一个整体 |
8. | key* ==>ke y*匹配0次或多次 |
9. | /i ==>不区分大小写 |
10. | 最后结果 ==>zkaqkey21://kekey |
将结果GET传参赋值给参数id,得到FLAG。
分享一个掌控安全的0基础福利编程课程:
====》先有了基础才能后面才能学的更快哦。
链接:https://pan.baidu.com/s/1oVdSaSwWSoo0u0ASsNPhcA
提取码:TXTX
来源:freebuf.com 2021-06-25 15:02:44 by: 无名草talent
请登录后发表评论
注册