前言

续之前的系列,这里php开发的文件操作的内容读取以及文本写入的部分

文件读取代码的实现

css代码

本系列的php博客都是这个css,名字都是index.css

/* css样式初始化 */
* {
font-family: 'Poppins', sans-serif;
margin: 0;
padding: 0;
box-sizing: border-box;
outline: none;
border: none;
text-decoration: none;
text-transform: capitalize;
transition: .2s linear;
} html {
font-size: 62.5%;
}
/* header样式初始化*/
.header {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
background: #3F3D56;
display: flex;
align-items: center;
justify-content: space-between;
} .header .logo {
color: white;
padding: 0 1rem;
}
/* 导航样式 */
.navbar ul{
display: flex;
} .navbar ul li{
font-weight: bold;
width: 128px;
list-style: none;
text-align:center;
}
.navbar ul li a {
width: 128px;
line-height: 45px;
font-size: 1.7rem;
color: white;
}
.navbar ul li a:hover{
color: #009933;
}
/* 二级菜单样式 */
.navbar ul li ul{
position: absolute;
display: none;
width: 128px;
line-height: 45px;
} .navbar ul li ul li{
background-color: #3F3D56;
}
/* 悬浮展开二级菜单 */
.navbar ul li ul li a:hover{
color: white;
}
.navbar ul li ul li:hover{
background-color: #009933;
} .navbar ul li:hover ul{
display: block;
}
/* 网站内容*/
.content{
margin-top:50px;
} /*让文件下载的文件列表居中显示*/
.download-links {
text-align: center; /* 使链接居中 */
font-family: 'LiSu', 'STLiti', cursive; /* 尝试使用隶书字体,如果不可用则退回到通用草书字体 */
font-style: italic; /* 设置字体为斜体 */
} .download-links ul {
list-style: none;
padding: 0;
margin: 0;
display: inline-block; /* 使 <ul> 内容居中对齐 */
} .download-links li {
margin: 10px; /* 添加一些间距 */
} .download-links a {
font-size: 18px; /* 可以根据需要调整大小 */
text-decoration: none;
color: #000;
} .download-links a:hover {
text-decoration: underline;
}

文件内容的读取

新建一个文件file_read.php

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Head</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<div class="header">
<a href="index.html" class="logo">
<h1>wushiyiwuzhong</h1>
</a>
<nav class="navbar">
<ul>
<li><a href="file_index.php">文件功能导航</a></li>
<li><a href="file_upload.php">文件上传</a></li>
<li><a href="file_downlaod.php">文件下载</a></li>
<li><a href="#">文件删除</a></li>
<li><a href="#">文件读取</a></li>
<li><a href="#">文件写入</a></li>
</ul>
</nav>
</div> <div class="download-links">
<ul>
<?php
$files = scandir('.');//扫描当前目录
$files = array_filter($files, function($file) {
return is_file($file);
}); foreach ($files as $file) {
// 创建下载链接,指向 download.php,并传递 filename 参数
echo '<li><a href="file_read.php?filename=' . urlencode($file) . '">' . htmlspecialchars($file) . '</a></li>';
}
?>
</ul>
</div>
</body>
</html> <?php
// 读取 filename 参数
$filename = isset($_GET['filename']) ? $_GET['filename'] : ''; $filePath = './' . $filename; // 检查文件是否存在且可读
if (file_exists($filePath) && is_readable($filePath)) {
$content = file_get_contents($filePath); // 读取文件内容
echo nl2br(htmlspecialchars($content)); // 将内容转换为适合在 HTML 中显示的格式
} else {
echo "无法读取文件";
}

下面是运行效果



随意读取一个文件进行测试



成功读取当前文件的文件内容,尝试读取其他文件

http://localhost:63342/wushiyiwuzhong.com/file_read.php?filename=../test.txt



成功读取

文件的写入

这里主要使用到的函数是$_SERVERfile_put_contents

知识补充
$_SERVER函数

$_SERVER 是一种超全局变量,在 PHP 中用于收集有关服务器和执行环境的信息。它包含了很多索引,每个索引都有关于服务器或者当前执行脚本的信息。这些信息是由 Web 服务器提供的,因此具体可用的信息取决于服务器软件本身。

以下是一些常用的 $_SERVER 数组索引及其含义:

  • $_SERVER['PHP_SELF']:当前执行脚本的文件名。
  • $_SERVER['GATEWAY_INTERFACE']:服务器使用的 CGI 规范的版本。
  • $_SERVER['SERVER_ADDR']:当前运行脚本所在服务器的 IP 地址。
  • $_SERVER['SERVER_NAME']:当前运行脚本所在服务器的主机名。
  • $_SERVER['SERVER_SOFTWARE']:服务器标识字符串,在响应请求时的头信息中给出。
  • $_SERVER['SERVER_PROTOCOL']:请求页面时通信协议的名称和版本。
  • $_SERVER['REQUEST_METHOD']:访问页面使用的请求方法,例如 "GET", "HEAD", "POST", "PUT"。
  • $_SERVER['REQUEST_TIME']:请求开始时的时间戳。从 PHP 5.1.0 开始可用。
  • $_SERVER['QUERY_STRING']:查询字符串,如果有的话,通过它进行页面访问。
  • $_SERVER['DOCUMENT_ROOT']:当前运行脚本所在的文档根目录,在服务器配置文件中定义。
  • $_SERVER['HTTP_ACCEPT']:当前请求的 Accept: 头信息内容。
  • $_SERVER['HTTP_ACCEPT_CHARSET']:当前请求的 Accept-Charset: 头信息内容(如果存在)。
  • $_SERVER['HTTP_HOST']:当前请求的 Host: 头信息内容。
  • $_SERVER['HTTP_REFERER']:引导用户代理到当前页的前一页的地址(如果存在)。
  • $_SERVER['HTTPS']:如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
  • $_SERVER['REMOTE_ADDR']:浏览当前页面的用户的 IP 地址。
  • $_SERVER['REMOTE_HOST']:浏览当前页面的用户的主机名。
  • $_SERVER['REMOTE_PORT']:用户机器上连接到 Web 服务器所使用的端口号。
  • $_SERVER['SCRIPT_FILENAME']:当前执行脚本的绝对路径名称。
  • $_SERVER['SERVER_ADMIN']:该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
  • $_SERVER['SERVER_PORT']:Web 服务器使用的端口。默认值为 "80"。
  • $_SERVER['SERVER_SIGNATURE']:包含了服务器版本和虚拟主机名的字符串。
  • $_SERVER['PATH_TRANSLATED']:当前脚本所在文件系统(不是文档根目录)的基本路径。
  • $_SERVER['SCRIPT_NAME']:包含当前脚本的路径。这在页面需要指向自己时非常有用。
  • $_SERVER['REQUEST_URI']:访问此页面所需的 URI。例如 "/index.html"。

注意:不是所有的服务器都会提供所有这些信息,有些服务器可能会省略一些信息或者提供额外的信息,并且某些值可能在命令行运行 PHP 时不可用。这取决于你的服务器配置和 PHP 的安装方式。

$_SERVER函数

file_put_contents() 是 PHP 中一个非常有用的函数,用于写入数据到文件。该函数是 fopen(),fwrite(),和 fclose() 函数的简单一次性替代。

这是基本语法:

file_put_contents($file, $data, $flags, $context);

参数解释:

  • $file:必需。规定要写入数据的文件。如果文件不存在,此函数将尝试创建该文件。如果文件路径或权限出现问题,或者磁盘空间不足,此函数将返回 false。
  • $data:必需。规定要写入文件的数据。可以是字符串,数组或数据流。
  • $flags:可选。规定如何处理文件。可能的值:
  • FILE_USE_INCLUDE_PATH:搜索 include_path(在 php.ini 中)。
  • FILE_APPEND:在文件末尾追加数据,而不是覆盖。
  • LOCK_EX:在写入时获取一个独占锁定。
  • $context:可选。可以修改流的行为。

    这个函数返回写入到文件中的字节数,如果失败则返回 false。注意,如果在 file_put_contents() 函数中使用了 FILE_APPEND 标记,返回的字节数可能包含了由于追加导致的初始文件大小。下面是一个使用的示例
<?php
$file = 'example.txt';
$data = 'Hello, World!';
file_put_contents($file, $data); // 写入数据到文件 $file = 'example.txt';
$data = 'Hello, again!';
file_put_contents($file, $data, FILE_APPEND); // 追加数据到文件

运行效果如下

使用file_put_contents函数时你需要确保有适当的文件权限来写入或修改文件,否则此函数会执行失败

下面我们来具体实现文件写入,这里模拟的是直接写入到一个php文件中,至于为什么不加一个用户自定义文件是因为懒想让大家更容易理解。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Head</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<div class="header">
<a href="index.html" class="logo">
<h1>wushiyiwuzhong</h1>
</a>
<nav class="navbar">
<ul>
<li><a href="file_index.php">文件功能导航</a></li>
<li><a href="file_upload.php">文件上传</a></li>
<li><a href="file_downlaod.php">文件下载</a></li>
<li><a href="#">文件删除</a></li>
<li><a href="file_read.php">文件读取</a></li>
<li><a href="file_write.php">文件写入</a></li>
</ul>
</nav>
</div>
<div>
<div class="content">
<form action="file_write.php" method="post" enctype="application/x-www-form-urlencoded">
<textarea name="fileContent" rows="4" cols="50" placeholder="请输入文件内容"></textarea><br>
<input type="submit" value="写入文件" name="submit">
</form>
</div> </div>
</div>
</body>
</html> <?php
// 检查是否有 POST 请求,并且 'fileContent' 字段是否已经设置
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit'])) {
// 定义要写入的文件名,可以是相对路径或绝对路径
$filePath = '1.php';//模拟写入文件可控的情况 // 从表单获取内容
$content = $_POST['fileContent']; // 尝试将内容写入文件
if (file_put_contents($filePath, $content) !== false) {
echo "文件写入成功!"."<br><hr>";
} else {
echo "文件写入失败,请检查文件路径及权限。";
}
}

运行效果如下



我们这里直接模拟攻击者写入木马从而控制服务器





访问我们写入的后门文件

成功访问我们的后门文件,如果是真实情况的话我们已经成功获取到了目标服务器的权限

总结

文件的读取、写入还是比较简单的

php开发之文件读取、写入的更多相关文章

  1. PostgreSql那点事(文件读取写入、命令执行的办法)

    • 2013/07/9 作者: admin PostgreSql那点事(文件读取写入.命令执行的办法) 今天无意发现了个PostgreSQL环境,线上学习了下,一般的数据注射(读写数据库)差异不大,不 ...

  2. python向config、ini文件读取写入

    config读取操作 cf = configparser.ConfigParser() # 实例化对象 cf.read(filename) # 读取文件 cf.sections() # 读取secti ...

  3. nio实现文件读取写入数据库或文件

    1.nio实现读取大文件,之后分批读取写入数据库 2.nio实现读取大文件,之后分批写入指定文件 package com.ally; import java.io.File; import java. ...

  4. html外部文件读取/写入

    1.文件的读取 外部文件读取控件: <input type="file" id="file_jquery" onchange="file_jqu ...

  5. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...

  6. Python txt文件读取写入字典的方法(json、eval)

    link:https://blog.csdn.net/li532331251/article/details/78203438 一.使用json转换方法 1.字典写入txt import json d ...

  7. JAVA 文件读取写入后 md5值不变的方法

    假如我们想把某文件读入 StringBuffer 并写入新文件,新文件md5值需要保持不变(写入新文件后保证和源文件一模一样), 我们就需要在操作 StringBuffer 时附加换行符: Strin ...

  8. python学习笔记6-输入输出与文件读取写入

    (1)打印到屏幕:print (2)读取键盘输入:input/raw_input #键盘输入 str = raw_input("Please enter:"); print (&q ...

  9. java 文件读取写入

    public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileB ...

  10. java 读取Zip文件进行写入

    直接读取ZIp文件读取写入到别的文件中. package jp.co.misumi.mdm.batch; import java.io.BufferedReader; import java.io.F ...

随机推荐

  1. zookeeper JavaApi 修改节点

    *修改数据 * 1.修改数据 * 2.根据版本修改 * * * */ @Test public void testSet() throws Exception{ Stat stat = new Sta ...

  2. git报错解决,warning: could not find UI helper 'git-credential-manager-ui'

    在克隆远程代码时,可能遇到这样的报错 warning: could not find UI helper 'git-credential-manager-ui' 这样的报错经常会在我们换了一台电脑或者 ...

  3. MinIO客户端之tree

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc tree 使用树的形式,输出桶内的目录和文件. ./mc tree --files local1/bkt1 ...

  4. Havoc C2d的初次使用

    Havoc C2 简介 Havoc是一款现代化的.可扩展的后渗透命令控制框架 当前的Havoc版本还处于早期开发版,随着框架的不断成熟,可能会对Havoc的API和核心结构进行大量更改 以下的配置部分 ...

  5. linux中iptables防火墙相关命令

    https://www.cnblogs.com/seven1979/p/4173927.html https://blog.csdn.net/shenjianxz/article/details/62 ...

  6. node node-sass sass-loader版本兼容问题

    相关概念 sass Sass是一种预处理器脚本语言,可以解释或编译成层叠样式表(CSS). Sass包含两种语法:较旧的语法使用缩进将代码块和换行符分隔为单独的规则:较新的语法SCSS使用像CSS这样 ...

  7. TextCNN和TextRNN:原理与实践

    1.TextCNN原理 CNN的核心点在于可以捕获信息的局部相关性,具体到文本分类任务中可以利用CNN来提取句子中类似N-Gram的关键信息. (1)一维卷积:使用不同尺寸的kernel_size来模 ...

  8. 昇腾实践丨ATC模型转换动态shape问题案例

    本文分享自华为云社区<ATC模型转换动态shape问题案例>,作者:昇腾CANN. ATC(Ascend Tensor Compiler)是异构计算架构CANN体系下的模型转换工具:它可以 ...

  9. 华为云GaussDB圈层活动走进香港,以技术创新构筑金融政企数智发展基石

    摘要:近日,华为云GaussDB圈层活动在中国·香港如期举办,活动聚集了22家香港金融政企客户和合作伙伴. 本文分享自华为云社区<华为云GaussDB圈层活动走进香港,赋能金融政企数字化转型&g ...

  10. GaussDB(DWS)查询过滤器原理与应用

    摘要:GaussDB(DWS)查询过滤器(黑名单)提供查询过滤功能,支持自动隔离反复被终止的查询,防止烂SQL再次执行. 本文分享自华为云社区<GaussDB(DWS)查询过滤器原理与应用> ...