php教程 php手册 警惕 PHP程序员最易犯10种错误

警惕 PHP程序员最易犯10种错误

Jun 13, 2016 am 11:13 AM
php web 하지만 개발하다 최대 프로그램 제작자 알리다 언어 실수

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

很多程序员还在使用PHP的老版本,老版本上开发不能充分发挥PHP的潜能,还存在一些安全的隐患。转到新版本上来吧,并不费很多功夫。大部分PHP老版本程序只要改动很少的语句甚至无需改动就可以迁移到新版本上来。

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

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


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

CakePHP 프로젝트 구성 CakePHP 프로젝트 구성 Sep 10, 2024 pm 05:25 PM

이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 라우팅 CakePHP 라우팅 Sep 10, 2024 pm 05:25 PM

이번 장에서는 라우팅과 관련된 다음과 같은 주제를 학습하겠습니다.

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

See all articles