代码审计 PHP代码理解.

PHP语言的概括

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


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


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


目录:

        PHP代码理解:

(1)基本PHP程序.

(2)变量.

(3)输出 HTML 代码.

(4)isset()函数.

(5)注释.

(6)接收表单数据.

(7)HTML页面的传递代码.

(8)if 判断语句.

(9)for 循环语句.

(10)while循环语句.

(11)PHP 操作数据库的一些步骤.

(12)用户身份验证.

(13)PHP常见的代码 分析.

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

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

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


PHP 能做什么?

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

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

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

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

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

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

(7)PHP 能加密数据等.


PHP代码理解:

(1)基本PHP程序.

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

效果图:


(2)变量.

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

效果图.


(3)输出 HTML 代码.

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

效果图.


(4)isset()函数.

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

效果图.


(5)注释.

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

(6)接收表单数据.

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

?>

效果图.


(7)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>

(8)if 判断语句.

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

效果图.


(9)for 循环语句.

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

效果图.


(10)while循环语句.

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

效果图.


(11)PHP 操作数据库的一些步骤.

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

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

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


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

(12)用户身份验证.

$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);                                 #释放连接资源(就是断开连接)

(13)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是什么

  • 34
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

半个西瓜.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值