PHP中的常用函数

目录

mysql_connect()、mysqli_query()、mysqli_real_escape_string

is_string(var)

mysqli_num_rows(result)、mysqli_fetch_assoc() 

mysqli_fetch_array()

unset()

setcookie()

php_uname

ini_get()

trim()

代码审计中的常见函数

 addslashes()

stripslashes()

get_magic_quotes_gpc()

htmlspecialchars()

array_map

str_replace

strip_tags() 

stripos() 

strrpos()

substr()

intval()

strrchr()


传送门 -》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

<?php

$arr = array("朝阳区","海淀区","西城区","东城区","丰台区");

unset($arr[3]);   //删除第四个元素"东城区"

echo "<pre>";

print_r($arr);

?>

输出结果如下:

1

2

3

4

5

6

7

Array

(

  [0] => 朝阳区

  [1] => 海淀区

  [2] => 西城区

  [4] => 丰台区

)

还有个用法

<?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

可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符:

  • "\0" - NULL
  • "\t" - 制表符
  • "\n" - 换行
  • "\x0B" - 垂直制表符
  • "\r" - 回车
  • " " - 空格

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');
?>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ly4j

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值