究極のPHPセキュリティのベストプラクティス

phpセキュリティガイド

PHPはほぼすべてのwebサイトのバックボーンであるため、PHPセキュリティは無視できるとはみなされません。 しかし、PHP開発者は、クロスサイトリクエストの偽造、SQLインジェクション、データ改ざんなどの一般的な脅威を回避する権限を持っています。 そして、このすべては、それが簡単に開発者がウェブサイトを保護するために作るPHP組み込みのセキュリティ機能の助けを借りて便利になります。

PHPは最も強力なサーバー側言語であると言われており、PHPは世界のウェブの80パーセントを利用し、トップ10万ドメインを使用しています。 この理由自体のために、PHPが攻撃者から保護するのを助けることを理解することです。

あらゆる種類の偽造攻撃からwebアプリケーションを保護することは、web開発者の究極の義務です。 あなたは、セキュリティ上の問題や抜け穴を持っていないのに十分な保護あなたのwebアプリを構築する必要があります。

PHPは、世界中で最も使用されているサーバー側のwebプログラミング言語です。 異なるPHPアプリケーションは、コードやスクリプトの異なる部分を他のwebアプリケーションと共有します。 共有コードが脆弱であることが検出された場合、その共有コードを使用するすべてのアプリケーションが危険にさらされ、脆弱であると見なされます。

クラウド上でアプリを安全に保つ

Cloudwaysは、アプリケーションを安全に保つ管理対象サーバー上で2FA、無料のSSL、およびより高度なセキュリティ機能を提供し

PHPは、セキュリティに関して最も批判されているスクリプト言語です。 開発者やQAの専門家の主要な塊は、PHPにはアプリケーションを保護するための堅牢な技術がないと考えています。 PHPはwebアプリ開発のために最も古く広く使用されている言語であるため、評決にもいくつかの根拠があります。 しかし、PHP5.6以来、長い間、セキュリティに関する主要な更新は見られていないため、言語はいくつかのセキュリティ問題に直面しています。

PHPの安全性

PHPは他の主要言語と同じくらい安全です。 PHPは、主要なサーバー側言語と同じくらい安全です。 ここ数年で導入された新しいPHPフレームワークとツールにより、最高のセキュリティを管理することがこれまで以上に簡単になりました。

比較してみると———– Rails、Java、Javascript、およびその他の言語は、すべて長年にわたって脆弱性を抱えています。 “何らかの形や形の脆弱性を持っていない言語を見つけた場合、PHPで安全なコードを完全に記述することができます。Php CMSのセキュリティ問題WordPress、Joomla、Magento、Drupalなどの人気CMSはPHPで構築されており、Sucuriによると、PHP CMSの脆弱性のほとんどは今年中に明らかになりました2017:

  • WordPressのセキュリティ問題は、2016年第3四半期の74%から2017年には83%に増加しました。
  • Joomlaのセキュリティ問題は、2016年第3四半期の17%から2017年には13.1%に減少しています。
  • Magentoのセキュリティ問題は、2016年第3四半期の6%から2017年には6.5%にわずかに上昇しました。Drupalのセキュリティ問題は、2016年第3四半期の2%から2017年には1.6%にわずかに減少しました。

cms感染比較

cms感染の比較

現在の状況は十分ではありませんが、オープンソースの貢献者のおかげで、問題を克服しようと努力しており、phpの劇的な変化を見てきました。 PHP7.xは昨年、さまざまな更新と修正を加えて発売されました。 PHP7についての最もよい事。xは、言語のセキュリティプロトコルを真に刷新したセキュリティアップグレードに関連しています。

このPHPセキュリティチュートリアルには何が含まれていますか?

私はPHPのセキュリティとパフォーマンスの問題に非常に長い間取り組んできましたが、PHPコミュニティでは非常に活発で、ライブプロジェクトで使 したがって、このPHPセキュリティチュートリアルの主な目的は、PHP webアプリケーションのセキュリティのベストプラクティスについ 私は以下の問題を定義し、それらのための可能な解決策に言及します。

  • PHPを定期的に更新
  • クロスサイトスクリプティング(XSS)
  • SQLインジェクション攻撃
  • クロスサイトリクエストフォージェリXSRF/CSRF
  • セッションハイジャック
  • ブラウザからファイルを隠す
  • 安全にアップロードファイル
  • httpsにssl証明書を使用する
  • クラウドにPhpアプリをデプロイする

注:完全なチートシートとはみなさないでください。 より良い方法が必要であり、よりユニークなソリューション開発者は、それが完全に安全にするために彼らのアプリケーシ

PHPセキュリティのベストプラクティス

PHP webアプリケーションを作成する際には、webエンジニアはセキュリティのベストプラクティスに関す 安全でないwebアプリケーションは、ハッカーにクライアント情報やクレジットカードの詳細などの貴重なデータを取る機会を与えます。 さらに、データ侵害は、組織の有効性と将来の運用に極端な影響を与える可能性があります。

PHPを定期的に更新

今、利用可能なPHPの最も安定した最新バージョンはPHP8です。 PHPアプリケーションをこの新しいものに更新する必要があることをお勧めします。 それでもPHP5.6または7を使用している場合は、PHPアプリのアップグレード中に多くの非推奨が発生します。 また、コードを更新し、パスワードハッシュなどの機能的なロジックを変更する必要があります。 また、コードの非推奨を確認し、それらの移行に役立つツールもいくつかあります。 私は以下のいくつかのツールをリストしました:

  1. Php Compatibility Checker
  2. PHP MAR
  3. Phan

PHPStormを使用している場合は、PHP7互換性検査を使用して、問題の原因となるコードを表示できます。

続きを読む: Php Hosting on Cloudways

クロスサイトスクリプティング(XSS)

クロスサイトスクリプティングは悪意のあるweb攻撃の一種であり、外部スクリプトがwebサイトのコード 攻撃者は感染したコードをエンドユーザーに送信する可能性がありますが、ブラウザは信頼できるスクリプトとして識別できません。 この攻撃は、主にユーザーがデータを入力して送信する能力を持っている場所で発生します。 この攻撃は、cookie、セッション、およびブラウザに関するその他の機密情報にアクセスする可能性があります。 URLを介してデータを送信するGET要求の例を見てみましょう:

URL: http://example.com/search.php?search=<script>alert('test')</script>$search = $_GET ?? null;echo 'Search results for '.$search;

htmlspecialcharsを使用すると、この攻撃を把握できます。 また、ENT_QUOTESを使用すると、一重引用符と二重引用符をエスケープできます。

$search = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');echo 'Search results for '.$search;

一方、XSS攻撃は属性、エンコードされたURIスキーム、コードエンコーディングを介して実行することもできます。

続きを読む:LaravelでXSSを防ぐ

SQLインジェクション攻撃

SQLインジェクションは、PHPスクリプトで最も一般的な攻撃です。 単一のクエリは、アプリケーション全体を危険にさらす可能性があります。 SQLインジェクション攻撃では、攻撃者はクエリを介して渡しているデータを変更しようとします。 SQLクエリでユーザーデータを直接処理していて、突然、匿名の攻撃者が密かに別の文字を使用してバイパスしているとします。 以下のSQLクエリを参照してください:

$sql = "SELECT * FROM users WHERE username = '" . $username . "';

username usernameには変更されたデータが含まれている可能性があり、データベース全体を瞬く間に削除するなど、データベースに損傷を与える可能性があります。 だから、解決策は何ですか? PDOだ 私はあなたが常に準備された文を使用することをお勧めします。 PDOは、SQLクエリを保護するのに役立ちます。

$id = $_GET ?? null;

データベースとアプリケーションの間の接続は、以下の文で行われます:

$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbusername', 'dbpassword');

上記のIDに基づいてユーザー名を選択できますが、待ってください! ここでSQLコード’GET data’がクエリに挿入されます。 このようなコーディングを避け、代わりにprepared文を使用するように注意してください:

$sql = "SELECT username, email FROM users WHERE id = ".$id." ;foreach ($dbh->query($sql) as $row) { printf ("%s (%s)\n", $row, $row);}

これで、

$sql = "SELECT username, email FROM users WHERE id = :id";$sth = $dbh->prepare($sql, );$sth->execute();$users = $sth->fetchAll();

を使用して上記のSQLインジェクションの可能性を回避できますまた、doctrineやeloquentのようなORMを使用することをお勧めします。

続きを読む: PHP WebサイトをSQLインジェクションから保護する

クロスサイトリクエスト偽造XSRF/CSRF

CSRF攻撃はXSS攻撃とはまったく異なります。 CSRF攻撃では、エンドユーザーは認証されたwebサイトで不要な操作を実行し、悪意のあるコマンドをサイトに転送して望ましくない操作を実行できます。 CSRFは要求データを読み取ることができず、主にHTMLタグ内のリンクまたは変更されたデータを送信することによって状態変更要求を対象とします。 これは、資金の移転、電子メールアドレスの変更などの状態変更要求を実行するようにユーザーに強制することができます。 GET requestsが別のアカウントにお金を送信しているこのURLを見てみましょう:

GET http://bank.com/transfer.do?acct=TIM&amount=100 HTTP/1.1

これで、誰かがwebアプリケーションを悪用したい場合、彼/彼女はこの

http://bank.com/transfer.do?acct=Sandy&amount=100000

のような名前と量のURLを変更します。

http://bank.com/transfer.do?acct=Sandy&amount=100000

今、このURLは任意のファイル、画像などで電子メールで送信することができ、攻撃者は

ファイルをダウンロードするか、画像をクリックするように頼むかもしれません。 そして、あなたがそれを行うとすぐに、あなたは即座にあなたが知っていることはありませんお金の膨大な量を送信することになります。

セッションハイジャック

セッションハイジャックは、攻撃者がユーザーのセッションIDを密かに盗む特定のタイプの悪意のあるweb攻撃です。 このセッションIDは、関連するserver_SESSION配列がスタック内のストレージを検証し、アプリケーションへのアクセスを許可するサーバーに送信されます。 セッションハイジャックは、XSS攻撃によって、またはセッションデータが格納されているサーバー上のフォルダに誰かがアクセスしたときに可能です。

セッションハイジャックを防ぐために、常にセッションをIPアドレスにバインドします。:

$IP = getenv ( "REMOTE_ADDR" );

正確なIPを提供しないが、:::1または:::127型の値を提供するため、localhostで作業しているときに注意してください。 違反が発生するたびに、セッションを迅速に無効化(cookieの設定解除、セッションストレージの設定解除、トレースの削除)し、いかなる状況下でもIdを公開しないようにする必要があります。

cookieの場合、cookieに格納されているデータをシリアライズしないことをお勧めします。 ハッカーはcookieを簡単に操作できるため、スコープに変数を追加することができます。 このようなcookieを安全に削除します:コードの最初の行は、ブラウザでcookieの有効期限が切れることを保証し、2行目はcookieを削除する標準的な方法を示しています(したがって、cookieにfalseを保存す 3行目は、スクリプトからcookieを削除します。

Read more:Redis Server As A PHP Session Handler

ブラウザからファイルを非表示にする

PHPのマイクロフレームワークを使用している場合は、ファイルの配置を適切に保証する特定のディレクトリ構造を見ている必要があります。 フレームワークは、コントローラ、モデル、設定ファイル(。しかし、ほとんどの場合、ブラウザはすべてのファイルを処理するわけではありませんが、ブラウザで見ることができます。 この問題を解決するには、ファイルをルートディレクトリに配置するのではなく、パブリックフォルダに配置して、ブラウザで常にアクセスできないようにする必要があります。 以下のSlimフレームワークのディレクトリ構造を見てください:

スリムなディレクトリ構造

slimディレクトリ構造

安全にファイルをアップロード

ファイルのアップロードは、任意のユーザーデータ処理アプリケーションの必要な部分です。 しかし、いくつかの点で、私はすでに記事で説明したように、ファイルはまた、XSS攻撃のために使用されていることを覚えておいてください。 基本に戻って、フォームで常にPOST要求を使用し、<フォーム>タグでプロパティenctype=”multipart/form-data”を宣言します。 次に、次のようにfinfoクラスを使用してファイルタイプを検証します:

$finfo = new finfo(FILEINFO_MIME_TYPE);$fileContents = file_get_contents($_FILES);$mimeType = $finfo->buffer($fileContents);

開発者は独自のカスタムで超安全なファイル検証ルールを作成できますが、Laravel、Symfony、codeigniterのようないくつかのフレームワークには、ファイルタイプを検証するための事前定義されたメソッドが既に用意されています。

別の例を見てみましょう。 フォームのHTMLは次のようにする必要があります:

<form method="post" enctype="multipart/form-data" action="upload.php"> File: <input type="file" name="pictures" multiple="true"> <input type="submit"></form>

とアップロード。phpには次のコードが含まれています:

foreach ($_FILES as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmpName = $_FILES; $name = basename($_FILES); move_uploaded_file($tmpName, "/var/www/project/uploads/$name"); }}

UPLOAD_ERRとbasename()を適切に宣言すると、ディレクトリトラバーサル攻撃を防ぐことができますが、アプリケーションのセキュリティを強化するためには、ファイルサイズ、ファイル名の変更、アップロードされたファイルをプライベートな場所に保存するなど、他の検証もほとんど必要ありません。

続きを読む: PHPでの画像とファイルのアップロード

HTTPSにSSL証明書を使用

Google Chrome、Opera、Firefoxなどの最新のブラウザはすべて、WEBアプリケーションにHTTPSプロトコルを使用す HTTPsは、信頼されていないサイトのためのセキュリティで保護された暗号化されたアク WEBサイトにSSL証明書をインストールしてHTTPSを含める必要があります。 また、xss攻撃からwebアプリケーションを強化し、コードを使用して転送されたデータを読み取るためにハッカーを防ぎます。 Cloudwaysは、90日間有効な無料のSSL証明書をワンクリックで提供しており、クリックするだけで簡単に失効または更新できます。 PHP、WordPress、Magento、DrupalアプリケーションでSSL証明書を設定するためのガイドに従うことができます。

クラウド上でPHPアプリをデプロイ

ホスティングは、ローカルPHPサーバー上でプロジェクトを作成し、共有、クラウド、または専用ホスティングを提供するライブサーバーにデプロイするため、任意のwebアプリケーションにとって最終的かつ最も重要なステップです。 私はいつもDigitalOcean、Linode、AWSのようなクラウドホスティングを使用することをお勧めします。 彼らは、ウェブサイトやアプリケーションの任意の種類のために、高速で安全かつ安全です。 彼らは常にWEBアプリケーションのために非常に有害であるDDOS、ブルートフォースとフィッシング攻撃を防ぐために、保護された層を提供します。

あなたのプロジェクトのためのLaravel共有ホスティングの落とし穴

クラウドサーバーにPHPアプリケーションをデプロイするには、LAMPやLEMPのような強力なウェブスタックを作成するための優れたLinuxスキルが必要です。 代わりに、Cloudways managed PHPとMySQL hosting platformを使用すると、上記のクラウドプロバイダーを数回クリックするだけでThunderstackでサーバーをデプロイする簡単な方法が提供されます。 Thunderstackは、PHPアプリケーションをさまざまな悪意のある攻撃から完全に保護し、最適化されたパフォーマンスを保証します。

続きを読む:拡張されたCloudwaysステージング環境は、すべてのユーザーが利用できるようになりました

ドキュメントルートのセットアップ

任意のサーバー上のPHPアプ しかし、場合によっては、Laravel、Symfony、SlimなどのフレームワークでApiを開発している場合は、webrootを`/publicフォルダに更新する必要があります。

/publicは、インデックス付きの単純なPHPウェブサイトに似たアプリケーションの出力を提供します。phpファイル。 Webrootをvar/www/html/publicに設定する目的は、次のような機密ファイルを非表示にすることです。htaccessと.envデータベース、メール、支払いApiの環境変数と資格情報が含まれています。

また、Laravel、Symfonyのようなフレームワークは、すべてのファイルをルートフォルダに移動するのではなく、view、models、controllersなどの関連ファイルを保存するための素敵なディレ

すべてのエラーをログに記録し、本番環境で非表示にします

ウェブサイトを開発し、ライブサーバーにデプロイしたら。 ハッカーは、エラーから同じ貴重な情報を得る可能性があるため、あなたがしなければならない最初の事は、エラーの表示を無効にしています。 Phpでこのパラメータを設定します。iniファイル:

display_errors=Off

今、表示をオフにした後、将来のニーズのために特定のファイルにPHPエラーをログに記録します:

log_errors=Onerror_log=/var/log/httpd/php_scripts_error.log

明らかに、必要に応じてファイル名を変更できます。

あなたも好きかもしれません:PHPロールバー統合でLaravelエラーロギングを簡素化

MysqlのホワイトリストパブリックIP

PHPアプリで作業するときは、頻繁に内部スク ほとんどのクライアントは、接続を作成するためにサーバーをホストすることによって提供されるIPアドレスまたは他のホスト名を必要とするMySQL

匿名ユーザーがデータベースにアクセスできないように、リモートMysql接続のパブリックIPをホストサーバーにホワイトリストに登録する必要があります。 たとえば、Cloudwaysでは、次のようにipをホワイトリストに登録できます:

これで、SQLyogまたはMysql workbenchに接続して、データベースとリモートで作業できます。

Q:PHPのセキュリティをテストするには?

A:PHPアプリケーションのコード品質とセキュリティを分析するのに役立つコードスキャナツールは市場で入手可能なものはほとんどありません。 PHP Malware Finder(PMF)は、ファイル内の悪意のあるコードを見つけるのに役立つトップのセキュリティテストツールの1つです。 また、リアルタイムでコードの脆弱性を見つけるのに役立つ一般的なコード分析ツールであるRIPSを使用することもできます。

Q:PHPデータベースのセキュリティを確保するにはどうすればよいですか?

A:データベースのセキュリティを確保するには、SQLインジェクション保護、database firewalls、通常のデータ暗号化などのプラクティスを常に使用する必要があります。

Q:PHPでパスワードを暗号化する安全な方法はどれですか?

: Md5はメッセージプロセス5の頭字語で、sha1はSecure Hash Algorithm1の頭字語です。 それらは両方とも文字列を暗号化するために利用されます。 文字列が暗号化されると、それを復号化するために反復的になります。 Md5とsha1は、データベース内にパスワードを格納するときに非常に便利です。

Q:PHPの脆弱性とは何ですか?

A:PHP Object Injectionはアプリケーションレベルの脆弱性であり、攻撃者がコードインジェクション、SQLインジェクション、パストラバーサル、サービス拒否など、多様な種類の有害な攻撃を実行することを可能にすると思われる。

DDoS攻撃は、複数のコンピュータシステム攻撃を危険にさらします。 通常のターゲットは、サーバー、webサイト、またはその他のネットワークリソースです。

これは、ユーザーが指定した入力がUNSERIALIZE()PHP関数に渡される前に管理されていない場合に発生します。 PHPではオブジェクトのシリアル化が許可されているため、アグレッサーはアドホックなシリアル化された文字列を無防備なunserialize()呼び出しに渡すことが

ラッピングアップ!

まあ、PHPのセキュリティのベストプラクティスは非常に広大なトピックです。 世界中の開発者は、webアプリを保護するために異なるユースケースを開発する傾向があります。 多くの企業は、アプリケーションのセキュリティの抜け穴や脆弱性を見つけ出し、アプリケーションの重要な抜け穴を指摘したセキュリティ専門家に報 この記事では、phpプロジェクトをさまざまな悪意のある攻撃から保護する方法を理解するのに役立つ基本的なPHPセキュリティ問題を説明します。 また、将来的にはさらにいくつかのPHPセキュリティのヒントやトリックについても書きます。 それまでは、以下のコメント欄に自分の考えやセキュリティ慣行を貢献することができます。

コメント欄であなたの意見を共有してください。 今すぐコメント

この記事を共有する

でのカスタマーレビュー

サンジットC

Shahroze Nawaz

Shahrozeは、管理されたPHPホスティングプラットフォームであるCloudwaysのPHPコミュニティマネージャーです。 彼の仕事の生活のほかに、彼は映画や旅行を愛しています。 あなたは

で彼に電子メールを送ることができます。

Leave a Reply

メールアドレスが公開されることはありません。