PHP 安全(一)

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

在今天的文章中,我将转向讨论这个系列的重点:使用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 serversuperuser运行程式,如果是这样的,你应该停止阅读,马上去修复它)。

 

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

 

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

 

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

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

 

 

常见的涉及安全的错误

 

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

  • 错误1。信赖数据

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

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

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

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

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

 

 

php 图片上传安全探讨

PHP 图片文件安全探讨 转载请标明出处:  http://blog.csdn.net/u010136741/article/details/50445588; 本文出自:【柳木木的博客】 [问题...
  • u010136741
  • u010136741
  • 2016年01月01日 19:30
  • 717

深入浅出php下的文件上传-确保文件上传安全

文件作为一种特殊的表单数据,通过http post请求方式提交至服务器的时候,php会生成一个$_FILES全局数组,相关的文件信息会存放在这个全局数组中。我将在这篇文章中通过一些示例代码来阐述php...
  • u014649204
  • u014649204
  • 2014年04月19日 16:21
  • 2132

windows下apache/php安全配置

继上篇《PHP网站被挂马防御战》   Php本身也有一些安全机制,如下: 1、 禁用shell函数和com组件;(上篇已提到) 2、 限制php作用域;(上篇已提到) 3、 启动php安全模式; 4、...
  • cwqcwk1
  • cwqcwk1
  • 2013年06月17日 15:11
  • 2926

PHP开发web应用安全总结

XSS跨站脚本 概念:恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。 危害: 盗取用户COOK...
  • erjian666
  • erjian666
  • 2016年11月22日 18:46
  • 1141

PHP开发api接口安全验证

PHP的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知...
  • li741350149
  • li741350149
  • 2017年03月20日 12:41
  • 10156

PHP 安全:过滤、验证和转义

PS:来自http://laravelacademy.org/post/4610.html 我们在开发应用时,一般有个约定:不要信任任何来自不受自己控制的数据源中的数据。例如以下这些外部源: ...
  • wlzx120
  • wlzx120
  • 2016年09月02日 10:29
  • 2304

PHP,CURL和你的安全!

简介   如果最近你在美国看电视,你会经常看到一个广告——一个和蔼友善的家伙说“我希望我的电脑被病毒感染”,“我希望所有我家的照片都被人删除,找不回来。”或“我希望我的笔记本运转的声音听起来像打雷...
  • zyu67
  • zyu67
  • 2014年12月17日 16:01
  • 841

PHP安全编程之session劫持的防御

session 数据暴露 会话数据常会包含一些个人信息和其它敏感数据。基于这个原因,会话数据的暴露是被普遍关心的问题。一般来说,暴露的范围不会很大,因为会话数据是保存在服务器环境中的,而不是在数...
  • nuli888
  • nuli888
  • 2016年08月10日 11:06
  • 646

Linux下PHP的10大安全配置

PHP被广泛用于各种Web开发。而当服务器端脚本配置错误时会出现各种问题。现今,大部分Web服务器是基于Linux环境下运行(比如:Ubuntu,Debian等)。本文例举了十大PHP最佳安全实践方式...
  • qq43599939
  • qq43599939
  • 2016年06月12日 15:29
  • 1427

PHP做APP接口时,如何保证接口的安全性

PHP做APP接口时,如何保证接口的安全性? 1、当用户登录APP时,使用https协议调用后台相关接口,服务器端根据用户名和密码时生成一个access_key,并将access_key保存在ses...
  • lhbeggar
  • lhbeggar
  • 2015年06月05日 15:51
  • 5529
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP 安全(一)
举报原因:
原因补充:

(最多只允许输入30个字)