MENU

学安全需要至少掌握的php内容

• October 14, 2024 • Read: 287 • 默认分类,CTF

环境配置

建议使用 phpStudy 搭建本机的实验环境

基本目标:能看懂php代码

推荐:安装phpStudy, 并尝试编写和运行php程序

image-20240629224313881

基本的 PHP 语法

<?php
// 基本输出语句
echo "Hello World!<br>"; // echo是最常用的输出函数,速度快,简单直接。 不返回任何值。
print("<br>aaaaaaa"); // print()只允许输出一个字符串,返回值总为 1
?>

变量

<?php
$x=5;  
$y=6;
$z=$x+$y;
echo $z;
?>

数据类型

  • 字符串

将任何文本放在单引号和双引号中

  • 整型

整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。

var_dump() 函数返回变量的数据类型和值,例如var_dump("dadada");将输出string(6) "dadada"

  • 浮点型

浮点数是带小数部分的数字,或是指数形式。

  • 布尔型

布尔型可以是 TRUE 或 FALSE。

  • 数组

数组可以在一个变量中存储多个值。

$cars=array("Volvo","BMW","Toyota");
echo $cars[0];
  • 对象

在 PHP 中,对象必须声明。首先,你必须使用class关键字声明类对象。类是可以包含属性方法的结构。

<?php
class Car
{
    public $color = "green";
    public function what_color() {
        return $this->color;
    }
}
$herbie = new Car;
echo $herbie->what_color();
?> 

以上实例中PHP关键字this就是指向当前对象实例的指针,不指向任何其他对象或类。

分支语句

  • If...Else 语句
if (条件)
{
    if 条件成立时执行的代码;
}
elseif (条件)
{
    elseif 条件成立时执行的代码;
}
else
{
    条件不成立时执行的代码;
} 
  • Switch 语句
<?php
switch (n)
{
case label1:
    如果 n=label1,此处代码将执行;
    break;
case label2:
    如果 n=label2,此处代码将执行;
    break;
default:
    如果 n 既不等于 label1 也不等于 label2,此处代码将执行;
}
?>

循环语句

  • while 循环
while (条件)
{
    要执行的代码;
}
  • do...while 语句

首先执行一次代码块,然后在指定的条件成立时重复这个循环

do
{
    要执行的代码;
}
while (条件);
  • for 循环
for (初始值; 条件; 增量)
{
    要执行的代码;
}
  • foreach 循环

每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。

foreach ($array as $value)
{
    要执行代码;
}

函数

  • 创建 PHP 函数
<?php
function functionName($param)
{
    // 要执行的代码
}
?>

CTF必学

image-20240630101556937

if (isset($_GET['cmd'])) {
    // do sonething
}

mysql例子:

<?php
$link = mysqli_connect("localhost", "root", "root","test");
if(!$link){
    die("ERROR: Could not connect database.");
}
$sql = "SELECT * FROM users";
$ok = mysqli_query($link, $sql);

mysqli_close($link);
?> 
  • $_POST

$_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。

<html>
<body>

<form method="post" action="test.php">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php
$name = $_POST['fname'];
echo $name;
?>

</body>
</html>
  • $_GET

$_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。

$_GET 也可以收集URL中发送的数据。

1. 在web服务器的对应目录下创建get_test.php文件

<html>
<body>

<?php
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>

</body>
</html>

2. 用URL向get_test.php文件发送的数据。

在浏览器地址栏输入ip:port/learningPHP/your_dir/get_test.php?subject=PHP&web=runoob.com

得到输出:Study PHP at runoob.com

image-20240630105001172

几个高危函数:

  • eval($string)

    参数为一个字符串,该函数会将字符串当作php代码执行

  • system($string)

    参数为一个字符串,该函数会将字符串当作系统命令执行

  • ...

PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用

  • $GLOBALS

$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

<?php 
$x = 75; 
$y = 25;
 
function addition() 
{ 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
 
addition(); 
echo $z; // 100
?>
  • $_SERVER

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

元素/代码描述
$_SERVER['PHP_SELF']当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。__FILE__ 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.3.0 版本开始,如果 PHP 以命令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。
$_SERVER['GATEWAY_INTERFACE']服务器使用的 CGI 规范的版本;例如,"CGI/1.1"。
$_SERVER['SERVER_ADDR']当前运行脚本所在的服务器的 IP 地址。
$_SERVER['SERVER_NAME']当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com)
$_SERVER['SERVER_SOFTWARE']服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)
$_SERVER['SERVER_PROTOCOL']请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。
$_SERVER['REQUEST_METHOD']访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。
$_SERVER['REQUEST_TIME']请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
$_SERVER['QUERY_STRING']query string(查询字符串),如果有的话,通过它进行页面访问。
$_SERVER['HTTP_ACCEPT']当前请求头中 Accept: 项的内容,如果存在的话。
$_SERVER['HTTP_ACCEPT_CHARSET']当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8"。
$_SERVER['HTTP_HOST']当前请求头中 Host: 项的内容,如果存在的话。
$_SERVER['HTTP_REFERER']引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)
$_SERVER['HTTPS']如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
$_SERVER['REMOTE_ADDR']浏览当前页面的用户的 IP 地址。
$_SERVER['REMOTE_HOST']浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。
$_SERVER['REMOTE_PORT']用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER['SCRIPT_FILENAME']当前执行脚本的绝对路径。
$_SERVER['SERVER_ADMIN']该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:[email protected])
$_SERVER['SERVER_PORT']Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
$_SERVER['SERVER_SIGNATURE']包含了服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED']当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
$_SERVER['SCRIPT_NAME']包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。
$_SERVER['SCRIPT_URI']URI 用来指定要访问的页面。例如 "/index.html"。
  • $_REQUEST

PHP $_REQUEST 用于收集HTML表单提交的数据。

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php
$name = $_REQUEST['fname'];
echo $name;
?>

</body>
</html>

当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。 $_SERVER['PHP_SELF']说明指定的脚本文件为当前脚本文件。

想了解更多关于html中的表单知识,请点 这里

  • PHP特性:动态函数调用

这个特性允许通过变量的值来调用函数。具体来说,变量的值是一个字符串,这个字符串的内容是一个函数的名称,然后通过该变量来调用这个函数。

例如:

$a = "system";  // 将变量 $a 的值设为 "system"
$b = "ls";      // 将变量 $b 的值设为 "ls"
$a($b);         // 调用函数 system 并将 "ls" 作为参数传递,即执行system("ls");

这段代码实际上调用了 PHP 的 system 函数,并执行了 ls 命令,列出了当前目录的文件和文件夹。

这种特性在需要动态决定调用哪个函数时非常有用,但同时也需要谨慎使用,以避免潜在的安全问题,例如代码注入和不受控制的函数调用。

Archives QR Code Tip
QR Code for this page
Tipping QR Code