ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

代码审计 PHP代码理解.

2022-03-21 15:33:47  阅读:285  来源: 互联网

标签:审计 语句 函数 代码 mysql query PHP id


PHP 是可以创建动态交互性站点的强有力的服务器端的脚本语言。


PHP可以做很多东西,特别是web网站开发,也可以使用的非常广泛。能够快速,灵活,实用使得PHP语言可以更好的开发任何网站。


PHP 是一种 HTML 嵌入式的脚本语言。php文件以.php结尾。PHP语言的很多语法来自 C,Java 和 Perl,并具有几个 PHP 独有的特点。PHP语言的主要目标是让 Web 开发程序员可以快速的书写动态生成的网页。

      

PHP 能做什么?

1.PHP 能生成动态页面内容等.

2.PHP 能创建、打开、读取、写入、关闭服务器上的文件等.

3.PHP 能收集表单数据等.

4.PHP 能发送和接收 cookies等.

5.PHP 能添加、删除、修改您的数据库中的数据等.

6.PHP 能限制用户访问你的网站上的一些页面等.

7.PHP 能加密数据等.

        

PHP代码理解:

基本PHP程序:

<?php
	echo 'hrllo,world';			#echo是php的输出函数.
								#每行代码必须以分号;结尾	
?>

效果图:

        

变量:

<?php
	$a=2;							#变量以$符号,变量名称对大小写敏感.
	$b=3;							#可以直接通过赋值来指定变量类型.
	$c=$a+$b;						#双引号中变量会被解析执行.
	echo "$a+$b="."$c";		        #2+3=5(点号.用于连接字符串的)
?>

效果图:

          

输出HTML代码:

<?php								#在浏览器中查看到的源码
	$a=2;							#<h1>2+3=5</h1>
	$b=3;							#双引号中变量会被解析执行.
	$c=$a+$b;			
	echo "<h1>$a+$b="."$c</h1>";
?>

效果图:

        

isset()函数:

<?php
    $a=100;                     
    echo (isset($a));    #isset()函数是判断变量是否存在,存在返回值1,不存在返回值空.
?>

效果图:

       

注释:

//这是单行注释.
 
#这也是单行注释.
 
/*
这是多行注释块.
它横跨了.
多行.
*/

        

接收表单数据:

<?php                                                 #全局变量:
    $username=$_GET['username'];             #$_GET,接收通过get方式传递数据.
    $password=$_GET['password'];             #$_POST,接收通过post方式传递数据.
    echo "<p>用户名:"."$username</p>";      #$_REQUEST,接收通过get或post方式传递数据.
    echo "<p>密  码:"."$password</p>";

?>

效果图:

HTML页面的传递代码:

<html>
<head>
	<meta http-equiv=Content-Type content="text/html;charset=utf-8">
	<title>登录</title>
</head>

<body>
	<form action="bgxg.php" method="get">  <!--bgxg.php是接收表的文件名,get是接收表的传递方式.-->
		<p>用户名:<input type="text" name="username"></p>
		<p>密   码:<input type="text" name="password"></p>
		<p><input type="submit" value="确定"></p>
	</form>
</body>
</html>

        

if 判断语句:

<?php
    $username = $_REQUEST['username'];
    $password = $_REQUEST['password'];
    if($username == "admin" and $password == "123"){        #在进行判断时,等于要使用“==”,“=是” 专用于给变量赋值.
            echo "你好,$username";                          #and 之前的语句执行成功时,才会执行后面的语句.
    }else{
            echo "请输入正确的用户名";
    }
?>

效果图:

     

for 循环语句:

<?php
    $sum = 0;
    for ($i=1;$i<=10;$i++){
            $sum = $sum + +$i;
    }
    $i=$i-1;
    echo "1累加到$i"."的和是$sum";
?>

效果图:

         

while循环语句:

<?php
    $sum=0;
    $i=2;
    while ($i<=12){
            $sum=$sum+$i;
            $i++;
    }
    $i =$i-1;
    echo "2累加到$i"."的和是$sum";
?>

效果图:

        

PHP操作数据库的一些步骤:

mysql_connect("localhost","root","123");            #通过php连接上Mysql,localhost是IP地址.

mysql_select_db("test");                            #选择要操作的数据库,"test"是数据库的名字.

mysql_query("set names utf8")                       #设置客户端和连接字符集. 


#通过php进行增删改查
mysql_close($conn);                                 #释放连接资源(就是断开连接)

     

用户身份验证:

$username = $_GET['username'];
$password = $_GET['password'];

$conn = mysql_connect("127.0.0.1","root","123");     #通过php连接上Mysql,127.0.0.1是IP地址.

mysql_select_db("test");                           #选择要操作的数据库,"test"是数据库的名字.

mysql_query("set names utf8")                       #设置客户端和连接字符集. 

$sql = "select * from hack where username = '$username' and password = '$password'";
#在(hack)数据库里查询,查询的条件(where)为:username = '$username' and password = '$password'

$res = mysql_query($sql,$conn);        # mysql_query 这个函数的执行语句的.

if (mysql_num_rows($res) !=0) {        #if是判断,mysql_num_rows是行,就是统计($res)变量有几行.
        echo "登录成功";
}else{
        echo "登录失败";
}

mysql_close($conn);                                 #释放连接资源(就是断开连接)

        

PHP常见的代码 分析:

1. mysql_query( )函数的理解:

(1)mysql_query( )如果是执行查询之类的语句( select ),那么会返回一个资源标识符,也就是我们要查找的数据结果集.

(2)mysql_query( )如果是执行增删改之类的语句,返回的就是true或者false了.

if(isset($_GET['Submit']))            #isset函数是判断是否存在的(也就是:判断Submit变量是否存在.)

$id = $_GET['id'];                #获取id变量的值并赋值给变量$id.

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id";    #将select查询语句赋值给变量$getid

$result= mysql_query($getid) or die('<pre>'.mysql_error().'</pre>');    
#(1)mysql_query()函数执行mysql查询.
#(2)die()函数输出一条消息,并退出当前脚本.
#(3)mysql_error()函数返回上一个MySQL操作产生的文本错误信息.
#(4)or之前的语句执行不成功时,才会执行后面的语句.
#(5)and之前的语句执行成功时,才会执行后面的语句。

     

2. mysql_result( )函数是返回结果的一个字段的值.

$num = mysql_numrows(Sresult);            #返回结果集中行的数目.
$i = 0;
while ($i< $num) {                            #mysql_result函数是返回结果的一个字段的值.
    $first = mysql_result($result,Si,"first_name");    #返回结果集中first_name字段的值.
    $last = mysql_result($result,Si,"last_name");      #返回结果集中last_name字段的值.
    echo '<pre>';    #<pre> </pre>是html标签,意思是按原样输出不做更改。
    echo 'ID:'.$id.'<br>First name:'.$first.'<br>Surname:'.$last;    #主要是输出这个内容.
    echo '</pre>';                #<br/>是html语言里的换行符;
    $i++;
}

      

 3.mysql_real_escape_string( )函数对用户输入的参数进行了过滤:

$id = $_GET['id'];
$id = mysql_real_escape_string($id);    
#mysql_real_escape_string()函数对用户输入的id参数进行了过滤.

#可以将单引号【'】、双引号【"】、反斜杠【\】、空字符【null】等进行转义.

#转义是把指定的字符转换成无意义的符号,比如PHP解析器不会把经过转义的引号当成引号来看待.

#PHP中另一个功能类似的函数: addslashes()

  

4.stripslashes( )函数的作用是删除由addslashes()函数添加的反斜杠.

magic_quotes_gpc魔术引号.

(1)在PHP配置文件php.ini中存在magic_quotes_gpc选项,被称为魔术引号.,

(2)在high级别下,PHP的magic_quotes_gpc被自动设为on.

(3)开启之后,可以对所有的GET、POST和CQOKIE传值的数据自动运行addslashes()函数

$id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id);
#stripslashes( )函数的作用是删除由addslashes()函数添加的反斜杠,也就是去除addslashes()函数的转义。

     

5.is_numeric()函数是判断变量是否是数字或者数字字符串.

if (is_numeric(Sid)){
$getid = "SELECT first_name, last_name FROMusers WHERE user_id = "$id"";

#在执行查询之前,使用了if语句进行判断,判断的条件是is_numeric()函数。判断用户输入的数据是否是数字型,只要不是数字型就—概报错。
#and、or、 select等语句都无法执行。

     

如何从代码层面挖掘SQL注入漏洞.

漏洞挖掘主要可以从以下几个方面着手:

(1)代码中负责获取用户数据的变量:S_GET、S_POST、$_COOKIE、$_SERVER。

(2)代码中负责执行数据库查询操作的函数:mysql_query()。

(3)在代码中对这些变量和函数进行搜索跟踪,从而分析是否存在漏洞。

      

如何从代码层面防范SQL注入.

(1)对于数字型注入,可以使用if语句,并以is_nuynber()函数作为判断条件进行防御.

(2)对于字符型注入,对用于接收用户参数的变量,用mysql_real_esca pe_string( ),addslashes( )等函数进行过滤.

      

   

参考链接:PHP 教程 | 菜鸟教程

参考链接:什么是php?php是什么?_北海拾贝的博客-CSDN博客_php是什么

标签:审计,语句,函数,代码,mysql,query,PHP,id
来源: https://blog.csdn.net/weixin_54977781/article/details/123600895

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有