<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >用户提交的数据</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="安全" HREF="security.html"><LINK REL="PREVIOUS" TITLE="使用 Register Globals" HREF="security.globals.html"><LINK REL="NEXT" TITLE="魔术引号" HREF="security.magicquotes.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="security.globals.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="security.magicquotes.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="security.variables" >章 30. 用户提交的数据</A ></H1 ><P > 很多 PHP 程序所存在的重大弱点并不是 PHP 语言本身的问题,而是编程者的安全意识不高而导致的。因此,必须时时注意每一段代码可能存在的问题,去发现非正确数据提交时可能造成的影响。 <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6787" ></A ><P ><B >例 30-1. 危险的变量用法</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">// 从用户目录中删除一个文件,或者……能删除更多的东西?<br /></font><font color="#0000BB">unlink </font><font color="#007700">(</font><font color="#0000BB">$evil_var</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// 记录用户的登陆,或者……能否在 /etc/passwd 添加数据?<br /></font><font color="#0000BB">fwrite </font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#0000BB">$evil_var</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// 执行一些普通的命令,或者……可以执行 rm -rf * ?<br /></font><font color="#0000BB">system </font><font color="#007700">(</font><font color="#0000BB">$evil_var</font><font color="#007700">);<br /></font><font color="#0000BB">exec </font><font color="#007700">(</font><font color="#0000BB">$evil_var</font><font color="#007700">);<br /><br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > 必须时常留意你的代码,以确保每一个从客户端提交的变量都经过适当的检查,然后问自己以下一些问题: <P ></P ><UL ><LI ><P > 此脚本是否只能影响所预期的文件? </P ></LI ><LI ><P > 非正常的数据被提交后能否产生作用? </P ></LI ><LI ><P > 此脚本能用于计划外的用途吗? </P ></LI ><LI ><P > 此脚本能否和其它脚本结合起来做坏事? </P ></LI ><LI ><P > 是否所有的事务都被充分记录了? </P ></LI ></UL > 在写代码的时候问自己这些问题,否则以后可能要为了增加安全性而重写代码了。注意了这些问题的话,也许还不完全能保证系统的安全,但是至少可以提高安全性。 </P ><P > 还可以考虑关闭 register_globals,magic_quotes 或者其它使编程更方便但会使某个变量的合法性,来源和其值被搞乱的设置。在开发时,可以使用 error_reporting(E_ALL) 模式帮助检查变量使用前是否有被检查或被初始化,这样就可以防止某些非正常的数据的挠乱了。 </P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="security.globals.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="security.magicquotes.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >使用 Register Globals</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="security.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >魔术引号</TD ></TR ></TABLE ></DIV ></BODY ></HTML >