PHP 安全 (1)

PHP安全相关的配置(1) PHP作为一门强大的脚本语言被越来越多的web应用程序采用,不规范的php安全配置可能会带来敏感信息泄漏、SQL注射、远程包含等问题,规范的安全配置可保障最基本的安全环境。下面我们分析几个会引发安全问题的PHP配置,并给出建议的选项。1、 register_globals = OffPHP在进程启动时,会根据register_globals的设置,判断是否将$_GET、$_POST、$_COOKI 阅读详情

 

原作:John Coggeshall 07/31/2003

翻译:Easy


在最近的两篇专栏文章(《常见样式错误(上)》和《常见样式错误(下)》)中我讨论了一些在编写PHP程式时常见的使程式难于阅读和易导致BUG的坏习惯。

 

在今天的文章中,我将转向讨论这个系列的重点:使用PHP时,安全问题的重要性。

 

关注安全问题的重要性

 

看到的远非全部

 

阻止用户恶意破坏你的程式最有效却经常被忽略的方法是在写代码时就考虑它的可能性。留意代码中可能的安全问题是很重要的。考虑下边的旨在简化用PHP中写入大量文本文件的过程的实例函数:

 

<?php

function write_text($filename, $text="") {

               static 
$open_files = array();



               
// 如果文件名空,关闭全部文件

               
if ($filename == NULL) {

                               foreach(
$open_files as $fr) {

                                              
fclose($fr);

                               }

                               return 
true;

               }

               
$index = md5($filename);    

       

               if(!isset(
$open_files[$index])) {

                               
$open_files[$index] = fopen($filename, "a+");

                               if(!
$open_files[$index]) return false;

               }

               
fputs($open_files[$index], $text);

               return 
true;

}
?>


这个函数带有两个缺省参数,文件名和要写入文件的文本。

 

函数将先检查文件是否已被打开;如果是,将使用原来的文件句柄。否则,将自行创建。在这两种情况中,文本都会被写入文件。

 

如果传递给函数的文件名是NULL,那么所有打开的文件将被关闭。下边提供了一个使用上的实例。

 

如果开发者以下边的格式来写入多个文本文件,那么这个函数将清楚和易读的多。

 

让我们假定这个函数存在于一个单独的文件中,这个文件包含了调用这个函数的代码。

下边是一个这样的程式,我们叫它quotes.php:

 

<html><body>

<form action="<?=$_SERVER['PHP_SELF']?>" method="get">

Choose the nature of the quote:

<select name="quote" size="3">

<option value="funny">Humorous quotes</option>

<option value="political">Political quotes</option>

<option value="love">Romantic Quotes</option>

</select><br />

The quote: <input type="text" name="quote_text" size="30" />

<input type="submit" value="Save Quote" />

</form>

</body></html>



<?php

    
include_once('write_text.php');



    
$filename  = "/home/web/quotes/{$_GET['quote']}";

    
$quote_msg = $_GET['quote_text'];



    if (
write_text($filename, $quote_msg)) {

       echo 
"<center><hr><h2>Quote saved!</h2></center>";

    } else {

       echo 
"<center><hr><h2>Error writing quote</h2></center>";

    }

    
write_text(NULL);

?>

如同你看到的,这位开发者使用了write_text()函数来创建一个体系使得用户可以提交他们喜欢的格言,这些格言将被存放在一个文本文件中。

 

不幸的是,开发者可能没有想到,这个程式也允许了恶意用户危害web server的安全。

 

也许现在你正挠着头想着究竟这个看起来很无辜的程式怎样引入了安全风险。

如果你看不出来,考虑下边这个URL,记住这个程式叫做quotes.php:

 

http://www.somewhere.com/fun/quotes.php?quote=different_file.dat&quote_text=garbage+data

 

当这个URL传递给web server 时将会发生什么?

 

显然,quotes.php将被执行,但是,不是将一句格言写入到我们希望的三个文件中之一,相反的,一个叫做different_file.dat的新文件将被建立,其中包含一个字符串garbage data。

 

显然,这不是我们希望的行为,恶意用户可能通过把quote指定为../../../etc/passwd来访问UNIX密码文件从而创建一个帐号(尽管这需要web server以superuser运行程式,如果是这样的,你应该停止阅读,马上去修复它)。

 

如果/home/web/quotes/可以通过浏览器访问,可能这个程式最严重的安全问题是它允许任何用户写入和运行任意PHP程式。这将带来无穷的麻烦。

 

这里有一些解决方案。如果你只需要写入目录下的一些文件,可以考虑使用一个相关的数组来存放文件名。如果用户输入的文件存在于这个数组中,就可以安全的写入。另一个想法是去掉所有的不是数字和字母的字符来确保没有目录分割符号。还有一个办法是检查文件的扩展名来保证文件不会被web server执行。

 

原则很简单,作为一个开发者你必须比程式在你希望的情况下运行时考虑更多。

如果非法数据进入到一个form元素中会发生什么?恶意用户是否能使你的程式以不希望的方式运行?什么方法能阻止这些攻击?你的web server和PHP程式只有在最弱的安全链接下才安全,所以确认这些可能不安全的链接是否安全很重要。

 

 

常见的涉及安全的错误

 

这里给出一些要点,一个可能危及安全的编码上的和管理上的失误的简要不完整列表

  • 错误1。信赖数据

这是贯穿于我关于PHP程式安全的讨论的主题,你决不能相信一个来自外部的数据。不管它来自用户提交表单,文件系统的文件或者环境变量,任何数据都不能简单的想当然的采用。所以用户输入必须进行验证并将之格式化以保证安全。

  • 错误2。在web目录中存储敏感数据

任何和所有的敏感数据都应该存放在独立于需要使用数据的程式的文件中,并保存在一个不能通过浏览器访问的目录下。当需要使用敏感数据时,再通过include 或 require语句来包含到适当的PHP程式中。

  • 错误3。不使用推荐的安全防范措施

PHP手册包含了在使用和编写PHP程式时关于安全防范的完整章节。手册也(几乎)基于案例清楚的说明了什么时候存在潜在安全风险和怎么将风险降低到最低。又如,恶意用户依靠开发者和管理员的失误得到关心的安全信息以获取系统的权限。留意这些警告并适当的采取措施来减小恶意用户给你的系统带来真正的破坏的可能性。

别再为OpenBCI_GUI安装发愁了!保姆级教程带你从Processing配置到成功运行(附常见错误解决) 本文提供了一份详细的OpenBCI_GUI安装教程,涵盖从Processing配置到成功运行的全过程,特别针对常见错误提供了解决方案。通过环境搭建、软件依赖安装、源码处理及首次运行实战,帮助用户高效完成数据可视化工具的部署与使用。 阅读详情

相关推荐

WinCC与PLC在西门子逻辑赛项中的通信配置避坑指南

本文针对西门子逻辑赛项中WinCC与PLC通信配置的常见问题,提供了一套实战避坑指南。重点解析了WinCC、PLC与EET仿真平台的三角通信架构,强调了IP地址规划、防火墙设置等关键环节的注意事项,并给出了系统化的故障诊断流程与排查技巧,帮助选手和技术人员快速定位并解决通信故障,确保监控系统稳定运行。

weixin_29165725的博客 107

Linux 编译安装 PHP 8.1 开启 ZTS(线程安全)

编译安装 PHP 8.1 开启 ZTS(线程安全) 主要是前几天在搞一个小东西的适合发现安装的 PHP 扩展需要开 ZTS,然后就得重新安装一遍了,所以写一下随便把编译安装的步骤也写下来,这份操作是在 Ubuntu 系统上完成的。 下载 PHP8.1 安装包并且解压 wget https://www.php.net/distributions/php-8.1.5.tar.gz tar -zxvf php-8.1.5.tar.gz cd php-8.1.5 这里就是先下载然后解压,进入到目录里面准备编译安装

Yui's博客 2235

Shader之——花草动画shader

今天 ,接到了个需求,花草的动画。谈到花草动画,立马就想到顶点动画,让顶点动起来就可以实现了。但是有个问题,所有的草都往一个方向运动,这个就麻烦了。因为在shader里没有随机这种概念,提到最多的是用一张噪声图来模拟。在网上搜索了一下,发现有更好的办法,就是用每个顶点到一个点的距离来控制动画的开始,毕竟每个顶点到同一个点的距离很少是一样的。 float dis = distance ...

baicaishisan的博客 2184

PHP5.6到8.1:性能与安全全面升级

PHP5.6与PHP8.1在性能、语法和安全方面存在显著差异。PHP8.1引入JIT编译使性能提升3倍,支持联合类型等现代语法特性,并持续获得安全更新;而PHP5.6已停止维护且缺乏这些优势。建议新项目直接采用PHP8.1,旧系统可先过渡到PHP7.4再升级,或采取隔离措施降低安全风险。

2509_93882308的博客 423

PVT(Process Voltage Temperature)

芯片PVT

网始如芯个人博客 3万+

《AI应用架构师必学:企业AI能力地图构建的高级技巧》

企业AI能力地图,简单来说,是一种可视化工具,它展示了企业在AI领域所具备的各种能力及其相互关系。就如同城市地图展示城市的街道、建筑和设施一样,AI能力地图呈现了企业在数据处理、模型开发、算法应用等多个方面的能力布局。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 819

PHP代码安全基础1

PHP代码安全基础 文章目录PHP代码安全基础一. 文件上传与下载1. 1文件上传1.2文件下载1.2文件修改核心:文件读写二.输入/出类2.1XSS2.2CSRF(XSRF) ​ 此主要是针对PHP代码中常见遇到或是涉及到的安全问题,总而言之就是安全很大程度是和功能相 挂钩的。因此往往功能越复杂,安全问题越容易产生。 一. 文件上传与下载 1. 1文件上传 <!-- 2022年1月10日00:16:06 总结:上传方式三种大类: 1.自写上传 2.编辑器上传

ThegreatHaige的博客 2678

数字信号处理实验:信号谱分析与FFT算法的应用

​ (1)给定信号为 ,其中a为42,b为1。理论分析信号 的频率成分。 (2)分别采用采样频率为 , , , 对 进行采样,其中 , , , ,根据是否满足采样定理要求分析四种采样频率下频谱的分布,在满足采样定理情况下做频谱分析。 (3)任意生成两组有限长信号,对信号分别进行直接卷积和FFT算法求卷积,并分析圆周卷积与线性卷积的关系。

m0_56324525的博客 3201

【PHP开发900个实用技巧】801.PHP 8.1枚举(Enums):类型安全的“新标杆”

PHP代码简洁之道:KISS与DRY原则实战指南 摘要: 本文通过两大编程黄金法则(KISS和DRY)解析PHP代码优化技巧。KISS原则强调代码应如"白开水般简单直接",建议控制函数行数,避免深层嵌套;DRY原则要求消除重复代码,推荐将3次以上重复逻辑封装复用。当两大原则冲突时,给出决策矩阵:复用率>3次优先DRY,理解成本>2分钟则KISS优先。实战案例展示如何将多层嵌套的折扣计算重构为策略分明的模块化代码,最终形成可维护性强的清爽代码结构。 关键点: 单一函数不超过屏幕

1145

车牌识别系统

随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一

FPGA/MATLAB学习教程/源码/项目合作开发 2万+

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

Chat*** Plus限时免费1个月!原价20美元/月的顶配功能

BUG猿的博客 7277

深入探究PHP中的declare(strict_types1)与PHP安全性提升

在PHP中,declare(strict_types1)是一个安全特性,它允许开发者指定变量的类型。通过这种方式,可以避免类型转换错误和未定义变量的使用,从而提高代码的安全性。在现代软件开发中,PHP作为一门流行的服务器端脚本语言,其安全性问题一直是开发者们关注的重点。因此,了解并利用declare(strict_types1)来提高PHP代码安全性是非常重要的。

void9main的博客 214

OpenGL 进阶系列10 - 光线跟踪实现简介(Ray Tracing)

OpenGL 实现光线跟踪(Ray Tracing)是一个相对复杂但有趣的挑战,通常用于生成高度逼真的图像效果,如反射、折射、阴影等。OpenGL 本身并不是为光线跟踪设计的,但可以通过结合计算着色器和现代 OpenGL 功能实现光线跟踪。光线跟踪的基本思路是从相机(或视点)出发,发射光线并计算这些光线与场景中物体的交点。光线与场景中物体相交的计算。计算交点的光照(基于表面法线、光源位置、材质等)。反射和折射的处理(如果物体是透明或反射的)。

GPU全栈博主 1534

【PHP架构师必修课】:PHP 7.1类常量可见性带来的代码安全升级路径

掌握PHP 7.1 类常量可见性,提升代码安全与封装性。本文详解其在权限控制中的应用,支持public、protected、private修饰类常量,增强模块化设计。适用于企业级应用开发,保障常量访问安全,优化架构维护性。值得收藏

LogicWander的博客 279

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【PHP安全】ThinkPHP 5.1 框架安全开发与核心漏洞分析

环节风险项安全实践开发规范不安全SQL写法强制使用查询构造器或模型的参数绑定方式,严禁SQL拼接。依赖管理框架版本漏洞定期更新框架至安全版本,订阅漏洞情报。输入处理内置过滤绕过对用户输入进行白名单校验和类型强制转换,即使框架有过滤也不完全依赖。权限控制逻辑越权漏洞关键操作实施“服务端权限复审”与“数据归属校验”。安全配置默认风险配置关闭调试模式(),自定义安全密钥,严格配置路由。

YsChunQiu777的博客 793

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

php中安全防范1

php中安全防范1 最近研读这方面的资料,也收集了些资料,打算每次做个笔记1 设置“register_globals”为“off” 这个选项会禁止PHP为用户输入创建全局变量2 设置“open_basedir” 这个选项可以禁止指定目录之外的文件操作,有效地消除了本地文件或者是远程文件被include()的攻击,但是仍需要注意文件上载和...

weixin_30340775的博客 64

PHP 8.1交集类型详解:构建更安全、更可维护的OOP架构

掌握PHP 8.1交集类型的使用,提升代码类型安全性与可维护性。适用于接口组合、服务容器等场景,通过精确类型约束实现更严谨的OOP设计。支持多类型同时验证,减少运行时错误。构建健壮应用的关键技巧,值得收藏。

QuickProceed的博客 987

【高级PHP开发技巧】:如何用PHP 7.1类常量可见性写出更安全的OOP代码

掌握PHP 7.1类常量可见性,提升OOP代码安全性与可维护性。通过设置private、protected、public修饰符控制类常量访问权限,防止外部篡改,适用于配置项、状态码等场景。增强封装性,减少耦合,值得收藏。

BytePerch的博客 259

安全入门之PHP基础1

安全入门之Web安全5(PHP基础)一、PHP的一些相关知识1.PHP相关编码函数2.PHP序列化与反序列化 一、PHP的一些相关知识 1.PHP相关编码函数 ASCII编码 ord() 函数返回字符串的首个字符的 ASCII 值。 chr() 函数从指定的 ASCII 值返回字符。 URL编码 urlencode()函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。 urldecode()函数可以解码给出的已编码字符串中的任何 %##。 加号(’+’)被解码成一个空

SDM_JH的博客 249

《PHP安全之道》读书笔记1:PHP项目安全设置

在全球范围来看,超过了80%的网站是使用php进行搭建的,由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患。从配置选项来看,可以做如下的优化。 1.屏蔽PHP错误输出。 在/etc/php.ini(默认配置文件位置),将如下配置值改为Off display_errors=Off 不要将错误堆栈信息直接输出到网页上,防止黑客加以利用相关信息。 正确的做法是: 把错误日志写...

luantao9999的专栏 481

【PHP面向对象进阶必读】:PHP 7.1类常量可见性详解与安全编码实践

掌握PHP 7.1 类常量的可见性,提升代码安全与封装性。本文详解public、private、protected在类常量中的应用规则,解析兼容性变化与实际开发中的最佳实践,避免外部非法访问,增强程序健壮性。适用于大型项目架构设计,值得收藏。

PixelIsle的博客 719

php 7.1.26,PHP 5.6.40,7.1.26,7.3.1和7.2.14 发布,安全修复

PHP 5.6.40,7.1.26,7.3.1和7.2.14 已经发布,PHP是一种通用的开源脚本语言。 语法吸收了C语言的特点,Java和Perl有利于学习和被广泛使用,主要用于Web开发领域。 PHP独特的语法混合了C,Java,Perl和PHP的本机语法。 它可以比CGI或Perl更快地执行动态网页。 使用PHP制作的动态页面与其他编程语言相比,PHP将程序嵌入到HTML(标准通用标记语言下...

weixin_29387991的博客 314

PHP 7.1.28、7.2.17、7.3.4 发布,主要是安全更新

开发四年只会写业务代码,分布式高并发都不会还做程序员? PHP 发布了三个更新版本,这三个版本主要都是安全方面的更新,...

weixin_34206899的博客 305

【PHP 8.1交集类型深度解析】:掌握类型安全编程新利器

掌握PHP 8.1交集类型的使用,提升代码类型安全性与可维护性。详解其在接口组合、方法参数校验中的应用场景,揭示联合多种类约束的核心优势,有效避免运行时错误。实战示例解析,助你快速上手新特性,值得收藏。

LogicNest的博客 677

PHP安全习惯1

大家都知道安全性是重要的,但是行业中的趋势是直到最后一刻才添加安全性。既然不可能完全保护 Web 应用程序,那么为什么要费这个劲儿呢,不是吗?不对。只需采用一些简单的步骤就能够大大提高 PHP Web 应用程序的安全性。 开始之前在本教程中,您将学习如何在自己的 PHP Web 应用程序中添加安全性。本教程假设您至少有一年编写 PHP Web 应用程序的经验,所以这里不涉及 PHP 语言的基本知识

zdkjob专栏 450
上一篇: 白刃之战:PHP vs. ASP.NET(节选)-架构比较
下一篇: PHP安全(2)
KBUG
博客等级 码龄24年 5粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值