PHP基础学习【针对渗透】
PHP基础教程PHP属于后端语言,后端的核心在于与数据库交互。常见的后端语言:ASP、ASPX、PHP、JSP什么是PHP?PHP(超文本预处理器)是一种通用开源脚本语言,是动态语言的一种,动态语言还包括ASP、ASPX、JSP。PHP语法吸收了C、java、Perl的特点,主要用于web开发领域。PHP可以将程序嵌入到前端代码(HTML、CSS、JS)执行。PHP支持几乎所有流行的数据库以及操作
文章目录
PHP基础教程
PHP
属于后端语言,后端的核心在于与数据库交互。
常见的后端语言:ASP
、ASPX
、PHP
、JSP
什么是PHP?
PHP
(超文本预处理器)是一种通用开源脚本语言,是动态语言的一种,动态语言还包括ASP、ASPX、JSP
。PHP
语法吸收了C、java、Perl
的特点,主要用于web
开发领域。PHP
可以将程序嵌入到前端代码(HTML、CSS、JS
)执行。PHP
支持几乎所有流行的数据库以及操作系统。
使用场景
网站需要动态操作的,如注册,登陆、查询。
网站需要生成静态文件确保安全的。
需要快速看见效果的项目。
部分游戏服务端(swoole
扩展)
……
基本语法
PHP
头部标记风格
1. <?php 这里写代码?> ##注意:问好和php一定要紧贴,不能带空格
2. <script language = "php">这里写代码</script>
3. <?
这里写代码 ##前提条件:需要在php.ini的文件中设置打开on,short_open_tag=on,设置后重启apache即可。
?>
- 语句使用分号结尾,不可遗漏。
<?php phpinfo(); ?>
- 数据类型:
String
(字符串)、Integer
(整型)、Float
(浮点型、小数点)、Boolean
(布尔型)、Array
(数组)、Object
(对象)、NULL
(空值或者把变量清空)。 PHP
的变量标识符$
,使用时不需要声明,直接使用$
变量名。
$a
:变量a
- 常量标识符
define
【定义后不会改变】
define(常量名,常量值)
<?php
define('a',99);
echo a;
?>
===========================
99
echo
后面双引号和单引号的区别:双引号会有解析的作用,而单引号会把单引号内的内容作为字符串直接输出。- 调用函数必须使用括号将参数包起来,如
md5("admin")
. PHP
输出拼接符.
<?php
echo 'a'.'b';
?>
=======================
ab
<?php
echo '121a' + '2b';
?>
=======================
123
PHP
注释符://、#、/**/
PHP
运算符:与C、JAVA
一样。
=表示赋值
== 比较数值大小
=== 比较类型且比较数值大小
- 变量拼接
$c .= $a ====> $c = $c.$a //拼接
<?php
function a($a) {
$b = $a+1;
return $b;
}
$a = 10000;
echo a(1);
?>
=========================
2
<?php
$a = 3;
echo '3'.'<br>'.$a;
?>
换行除了用html
中的<br>
,在window
平台:echo "\r\n"
;在unix\linux
平台相当于 echo "\n"
;在mac
平台中相当于"\r"
。
PHP函数
自定义函数
function 函数名() {
被执行的代码;
}
函数名能够以字母或下划线开头(而非数字),对大小写不敏感,应该能够反映函数所执行的任务。
<?php
a(); // 函数位置不影响,用到后面会自动检索
function a() {
echo 'aa'.'</br>'; //换行需要借助HTML代码
echo 'bb';
}
?>
==============================
<?php
echo jia(1,2);
function jia($a,$b) {
$c = 0; //可要可不要
$c = $a + $b;
return $c;
}
?>
函数类型
var_dump()
——检测数据类型,该函数中显示的字符串规定使用双引号
有一些变量无法输出怎么办?我们可以使用
var_dump()
去查看其数据类型
<?php
$a = '11';
var_dump($a);
?>
==========================
string(2) "11"
- 使用
html
语句修改文件编码【一定要写在php
代码外面】
<meta charset = 'utf-8'>
<meta charset = 'GBK'>
phpinfo()
—— 查看php
配置md5(' ')
——进行md5
加密strstr()
—— 查找字符串首次出现的长度
<?php
$a = strstr('25344@example.com','@');
var_dump($a);
?>
=============================
string(12) "@example.com"
6. strlen()
—— 检测字符串的长度
<?php
$a = '25344@example.com';
$b = strlen($a);
echo $b;
?>
===========================
17
7. .
为拼接符
<?php
$a = '25344@example.com';
$b = '64273@example.com';
echo $a.$b;
?>
====================
25344@example.com64273@example.com
8. die()
—— 输出一条消息,并退出当前脚本。
@$username = $_REQUEST['uname'];
@$password = $_REQUEST['pwd'];
if(isset($_REQUEST['uname']) and isset($_REQUEST['pwd'])) { //isset检验变量是否存在
$cnno = mysqli_connect('127.0.0.1','root','root','test'); //连接数据库
$sql = "select * from admin where username = '$username' and password = '$password'";
$safelogin = $username.$password;
if(strstr($safelogin,'or')) {
die('非法攻击');
}
9. ."<br>"
—— php
换行
<?php
$email = '25344@example.com';
$domain = strstr($email,'@');
echo $domain."<br>";
$user1 = strstr($email,'@',false);
echo $user1."<br>";
$user2 = strstr($email,'@',true);
echo $user2;
?>
========================
@example.com
@example.com
25344
条件分支语句
- 与
C、JAVA
相同(if语句、if...else..、switch
)
<?php
$a = 3;
if($a=1/'0abc') { ##均可输出1,原理即为只要不等于0或者null,则为true
echo 1;
}
?>
PHP获取表单[表单是HTML的重要组成部分]
下面严重区分大小写:
$_GET[ ]
数组获取get
方式提交的内容,接受get传参。
$_POST[ ]
数组获取post
方式提交的内容;
$_COOKIE[ ]
数组获取cookie
;
$_REQUEST[ ]
获取get | post | cookie
。
<?php
$a = $_GET[1]; ##其中,中括号表示数组的键,表示大柜子中的小柜子
echo $a;
?>
<?php
$a = 1;
echo $a;
?>
<meta charset = 'utf-8'/>
<form action = 'test.php' method = 'POST'>
<input type = 'text' name = 'id'/>
<input type = 'submit'/>
</form>
<?php
$b = 2;
echo $b.$a;
?>
- 利用表单提交
post
请求
<meta charset = 'utf-8'/>
<form action = 'test.php' method = 'POST'>
<input type = 'text' name = 'id'/>
<input type = 'submit'/>
</form>
<?php
$a = $_POST['id'];
echo $a;
?>
HEAD
传参一般不传数据,后续详细讲解。
PHP操作mysql
数据库 => 库、表、字段(列)、数据(记录、行)
desc
表名:查看表中的字段
连接数据库
$conn = mysqli_connect("127.0.0.1","root","root","db_name"); ##地址、账号、密码、数据库名称(可写可不写)
$conn = mysqli_connect("addr","usr","password");
选择数据库
mysqli_select_db($conn,"db_name"); ##conn可以替换成任何字母
执行sql语句
$result = mysqli_query($conn,"SQL语句");
遍历查询结果
$row = mysqli_fetch_row(); ##返回一行
$table = mysqli_fetch_all(); ##返回全部内容(一个表)
$row = mysqli_fetch_array($_result);
关闭数据库连接
mysqli_close($conn)
表单验证
什么是表单【form】?
表单在网页中主要负责数据采集功能。
一个表单有三个基本组成部分:
表单标签:这里面包含了处理表单数据所用动态脚本的URL
以及数据提交到服务器的方法。
表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的动态脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
<form action="https://www.baidu.com/" method="GET" target=_blank>
##表单标签【不写传参方式则默认为get,action不写默认提交到本地(可以写网页路径或者相对路径)】
<input name = "wd"/> //表单域【采集数据输入框】
<input type = "submit">
</form>
===============================
类似于get传参$_GET['wd']
使用场景
登录框
搜索框
留言框
上传框
……(各种框)
应用
表单验证的基本流程——在登陆页面提交信息,提交到后端数据库验证,然后返回信息到其他或原有页面
<meta charset = 'utf-8' />
<form><center>
用户登录<br>
账号:<input type = 'text' name = 'uname'>
<br>
密码:<input type = 'password' name = 'pwd'>
<br>
<input type = 'submit' value = '登录'>
</form></center>
<?php
@$username = $_REQUEST['uname'];
@$password = $_REQUEST['pwd'];
if(isset($_REQUEST['uname']) and isset($_REQUEST['pwd'])) { //isset检验变量是否存在
$cnno = mysqli_connect('127.0.0.1','root','root','test'); //连接数据库
$sql = "select * from admin where username = '$username' and password = '$password'";
echo $sql; //输出后台数据库执行的代码
$b = mysqli_query($cnno,$sql); //执行数据库语句
$c = mysqli_fetch_array($b); //取一行把对象变成数组
echo "你的密码是:".$c['password'];
if($username==$c['username']){
echo '登录成功';
}
else{
echo '账户密码错误';
}
}
?>
- 本代码中存在
sql
注入漏洞【用户输入的数据被当作SQL
代码执行】,其中的sql
注入语句为admin" or 1=1 -- qwe
或者admin" or "1"="1
。 - 防御方法:检测传参内容,然后进行拦截。
- 这条语句与后台数据库的交互
select *from admin where username="admin" and password =" "or 1=1 -- qwe "
//其中--空格 为注释,# 为mysql数据库特有的注释
select *from admin where username="admin" and password =" "or "1"="1 "
正则表达式【互通于各种语言】
初识sql注入
- 两个关键条件:第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据然后进行执行。
- 现在常见的防护软件主流核心就是通过正则来过滤传参。
- 防御手段:可以使用
die
函数。
什么是正则表达式
-
正则表达式,又称规则表达式。(英语:
Regular Expression
,在代码中常简写为regex
、regexp
或RE
),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 -
特点:
- 灵活性、逻辑性和功能性非常强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
- 对于刚接触的人来说,比较晦涩难懂。
- 用途:
- 判断字符串是否符合某一规则(判断是否符合手机号、邮箱规则)。
- 从一个字符串中找出符合规则的所有子字符串(取
HTML
标签名)。
PHP中的正则表达式
PHP中使用正则规则一定要加代表正则的标识/ /
-
preg_match_all
(正则表达式、匹配字符串)
返回匹配到的次数 -
preg_replace
(正则表达式、替换成什么、匹配字符串)
返回替换后的结果
<?php
$a = 12345678999999;
var_dump(preg_match_all('/9/',$a));
echo "<br>";
var_dump(preg_match('/9/',$a));
echo "<br>";
var_dump(preg_replace('/1/','gyy',$a));
?>
=============================
int(6)
int(1)
string(16) "gyy2345678999999"
常用转义字符
数字:
\d
非数字:\D
空白字符(空格、制表符、换页符等):\s
非空白字符:\S
单词字符(26个英文字母不区分大小写】+数字+下划线_):\w
非单词字符:\W
<?php
$a = '12aaaaaaa';
var_dump(preg_match_all('/\d/',$a)); //过滤非数字
echo "<br>";
var_dump(preg_match_all('/\D/',$a)); //过滤数字
?>
============
int(2)
int(7)
自定义字符结合
- 字符集合:[单个字符或字符区间],用于匹配集合内字符
[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次或者多次【即自身的0次也会算进去】
+
=> 匹配1次或者多次,只能连续
\
=> 转义字符
|
=> 两项之间的一个选择。
<?php
$a = '12ayy';
echo "<br>";
var_dump(preg_match_all('/y/',$a)); //运行结果int(2),匹配到两次y
echo "<br>";
var_dump(preg_match_all('/y*/',$a)); //运行结果int(1)
echo "<br>";
var_dump(preg_match_all('/y*/',$b));
echo "<br>";
var_dump(preg_match_all('/^y/',$a)); //匹配开头,运行结果int(0)
$b = '0-9';
echo "<br>";
var_dump(preg_match_all('/^0-9$/',$b)); //开头和结尾都匹配,运行结果int(1)
$c = '0';
echo "<br>";
var_dump(preg_replace('/^[0-9]$/','gyy',$c)); //区间写反会发生报错,运行结果过是int(1),区间均表示一个字符
?>
$d = 'gyy123nuc';
echo "<br>";
var_dump(preg_replace('/gyy.nuc/','gyy',$d)); //运行结果:string(9) "gyy123nuc"
+
的用法
<?php
$a = 'yya';
var_dump(preg_match_all('/y/',$a,$b1)); //int(2)
var_dump($b1); //array(1) { [0]=> array(2) { [0]=> string(1) "y" [1]=> string(1) "y" } }
"<br>";
var_dump(preg_match_all('/y+a/',$a,$b2)); //int(1)
var_dump($b2); //array(1) { [0]=> array(1) { [0]=> string(3) "yya" } }
"<br>";
$a1 = 'yyayyyy';
var_dump(preg_match_all('/y+/',$a1,$b3)); //int(6)
var_dump($b3);
//array(1) { [0]=> array(6) { [0]=> string(1) "y" [1]=> string(1) "y" [2]=> string(1) "y" [3]=> string(1) "y" [4]=> string(1) "y" [5]=> string(1) "y" } }
?>
*
的用法
<?php
$a = 'y';
var_dump(preg_match_all('/y*/',$a,$b1)); //int(2)
var_dump($b1); //array(1) { [0]=> array(2) { [0]=> string(1) "y" [1]=> string(0) "" } }
"<br>";
$a1 = 'abc';
var_dump(preg_match_all('/y*/',$a1,$b2)); //int(4)
var_dump($b2);
//array(1) { [0]=> array(4) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" } }
?>
$a2 = 'a1b11b';
var_dump(preg_match_all('/a.*b/',$a2,$b3)); //int(1)
var_dump($b3); //array(1) { [0]=> array(1) { [0]=> string(6) "a1b11b" } }
注意:.*
能匹配换行之外的一切,能匹配任意一切。如果想要ab
中间的一切,可以使用a.*b
来过滤;想要设置密码以zkeq
开头,则使用zkeq.*
来过滤。.*
容易出现一个异常的失控,正常情况下使用.+
。
限定符+修饰符
限定符:
{n}
=> 例如: 0{8}
意思是指 只有连起来8个0才会被匹配
{n,}
=>例如: 0{2,}
意思是 只要有2个0及其以上的就会被匹配
{n,m}
=> 例如: 0{2,4}
意思是最少匹配2个0,最多匹配4个0
注:被匹配时,默认匹配最多的次数
修饰符:
/i => 不区分大小写
/A => 匹配规则必须从头开始匹配
/s => .将匹配一切字符
/x => 正则表达式中的空白字符会被忽略
<?php
$a = 'A';
var_dump(preg_match_all('/a/i',$a)); //int(1)
"<br>";
?>
靶场练习
分析靶场代码,if
语句中如果变量regular
不为0时才能输出key
值也就是flag
。分析preg_match
函数中的代码,zkeq.*
说明get
传参传入的id
值需要用zkeq
开头,trim
函数删除字符两端的空白字符和预定义字符。{2,9}
说明key
后面至少2个字符,最多9个字符。\/.*\/
表示//
,其中\
表示转义,则最后id
的参数值为zkaqkeybb://keykey
,即可得到flag
。
更多推荐
所有评论(0)