PHP教程

代码审计 PHP代码理解.

本文主要是介绍代码审计 PHP代码理解.,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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是什么

这篇关于代码审计 PHP代码理解.的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!