目录
mysql_connect()、mysqli_query()、mysqli_real_escape_string
mysqli_num_rows(result)、mysqli_fetch_assoc()
传送门 -》PHP学习笔记
mysql_connect()、mysqli_query()、mysqli_real_escape_string
mysqli_real_escape_string():会对输入的特殊字符进行转义,如单引号双引号等,比如输入admin',经过这个函数转义就会变成admin\',将单引号转义了,就避免了sql注入
<?php
$con=mysqli_connect("localhost","root","123456","RUNOOB"); //打开一个到mysql服务器的新的连接
if (mysqli_connect_errno($con)) //返回最近调用函数的最后一个错误代码
{
echo "连接 MySQL 失败: " . mysqli_connect_error();
}
// 修改数据库连接字符集为 utf8,这样的操作在针对中文字符非常有用,很多数据库查询乱码的情况都是字符集的问题。
mysqli_set_charset($con,"utf8");
$query="select username,email from member where id=$id";
mysqli_query($con,$query); //执行某个针对数据库的查
$newname="您好";
// 转义特殊字符
$newpers=mysqli_real_escape_string($con,$newname);
// 转义后插入,执行成功
mysqli_query($con,"INSERT into websites2 (name) VALUES ('$newpers')");
?>
is_string(var)
检测变量var是否是字符串,是则返回 true
,否则返回 false
mysqli_num_rows(result)、mysqli_fetch_assoc()
- mysqli_num_rows():返回结果集中行的数量,result规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识符
- mysqli_fetch_assoc() :函数从结果集中取得一行作为关联数组。假如从数据库表中取出一个用户的用户名和密码,表中的字段为username和password,其中一行数据为test,123456。用assoc来取得结果集中的 一行 是array([username]=>'test',[password]=>'123456'),也就是结果的数组中的索引是 所查数据库表的字段名,驻数组中的值为我们要查询的值。
<?php
// 假定数据库用户名:root,密码:123456,数据库:RUNOOB
$con=mysqli_connect("localhost","root","123456","RUNOOB");
//判断是否连接错误
if (mysqli_connect_errno($con))
{
echo "连接 MySQL 失败: " . mysqli_connect_error();
}
//定义sql语句
$sql = "SELECT name,url FROM websites ORDER BY alexa;";
//如果查询到结果
if ($result=mysqli_query($con,$sql))
{
// 返回查询的结果记录数
$rowcount=mysqli_num_rows($result);
printf("总共返回 %d 行数据。",$rowcount);
$row=mysqli_fetch_assoc($result); //以数组的方法取出一行数据
printf ("%s (%s)\n",$row["name"],$row["url"]);
// 释放结果集
mysqli_free_result($result);
}
mysqli_close($con);
再通过一个例子来理解mysql_fetch_assoc()。如下连接数据库,再执行查询所有表的操作,通过mysql_fetch_assoc()函数以数组的方式返回所有的查询结果
<?php
$con = mysql_connect( '127.0.0.1', 'root', 'root' );
if ( !$con ) {
die( '数据库链接出错,请检查账号密码及地址是否正确: ' . mysql_error() );
}
else{
echo '数据库连接成功'.'<br/>';
}
$result = mysql_query('show databases;') or die ( mysql_error() );;
While($row = mysql_fetch_assoc($result)){
print_r($row);
}
?>
mysqli_fetch_array()
从结果集中取得一行作为数字数组或关联数组:
<?php
// 1.连接数据库
$con=mysqli_connect("127.0.0.1","root","root","mycms");
if (mysqli_connect_errno($con))
{
echo "连接 MySQL 失败: " . mysqli_connect_error();
}
$sql="select * from sc_config where ID=1";
$result=mysqli_query($con,$sql);
print_r($result);
//将全部结果以数组的形式输出
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);
print_r("<pre>"); //格式化输出
print_r($row);
?>
浏览器输出结果如下
在数据库中执行这条sql语句的结果如下 :"select * from sc_config where ID=1"
即mysqli_fetch_array()就是将结果以数组的形式全部进行输出
unset()
php使用unset()删除数组中某个单元(键)的方法
1 2 3 4 5 6 |
|
输出结果如下:
1 2 3 4 5 6 7 |
|
还有个用法
<?php
$con = mysql_connect( '127.0.0.1', 'root', 'root' );
if ( !$con ) {
die( '数据库链接出错,请检查账号密码及地址是否正确: ' . mysql_error() );
}
else{
echo '数据库连接成功'.'<br/>';
}
$result = mysql_query('show databases;') or die ( mysql_error() );;
//print_r($result);
While($row = mysql_fetch_assoc($result)){
$data[] = $row['Database'];
print_r($data); //这里输出的数组信息很乱,重复数据多
}
echo "<br/>"."<br/>"."<br/>";
unset($result, $row); //去除重复
print_r($data);
?>
setcookie()
setcookie() 函数向客户端发送一个 HTTP cookie。cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。
setcookie(name,value,expire)
name | 必需。规定 cookie 的名称。 |
value | 必需。规定 cookie 的值。 |
expire | 可选。规定 cookie 的有效期 |
<?php
$value = "my cookie value";
// 发送一个 24 小时候过期的 cookie
setcookie("TestCookie",$value, time()+3600*24);
?>
php_uname
php_uname(string) — 返回运行 PHP 的系统的有关信息。string的内容如下
'a'
:此为默认。包含序列"s n r v m"
里的所有模式。's'
:操作系统名称。例如:FreeBSD
。'n'
:主机名。例如:localhost.example.com
。'r'
:版本名称,例如:5.1.2-RELEASE
。'v'
:版本信息。操作系统之间有很大的不同。'm'
:机器类型。例如:i386
。
<?php
header("Content-type:text/html;charset=utf-8");
echo '操作系统描述:'.php_uname().'<br>';
echo '操作系统名称:'.php_uname('s').'<br>';
echo '主机名:'.php_uname('n').'<br>';
echo '版本名称:'.php_uname('r').'<br>';
echo '版本信息:'.php_uname('v').'<br>';
echo '机器类型:'.php_uname('m').'<br>';
echo '当前操作系统:'.PHP_OS; //输出当前操作系统
echo "<br>";
echo stristr(php_uname('s'), 'windows').'<br>'; //查找 "windows" 在其中是否存在,如果是,返回该字符串及后面剩余部分(不区分大小写)
?>
ini_get()
ini.get(string):用来获取php.pin配置环境中变量的值。如果选型的值为布尔型如on、off、true、false之类的则返回0或者1,否则返回值本身
<?php
echo ini_get('default_socket_timeout').'<br>';
echo ini_get('allow_url_include').'<br>'; //返回0
echo ini_get('allow_url_fopen').'<br>';
?>
输出如下
trim()
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
trim(string,charlist)
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
charlist | 可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符:
|
1. 移除字符两边空格
<?php
$str = " Hello World! ";
echo $str . "<br>";
echo trim($str);
?>
注:不能移除单引号双引号这些,即这个不能防止注入
代码审计中的常见函数
addslashes()
addslashes() 函数能够在预定义的字符前添加反斜杠进行转义。在sql中用的比较多,防止sql注入
预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
<?php
$a = "who's you";
echo addslashes($a); #输出who\'s you,自动对字符串中的单引号进行了转义
?>
stripslashes()
stripslashes() 函数,删除由 addslashes() 函数添加的反斜杠。
<?php
$a = "who's you";
$b = addslashes($a); #输出who\'s you,自动对字符串中的单引号进行了转义
echo $b.'<br/>';
echo stripslashes($b); #删除添加的反斜杠
?>
是不是有点负负得正的感觉
get_magic_quotes_gpc()
get_magic_quotes_gpc函数能够取得 PHP 环境变数 magic_quotes_gpc 的值,返回 0 表示关闭本功能;返回 1 表示本功能打开。那么magic_quotes_gpc是干嘛用的了?默认情况下,PHP 指令 magic_quotes_gpc 为 on,它会对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()即自动进行转义。在php5.4及更高版本中,这个函数被去掉了,也即是php解析器不会自动为POST、GET、COOKIE过来的数据增加转义字符"\",而是把安全编码交给了用户自己,从而避免了magic_quotes_gpc未设置,用户依赖这个设置而带来了安全隐患。
所以在高版本的php.ini配置文件中是找不到get_magic_quotes_gpc()该函数的。
不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。
总结如下:
1. 对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行
htmlspecialchars()
htmlspecialchars() 函数把预定义的字符 "<" 、">" 、"&" 转换为 HTML 实体。这样可以防止xss攻击
<?php
$a = "<script>alert(/1/)</script>";
#echo $a #输出这条肯定会弹窗的
echo htmlspecialchars($a); #这里进行了转义处理,不会弹窗
?>
看下源码,<>被转换成了HTML实体,所以不能执行xss。
array_map
array_map - 将回调函数作用到数组中的每一个元素上。那什么是回调函数了?
- 我们调用php系统提供的函数叫直接调用,也叫: 直调
- php系统调用用户自定义的函数,必须要通过一个代理函数来调用,叫间接调用,也叫回调
<?php
function add2($value) { #定义函数
return $value + 2;
}
$arr = array(1, 2, 3, 4, 5); #定义数组
$result = array_map(add2, $arr); #传入函数和数组
echo '<pre>';
var_dump($result);
?>
str_replace
搜索字符中的某些字符进行替换。该函数区分大小写,可双写绕过
<?php
$name = str_replace( 'xss', '', 'asfxss' );
echo $name."</br>"; //输出asf
$name = str_replace( 'xss', '', 'asfXSS' );
echo $name."</br>"; //输出asfXSS
$name = str_replace( 'xss', '', 'asxssf' );
echo $name."</br>"; //输出asf
$name = str_replace( 'xss', '', 'asfxsxsss' );
echo $name."</br>"; //输出asfxss
$name = str_replace( 'xss', '', 'asfxsXSSs' );
echo $name."</br>"; //输出asfxsXSSs
$name = str_replace( '<script>', '', '</script>' );
echo $name."</br>"; //输出</script>
?>
strip_tags()
strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。
strip_tags(string,allow)
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
allow | 可选。规定允许的标签。这些标签不会被删除。 |
如下在字符中除了有 Hello World!外还有很多标签<><script><li>经过这个函数处理后就会把这些标签移除
<?php
//不规定允许的标签
echo strip_tags("<><script><span>Hello<li> <b>world!</b>"); //输出Hello world!
echo "</br>";
//规定允许的标签
echo strip_tags("Hello<script><b><i>world!</i></b>","<script>");
?>
stripos()
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
stripos(string,find,start)
参数 | 描述 |
---|---|
string | 必需。规定要搜索的字符串。 |
find | 必需。规定要查找的字符。 |
start | 可选。规定开始搜索的位置。 |
<?php
$result = stripos("https://www.baidu.com", "baidu");
echo $result."</br>"; //输出12
$result2 = stripos("https://www.baidu.com", "aaidu");
echo $result2; //查找不到什么都不输出
$result3 = stripos("https://www.baidu.com", "baidd");
echo $result3; //查找不到什么都不输出
?>
strrpos()
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)。
注释:strrpos() 函数是区分大小写的。
相关函数:
- strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写)
- stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
- strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
<?php
echo strrpos("shell.php. .","ph"); #输出6
echo "<br/>";
echo strrpos("shell.php. .","."); #输出11
?>
substr()
substr() 函数返回字符串的一部分。
<?php
#从字符串中的索引1位置开始截取直到最后
echo substr("hello world", 1) #输出 ello world
?>
如下语句的意思为,返回文件的后缀名
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
即
<?php
echo strrpos("shell.php",".")+1; #输出6
echo substr("shell.php", strrpos("shell.php",".")+1); #输出php
?>
intval()
intval() 函数用于获取变量的整数值。成功时返回 var 的 integer 值,失败时返回 0。
<?php
echo intval(1.24); //输出 1
echo "<br/>";
echo intval("你好"); //输出 0
echo "<br/>";
echo intval("2 你好"); //输出2
echo "<br/>";
echo intval("200 你好"); //输出200
echo "<br/>";
echo intval("你好200"); //输出0
?>
strrchr()
strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
<?php
echo strrchr("date.php.php",'.p');
?>