如何阻止读取文本文件时执行其中的PHP代码?
如何阻止用户输入的PHP代码在读取文本文件时被执行?
我编写了一段PHP代码,用于从文本文件中随机选取一行内容并展示。未来我计划允许用户自行向该文本文件添加内容。代码如下:
<?php $f_contents = file("/path/to/randumb.txt"); $line = $f_contents[array_rand($f_contents)]; $jeff= $line; echo $jeff; ?>
这段代码目前运行正常,但测试时我向randumb.txt文件中写入了<?php echo this site has no security!;?>,结果页面显示空白(说明其中的PHP代码被执行了)。请问如何阻止这种情况发生?
嘿,这个问题其实是典型的未转义输出导致的安全风险,先给你拆解下原因和解决方案:
为什么会出现空白?
其实浏览器本身不会执行PHP代码,但当你直接输出<?php ... ?>这类标签时,浏览器会把它当作不识别的标记隐藏起来,所以看起来页面空白。但更大的问题是,如果后续服务器配置有变化(比如允许在静态HTML中解析PHP),或者用户输入更恶意的内容(比如JavaScript代码),会直接导致XSS攻击或者服务器被恶意利用。
最简单有效的解决方案:转义输出内容
在输出从文件读取的内容前,用htmlspecialchars()函数把所有HTML/PHP特殊字符转换成HTML实体,这样浏览器就会把它们当成普通文本显示,而不会尝试解析。
修改后的代码如下:
<?php $f_contents = file("/path/to/randumb.txt"); $line = $f_contents[array_rand($f_contents)]; // 转义特殊字符,指定编码避免乱码 $jeff = htmlspecialchars($line, ENT_QUOTES, 'UTF-8'); echo $jeff; ?>
这里的参数说明:
ENT_QUOTES:会同时转义单引号和双引号,避免以后如果把内容放到HTML属性里时出现安全问题UTF-8:根据你的文本文件编码调整,确保输出内容不会乱码
额外的安全建议(针对未来用户提交功能)
既然你打算让用户自行添加内容,还有几个点要注意:
- 输入验证:服务器端验证用户提交的内容,比如限制长度、只允许合法的文本字符,拒绝包含恶意标记的内容
- 文件权限:确保存储randumb.txt的目录权限设置正确,不要给文件执行权限,只保留读写权限
- 内容过滤:可以额外过滤掉明显的恶意标签(比如
<script>、<?php),但转义是基础,不能替代转义操作
这样处理后,不管用户输入什么代码,都会被当成普通文本显示出来,不会再出现页面空白或者安全风险啦。
内容的提问来源于stack exchange,提问作者Jeffery
相关产品推荐
相关产品推荐

