Web安全前后端基础 – 作者:无名草talent

后端基础PHP—表单验证

1.什么是表单

表单在网页中主要负责数据采集功能。

一个表单有三个基本组成部分

表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。

表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。

表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。

使用场景:

登录框 搜索框 留言框 上传框……(各种框)

1624438454_60d2f6b6405b378f2606d.png!small?1624438452911 1624438465_60d2f6c12dae5263df296.png!small?1624438463812

2.如何创建一个表单

表单标签: <form action= “URL” method=”GET/POST” >

表单域:即表单组件,主要有 文本框、密码框、隐藏域、复选框、单选框、文件上传框 多行文本框(文本域) 下拉选择框 ……

表单按钮: 提交按钮 复位按钮 一般按钮

1624440999_60d300a7cb283470d0119.png!small?1624440998893

1624441055_60d300dfa6f3e4754ea6a.png!small?1624441056111

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) (执行数据库获得的结果集)

1624450284_60d324ec5bc6aa512727d.png!small?1624450283323

数据库基础结构:

库 表 字段 数据=> 库就是仓库 表就如同xls表,字段就是表头,数据就是内容

4.实战

描述:写一个登陆表单,并实现其注册 + 登录功能。

2、注册和登录功能都必须有

提示:         登录成功后需要给回显

1)  在Phpstudy的根目录(一般在Phpstudy的WWW目录)创建  login.php和register.php

1624528657_60d4571133038ff0d55ac.png!small?1624528656766

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)验证效果:

进入登录页面

输入正确的账号密码:

1624529846_60d45bb63da0302387c4e.png!small?1624529845333
输入错误的账号密码: 1624529943_60d45c17734543437f575.png!small?1624529942612
输入空的账号或密码: 1624530250_60d45d4a6a7de3ac4faa5.png!small?1624530249488

进入注册界面

注册非空且账号不为wlb

账号和密码:

1624531757_60d4632d620bf53af1639.png!small?1624531756343
注册的数据成功进入数据库 1624544316_60d4943cb360b417bbd2b.png!small?1624544316102
若注册空的账号或密码 1624544596_60d495544ee6d317aa949.png!small?1624544595651
若注册相同的用户名 1624544731_60d495dbdd6c44ea96595.png!small?1624544731388

用新的账号密码登录

1624545148_60d4977c5062aaec45202.png!small?1624545147472 1624545156_60d497844c41a348ba64a.png!small?1624545155462

PHP后端基础—正则表达式

1.初识别SQL注入

登录代码后端的php代码

1624598320_60d56730f08e6ffb24be5.png!small?1624598321664发现在登录密码框里面写 ‘or 1=1#     也能登录成功

什么是注入:

注入攻击的本质,是把用户输入的数据当做代码执行

两个关键条件:

第一个 是用户能够控制输入

第二个 是原本程序要执行的代码,拼接了用户输入的数据然后进行执行

SQL注入:

户输入的数据当做SQL语句的代码执行

常见的防护软件主流核心:

通过正则来过滤传参

2.什么是正则表达式?

正则表达式(英语:Regular Expression,常简写为regexregexpRE),又称正则表示式正则表示法规则表达式常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本

正则表达式的特点

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论