- 每日一句:php语法是渗透测试无可或缺的,尤其是是在web应用开发扮演者重要角色。
所有基于前端的验证都是不安全的,必须靠服务器验证。 - 本篇内容:php连接数据库
php表单验证
正则表达式
一、php连接数据库
1.获取传参
<?php
a = $_GET['id']; @a = GET['id'] 加@就是假如出错不回显(一句话木马较喜欢用)
echo $a."<br />";
b = $_post['username'];
echo $b."<br />"
c = $_COOKIE['user'];
echo c."<br />";
?>
2.使用数据库
<?php
连接数据库
方法一:
$conn = mysql_connect("127.0.0.1","root","passwword","db_name");
//函数 IP 账户 密码 指定数据库(可不指定)
方法二:
$conn = mysql_connect("127.0.0.1","root","passwword");
mysql_select_db($conn,"db_name");
$result = mysql_query($conn,"select * from a");
//执行查询语句,并存储在数据集中
$row = mysql_fetch_row($result);
//读取数据集中的内容(该函数)读取结果集中的第一个记录)
$row = mysq_fetch_all($result);
//读取结果集的全部数据
var_dump($row);
//输出结果
mysql_close($conn);
//关闭数据库连接
?>
示例:
<?php
$conn = mysql_connect("127.0.0.1","root","passwod","数据库名");
//连接数据库
$result = mysql_query($conn,"select * from python");
//将执行的结果返回保存到result中
while($row = mysqli_fetch_array($result)){
//循环遍历结果集,并输出
echo "因:".$row['前项'];
echo "果:".$row['后项'];
echo "<br />";}
//$a = mysqli_fetch_row($result);
//var_dump($a); //输出结果集a的内容
mysql_close($conn); //关闭数据库连接
?>
3.预防SQL注入:
过滤敏感信息(恶意代码)。strpos()、strtr()
strpos() //strpos() 函数返回字符串在另一个字符串中第一次出现的位置。
strtr() //函数转换字符串中特定的字符。
适用类型转换。避免提交异常数据导致报错。(int)$a
使用数据库操作中的预处理,将查询与数据分离[高级用法-PDQ]
4.补充:echo与var_dump的区别:
echo() ——函数输出一个或多个字符串。
echo()——函数实际不是一个函数,所以您不必对它使用括号。然而,如果您希望向 echo() 传递一个以上的参数,使用括号将会生成解析错误。
var_dump()——可以查看内部结构信息,数组类型,将结果放到数组中。输出展示展示代码内容,结构与类型。该函数作可以窥探所有内容的类型,以及内部信息。该函数是调试、打印、输出、展示类型函数(若是数组,则以数组的形式输出)
die(“xx”)——输出xx的内容,终结程序
二、php表单验证
1.什么是表单
标志是–>form标签
主要功能是采集数据
2.表单标签
- action 处理表单数据的地方,不写的话提交给本页面(可相对路径)
- methon 传参方式:GET(传得少,传得快)与 POST(传得多,传得慢)
- target =_blank 在新窗口中打开链接
- =_parent 在父窗体中打开链接
- =_self 在当前窗体打开链接,此为默认值
- =_top 在当前窗体打开链接,并替换当前的整个窗体(框架页)
例如:<a href="document.html" target="_blank">
请点击</a>
3.<input type = password,text>
可以显示密码,
4.一些简单函数的过滤(真正的一般不用这些函数,用正则表达式去过滤验证)。
这些函数直接百度,即出现详细用法
strlen() 判断字符串长度(但不包括结束字符null)
count() 判断数据元素个数
strpos(要查找的内容)
例如:查找"php"在字符串中第一次出现的位置
<?php
echo strpos("You love php,I love php tool!","php")
//strpos 对大小写敏感,输出9
echo stripos("You love php,I love php tool!","PHP")
//stripos 对大小写不敏感,输出9
?>
is_numeric() 如果是数字返回true,否则返回false
is_array() 数组返回true,否则false
is_null() 为空返回true,否则返回false
5.php与数据库的交互
<?php
@$uname=$_POST['username']; //“@”的作用是,假如出现错误,不回显给前端。防止内部数据泄露
@$passwd = $_POST['password'];
$conn = mysqli_connect('127.0.0.1','root','password','dbname');
$sql = "select*from admin where uname='$uname' and passwd='$passwd'";
$abc = mysqli_query($conn,$sql);
$xxx = mysqli_fetch_array($abc);
if($xxx['uname'] === $uname and $xxx['passwd'] === $passwd){
echo '登录成功';
}
else{echo '用户名或密码错误';}
?>
三、正则表达式
1.常用转义字符:
\d 数字
\D 非数字
\s 空白字符(空格、制表符、换页符等)
\S 非空白字符
\w 单词字符(26字母+数字+下划线_)
\W 非单词字符
\t 制表符
\r 回车符
\n 换行符
\ 转义
$ 匹配结尾
^ 匹配开始 //注意: /ab/ === /^ab$/
. 匹配换行符之外所有字符一次
* 匹配前一个字符,但是不限次数(0-n)
+ 匹配前一个字符(1-n次)
限定符:
{n} 例如:0{3}–>仅匹配3个0连起来的情况,如6000
{n,} 例如:0{2,}–>只要有2个0及其以上的就会被匹配
{n,m} 例如:0{2,4}–>最少匹配2个,最多4个,但是被匹配时,默认匹配最多的
例如10000 0000 00 --> 匹配到3次(不够的默认一次)
修饰符:
/i 匹配忽略大小写
例如:/‘abc’/i 可以匹配到ABC45
/A 匹配规则必须从头开始
例如:/‘abc’/A 可以匹配到abc45
/x 匹配表达式中的空
例如:/‘a bc’/x 可以匹配到abc45
补充:修饰符可以联合使用,如/正则规则/Aix
小写匹配什么,大写就是匹配小写之外的
[0-9a-z] 匹配0-9,a-z之间所有
[135a-h] 匹配1,3,5和a-h之间所有
[^0-9] 匹配除了0-9之外的东西
*注意:符号在不同的地方意义不同
补充:区间的话只能写单位,不能写多位[0-3]可以,[400-500]不可以
2.PHP正则表达式(规则表达式)
作用:判断字符串是否符合某一规则(比如:是否符合手机号、邮箱等)。
从一个字符串串找出符合规则的所有字符串(取HTML标签名)。
php中使用正则一定要加“//”,这是格式。
3.preg_match(正则表达式,匹配的字符串)
匹配字符串中的正则表达式,找到 返回1,未找到返回0
例如:
<?php
$a = 'a1';
$b = '/[0-9]/';
echo preg_match($b,$a) //b中是否有a中的字符串,有则返回1,否则返回0
?>
preg_replace(正则表达式,'替换内容,检验字符串)
例如:
<?php
$a = 'aabbcc136asd';
$b = '/[0-9]/';
$c = preg_replace($b,'love',$a);
echo $c;
?>
输入内容:aabbccloveloveloveasd
例2:以数组的形式输出
<?php
$a = array('abc','aabc','ccabc');
var_dump(preg_replace('/abc/','love',$a));
?>
输出结果:array(3) {
[0]=>
string(4) "love"
[1]=>
string(5) "alove"
[2]=>
string(6) "cclove"
}
请自行验证,实践出真知
防范SQL注入
<?php
$a = '1 union select 1,2';
$b = '/\W|and|or|union|order|0x/'; //0x过滤编码注入
$c = preg_replace($b,'',$a);
$d = 'select * from admin where id ='.$c;
echo $d;
?>
输出内容: select * from admin where id =1select12
四、总结
- SQL注入的本质:用户输入的数据被当做代码执行;
- 正则表达式可用在防御(即过滤上),可以有效防御SQL注入、XSS、HTML注入等;
- 存在拼接语句并没有过滤掉就有SQL注入(SQL注入本质);
- 表单的作用就是将数据提交到后端脚本,后端脚本对其进行处理
- 正常网站组成:动态脚本语言,中间件(Tomcat、JBOSS),数据库web容器