php 程序常犯错误总结

php 程序常犯错误总结

1.不转意html entities
一个基本的常识:所有不可信任的输入(特别是用户从form中提交的数据) ,输出之前都要转意。
echo $_GET['usename'] ;
这个例子有可能输出:
<script>/*更改admin密码的脚本或设置cookie的脚本*/</script>
这是一个明显的安全隐患,除非你保证你的用户都正确的输入。
如何修复 :
我们需要将"< ",">","and" 等转换成正确的HTML表示(< , >', and "),函数htmlspecialchars 和 htmlentities()正是干这个活的。
正确的方法:
echo htmlspecialchars($_GET['username'], ENT_QUOTES);

2. 不转意SQL输入
我曾经在一篇文章中最简单的防止sql注入的方法(php+mysql中)讨论过这个问题并给出了一个简单的方法 。有人对我说,他们已经在php.ini中将magic_quotes设置为On,所以不必担心这个问题,但是不是所有的输入都是从$_GET, $_POST或 $_COOKIE中的得到的!
如何修复:
和在最简单的防止sql注入的方法(php+mysql中)中一样我还是推荐使用mysql_real_escape_string()函数
正确做法:
<?php
$sql = "UPDATE users SET
name='.mysql_real_escape_string($name).'
WHERE id='.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>

3.错误的使用HTTP-header 相关的函数: header(), session_start(), setcookie()
遇到过这个警告吗?"warning: Cannot add header information - headers already sent [....]

每次从服务器下载一个网页的时候,服务器的输出都分成两个部分:头部和正文。
头部包含了一些非可视的数据,例如cookie。头部总是先到达。正文部分包括可视的html,图片等数据。
如果output_buffering设置为Off,所有的HTTP-header相关的函数必须在有输出之前调用。问题在于你在一个环境中开发,而在部署到另一个环境中去的时候,output_buffering的设置可能不一样。结果转向停止了,cookie和session都没有正确的设置........。

如何修复:
确保在输出之前调用http-header相关的函数,并且令output_buffering = Off
4. Require 或 include 的文件使用不安全的数据
再次强调:不要相信不是你自己显式声明的数据。不要 Include 或 require 从$_GET, $_POST 或 $_COOKIE 中得到的文件。
例如:
index.php
<?
//including header, config, database connection, etc
include($_GET['filename']);
//including footer
?>
现在任一个黑客现在都可以用:http://www.yourdomain.com/index.php?filename=anyfile.txt
来获取你的机密信息,或执行一个PHP脚本。
如果allow_url_fopen=On,你更是死定了:
试试这个输入:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php
现在你的网页中包含了http://www.youaredoomed.com/phphack.php的输出. 黑客可以发送垃圾邮件,改变密码,删除文件等等。只要你能想得到。
如何修复:
你必须自己控制哪些文件可以包含在的include或require指令中。
下面是一个快速但不全面的解决方法:
<?
//Include only files that are allowed.
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
if(in_array((string)$_GET['filename'],$allowedFiles)) {
include($_GET['filename']);
}
else{
exit('not allowed');
}
?>

5. 语法错误
语法错误包括所有的词法和语法错误,太常见了,以至于我不得不在这里列出。解决办法就是认真学习PHP的语法,仔细一点不要漏掉一个括号,大括号,分号,引号。还有就是换个好的编辑器,就不要用记事本了!

6.很少使用或不用面向对象
很多的项目都没有使用PHP的面向对象技术,结果就是代码的维护变得非常耗时耗力。PHP支持的面向对象技术越来越多,越来越好,我们没有理由不使用面向对象。

7. 不使用framework
95% 的PHP项目都在做同样的四件事: Create, edit, list 和delete. 现在有很多MVC的框架来帮我们完成这四件事,我们为何不使用他们呢?

8. 不知道PHP中已经有的功能
PHP的核心包含很多功能。很多程序员重复的发明轮子。浪费了大量时间。编码之前搜索一下PHP mamual,在google上检索一下,也许会有新的发现!PHP中的exec()是一个强大的函数,可以执行cmd shell,并把执行结果的最后一行以字符串的形式返回。考虑到安全可以使用EscapeShellCmd()

9.使用旧版本的PHP

很多程序员还在使用PHP4,在PHP4上开发不能充分发挥PHP的潜能,还存在一些安全的隐患。转到PHP5上来吧,并不费很多功夫。大部分PHP4程序只要改动很少的语句甚至无需改动就可以迁移到PHP5上来。根据http://www.nexen.net的调查 只有12%的PHP服务器使用PHP5,所以有88%的PHP开发者还在使用PHP4.

10.对引号做两次转意

见过网页中出现'或'"吗?这通常是因为在开发者的环境中magic_quotes 设置为off,而在部署的服务器上magic_quotes =on. PHP会在 GET, POST 和 COOKIE中的数据上重复运行addslashes() 。
原始文本:
It's a string

magic quotes on :
It's a string
又运行一次
addslashes():
It\'s a string

HTML输出:
It's a string

时间: 2024-11-03 03:55:42

php 程序常犯错误总结的相关文章

重视用户体验:摒弃网页视觉设计常犯错误

文章描述:细数10大网页视觉设计错误 用户体验需重视. 导语:在网络日益发达的今天,大家肯定都见过不少网站,但是大多数网站的设计都十分糟糕.这些设计糟糕的网站不仅在布局上问题多多,而且很不重视用户体验,致使网站流失大量用户.印尼专业设计师Albertus Adrianto近日在设计网站1stwebdesigner上撰文阐述了在网页视觉设计上常出现的10大错误.希望设计者们引以为诫:网站其实也是一个产品,也有它的用户体验,你意识到了这一点,你的网站才会推动你的宣传. 相信大家上网都看到过很多网站,

DIV+CSS网页布局及网站设计常犯错误

1.导航菜单使用图片.FLASH 导航菜单使用图片.FLASH当然比纯文本来得好看一些,但是搜索引擎并不认识你的图片和FLASH.如果你非要使用漂亮的图片来做导航的话,可以使用背景替换的方法(我会在下次谈到这一个方法的):如果你要使用FLASH做导航,那我就没你办法了.建议做一个导航菜单链接的xml文提交到搜索引擎. 2.不恰当地使用图片 为了网页美观,经常会到处贴满图片,这样做是不正确的,与内容无关的图片能少就少吧.我们可以把这些图片做成容器的背景. 3.内容里特殊字体的运用 我承认楷体很漂亮

产品经理经的常犯错误

看身边,看朋友,看同事,看看我们这个并不成熟的圈子,优秀的产品经理总归很少.他们已经犯完了应该犯的错误,然后才牛逼起来. 反思我做产品经理的漫长历程,我把我以前犯过的错误,把后来带人的所见,以及与朋友聊天时的所闻,都列出来,以备大家各自警醒. 1.想当然. 这个是产品经理经常所犯的最大错误了.我们接到一个需求,我们想了想,然后就认为自己想的是对的.因为我们用过很多同类产品,想过很多类似的事情,等等.我们也想去做市场调查,但漫长而经常不靠谱的市调结果,往往让我们更加不知所措.所以我们反思:除了想当

CSS网页制作技巧:DIV+CSS网页布局常犯错误汇总

文章简介:随着CSS网页布局越来越普及,国内大部分网站已经采用CSS网页布局的制作方法.在应用DIV+CSS编码时很容易犯一些错误,这里列举一些常见的错误,帮助新手朋友更好的学习与进步. 随着CSS网页布局越来越普及,国内大部分网站已经采用CSS网页布局的制作方法.在应用DIV+CSS编码时很容易犯一些错误,这里列举一些常见的错误,帮助新手朋友更好的学习与进步. 一.检查HTML元素是否有拼写错误 是否忘记结束标记 即使是老手也经常会弄错div的嵌套关系.可以用dreamweaver的验证功能检

python新手常犯错误

本文参考自伯乐在线:http://blog.jobbole.com/42706/ 1.用可变值作为默认值 记住一点,在Python里,函数的默认值在函数定义的时候实例化的,而不是在调用的时候. 比如下面这个函数,numbers参数初始化为空列表,那么每次调用的时候都会将9加入到列表后面: def foo(numbers=[]): numbers.append(9) print numbers 结果: >>> foo() # first time, like before [9] >

总结竞品分析报告中常犯错误

在几年的产品工作过程中,写过一些竞品分析报告,总结了几个曾经犯过的错误,下面就一起和大家分享一下,希望能引起大家注意,避免同样的错误. 一.没有结论的功能点介绍 最常见的竞品分析方法就是对市场上的领先产品进行一次浏览,逐个写出竞品的功能点及流程,不管使用了整齐的表格或者详实的文字描述,又或者是使用了漂亮的图形和截图,没有结论的统计是没有意义的,分析就一定要有结果. 竞品分析的目的就是为自身产品的战略.节奏.功能点.交互视觉等多方面提供参考,指导自身工作实践.可以遵循以下的链条:竞品在做什么->竞

Access 开发人员常犯错误大全_ASP基础

错误一:陷入界面设计陷阱.漂亮的姑娘喜欢穿美丽的衣服,丑姑娘也喜欢美丽的衣服,可ACCESS除了提供定制菜单与开关面版之外,不提供任何定制控键的功能.你如果想使用自己的按扭,得编写许多许多代码,非常麻烦.为什么,为什么你们总放着现成的菜单不用,而要自己编写一整界面.累不累.值得吗,有没有人愿意为你的界面支付更多钱.     错误二:不使用DAO,而使用ADO.请记住DAO是世界上访问mdb文件有最高效率的数据库引擎,因为DAO直接内嵌在ACCESS运行环境中.在ACCESS中使用ADO如同打电话

Access 开发人员常犯错误大全

错误一:陷入界面设计陷阱.漂亮的姑娘喜欢穿美丽的衣服,丑姑娘也喜欢美丽的衣服,可ACCESS除了提供定制菜单与开关面版之外,不提供任何定制控键的功能.你如果想使用自己的按扭,得编写许多许多代码,非常麻烦.为什么,为什么你们总放着现成的菜单不用,而要自己编写一整界面.累不累.值得吗,有没有人愿意为你的界面支付更多钱. 错误二:不使用DAO,而使用ADO.请记住DAO是世界上访问mdb文件有最高效率的数据库引擎,因为DAO直接内嵌在ACCESS运行环境中.在ACCESS中使用ADO如同打电话给坐在桌

新站长在网络营销中常犯的三个错误

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在互联网日渐成熟的今天,网络营销已经成为网站的一般性功能,关系到一个网站的生存和发展.每个站长既希望自己的网站办的热热闹闹,又希望产品销售的红红火火.然而,互联网如同一个大舞台,你方唱罢我登场.举目望去,在众多的网站中,有几家能够生存下来?有几家能够发展起来?又有几家能发财?据有关资料介绍,目前我国的个人网站成活率极低,在这里总结几点新站长在