ホームページ php教程 php手册 PHP フレームワークをステップバイステップで作成する (14)

PHP フレームワークをステップバイステップで作成する (14)

Jun 21, 2016 am 08:50 AM
cookie nbsp this token

今日は、フレームワークでこれらのセキュリティ問題をオーバーライドする方法について説明します。

1 つ目は SQL インジェクションです。PDO を使用している場合は、まだ mysql_* などの API を使用している場合は、フレームワークで bindingParameter を実装するか、事前に文字変更を行うことができると思います。データベースに文字列エスケープを挿入します。

2 日前に最後の記事を書き終えた後、Vian はメッセージを残して、SQL インジェクションの解決策は DB に挿入する前に ''.addslashes($id).'' を実行することであると述べました。 、これは、最初に addslashes 操作を実行してから、それを一重引用符で強制的に囲むことを意味します。これにより、アウトアンドアウト文字列になるため、挿入できなくなります。この方法は良いと思います。 !

SQL インジェクションはモデルに接続する必要があるため、XSS はビューに接続する必要があります。この 2 つの部分についてはまだ話が始まっていないので、フレームワークで解決する方法については後ほど説明します。もちろん、後で忘れた場合は、思い出させてもらうこともできます。

前回 CSRF について話しましたが、解決策を提供しませんでした。今日はこの解決策を提供します。実際、解決策は非常に簡単です。乱数を生成し、渡された数値が正しい数値と一致するかどうかをバックエンドが判断します。一致しない場合、対応するコードは実行されません。トークンと呼ばれます。

簡単にするために、トークンの生成とトークンの取得の関数をコントローラー (Controller.php) に記述します。

1 つ目は、乱数を生成することです。最も簡単な方法は、mt_rand() を使用して整数を直接生成することですが、ここでは、CSRF を解決するために initphp フレームワークで見た方法を使用します。アイデアについては initphp の作者に:

initphp のコードは次のとおりです:

1 private function set_token() {
1

2         if (!$_COOKIE['init_token']) {

プライベート関数 set_token() {

3             $str = substr(md5(time(). $this->get_useragent()), 5, 8);
テーブル>

4             setcookie("init_token", $str, NULL, '/');

2

5             $_COOKIE['init_token'] = $str; 
if (!$_COOKIE['init_token']) { テーブル> 3 $str = substr(md5(time(). $this->get_useragent()), 5, 8); テーブル> 4 setcookie("init_token", $str, NULL, '/'); テーブル> 5 $_COOKIE['init_token'] = $str; テーブル>

6         }

7     }

簡単にするために、ここでは userAgent を使用しません。initphp は現在のタイムスタンプと userAgent を文字列に連結し、それを md5 で暗号化し、5 桁目から 8 桁目を取り出します。現在時刻 スタンプに対して md5 暗号化を実行し、0 番目の位置から開始して取得された文字列の長さをランダムに生成します:

1 $token = substr(md5(time()),0,mt_rand(10,15));
1

$token = substr(md5(time()),0,mt_rand(10,15));

テーブル>

乱数が大きすぎたり小さすぎたりしないように、mt_rand の値の範囲を 10 ~ 15 に設定しました。つまり、生成されるトークンの数は 10 ~ 15 桁になります。

1 private function _setToken() {
トークンを生成した後は、もちろん、最初に、ユーザーが要求するたびに乱数を生成する必要はありません。フレームワークである COOKIE に保存します。ロード時にトークンが存在するかどうかが判断され、存在しない場合は、生成されたトークンは一定期間後に期限切れになります。日々。

2         if(empty($_COOKIE['_csrfToken'])) {

3             $token = substr(md5(time()),0,mt_rand(10,15));

1

4             $this->_token = $token;

5             setcookie('_csrfToken',$token,time() + 3600 * 24 * 7);
プライベート関数 _setToken() {

テーブル>
6         } else {
2 if(empty($_COOKIE['_csrfToken'])) { テーブル> 3 $token = substr(md5(time()),0,mt_rand(10,15)); テーブル> 4 $this->_token = $token; テーブル> 5 setcookie('_csrfToken',$token,time() + 3600 * 24 * 7); テーブル> 6 } else { テーブル>

7             $this->_token = $_COOKIE['_csrfToken'];

8         }

9     }

トークンの生成処理はフレームワークによって自動的に完了するため、ユーザーがこの処理を見る必要はありません。そのため、この関数をプライベートにして、Controller クラスのコンストラクター内で呼び出します。

トークンを生成したばかりですが、トークンを取得するにはどうすればよいでしょうか? 実際、トークンを取得する方法は非常に簡単で、単純なゲッターです:

1 protected function _getToken() {
1

2         return $this->_token;

保護された関数 _getToken() {

3     }
テーブル>

2

return $this->_token;

テーブル>

3

}

テーブル>

01
次に、ユーザー作成コントローラーの判断プロセスを示します:

02 class IndexController extends Controller {

03 public function test() {
<🎜><🎜> ユーザーがリクエストした URL が http://localhost/index.php?c=Index&a=test&token=rwerdfdsfsdfs<🎜><🎜><🎜> であるとします。 <🎜> <🎜><🎜> このコントローラー クラスのコードは次のようになります: <🎜><🎜><🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>01<🎜><🎜> <🎜><🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>クラス IndexController はコントローラ {<🎜><🎜> を拡張します <🎜> <🎜> <テーブル> <🎜><🎜>03<🎜><🎜> <🎜><🎜> パブリック関数 test() {<🎜><🎜>

04 $token = empty($_GET['token']) ? '' : $_GET['token'];

05 if($token === $this->_getToken()) {

06             //判定为正常

07         } else {

08             $this->_redirect(array(

09                 //跳转到某一个控制器的某一个Action

10             ));

11         }

12     }

13 }

URL のトークン値がどのように設定され、渡されるのか疑問に思う人もいるかもしれません。

前のページが Index コントローラーの test2 アクションであると仮定すると、まず test2 アクションで $this->_getToken を使用してトークン値を取得し、次に渡すことができます。データをビューに送信し、ビューで使用した後、ユーザーはリンクをクリックしてトークン値を転送できます。

ここで質問したいと思います。ユーザーがページ A にアクセスしたときにトークンを取得したとします。ユーザーは 3 秒後にトークンを含むリンクをクリックしてページ B にアクセスします。 Page B は COOKIE 内のトークンが期限切れになっているため、新しいトークンを生成し、渡されたトークンと比較すると当然一致せず、ジャンプしてしまいます。これは問題ではありません。 ?

まだ少し時間があるので、ユーザーが test.php などのページをアップロードした後、ファイルの種類を決定しない場合について説明します。 、リンクに従ってこのページにアクセスすると、このページには破壊的なコードが含まれている可能性があり、Web サイト全体が危険になります。

おそらく、プログラムで jpg、png、gif の 3 種類のサフィックスのみが許可されると判断したので、アップロードが成功したら、この JSP ページのサフィックスを jpg などに変更します。 Web サイトに特定の脆弱性が存在すると、ファイルのサフィックスが変更される可能性があり、Web サイトが再び危険にさらされます。 !

Web サイトではファイル拡張子の変更が許可されていないと想定されますが、アップロードされた画像の後に JS スクリプトが追加されたり、アップロードされたファイル名にスクリプトが書き込まれたりする場合があります。これらは危険である可能性があります。 !



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

解決策: 組織では PIN を変更する必要があります。 解決策: 組織では PIN を変更する必要があります。 Oct 04, 2023 pm 05:45 PM

ログイン画面に「組織から PIN の変更を求められています」というメッセージが表示されます。これは、個人のデバイスを制御できる組織ベースのアカウント設定を使用しているコンピューターで PIN の有効期限の制限に達した場合に発生します。ただし、個人アカウントを使用して Windows をセットアップした場合、エラー メッセージは表示されないのが理想的です。常にそうとは限りませんが。エラーが発生したほとんどのユーザーは、個人アカウントを使用して報告します。私の組織が Windows 11 で PIN を変更するように要求するのはなぜですか?アカウントが組織に関連付けられている可能性があるため、主なアプローチはこれを確認することです。ドメイン管理者に問い合わせると解決できます。さらに、ローカル ポリシー設定が間違っていたり、レジストリ キーが間違っていたりすると、エラーが発生する可能性があります。今すぐ

Windows 11 でウィンドウの境界線の設定を調整する方法: 色とサイズを変更する Windows 11 でウィンドウの境界線の設定を調整する方法: 色とサイズを変更する Sep 22, 2023 am 11:37 AM

Windows 11 では、新鮮でエレガントなデザインが前面に押し出されており、最新のインターフェイスにより、ウィンドウの境界線などの細部をカスタマイズして変更することができます。このガイドでは、Windows オペレーティング システムで自分のスタイルを反映した環境を作成するのに役立つ手順について説明します。ウィンドウの境界線の設定を変更するにはどうすればよいですか? + を押して設定アプリを開きます。 Windows [個人用設定] に移動し、[色の設定] をクリックします。ウィンドウの境界線の色の変更設定ウィンドウ 11" width="643" height="500" > [タイトル バーとウィンドウの境界線にアクセント カラーを表示する] オプションを見つけて、その横にあるスイッチを切り替えます。 [スタート] メニューとタスク バーにアクセント カラーを表示するにはスタート メニューとタスク バーにテーマの色を表示するには、[スタート メニューとタスク バーにテーマを表示] をオンにします。

Windows 11 でのディスプレイ スケーリング ガイド Windows 11 でのディスプレイ スケーリング ガイド Sep 19, 2023 pm 06:45 PM

Windows 11 のディスプレイ スケーリングに関しては、好みが人それぞれ異なります。大きなアイコンを好む人もいれば、小さなアイコンを好む人もいます。ただし、適切なスケーリングが重要であることには誰もが同意します。フォントのスケーリングが不十分であったり、画像が過度にスケーリングされたりすると、作業中の生産性が大幅に低下する可能性があるため、システムの機能を最大限に活用するためにカスタマイズする方法を知る必要があります。カスタム ズームの利点: これは、画面上のテキストを読むのが難しい人にとって便利な機能です。一度に画面上でより多くの情報を確認できるようになります。特定のモニターおよびアプリケーションにのみ適用するカスタム拡張プロファイルを作成できます。ローエンド ハードウェアのパフォーマンスの向上に役立ちます。画面上の内容をより詳細に制御できるようになります。 Windows 11の使用方法

Windows 11で明るさを調整する10の方法 Windows 11で明るさを調整する10の方法 Dec 18, 2023 pm 02:21 PM

画面の明るさは、最新のコンピューティング デバイスを使用する上で不可欠な部分であり、特に長時間画面を見る場合には重要です。目の疲れを軽減し、可読性を向上させ、コンテンツを簡単かつ効率的に表示するのに役立ちます。ただし、設定によっては、特に新しい UI が変更された Windows 11 では、明るさの管理が難しい場合があります。明るさの調整に問題がある場合は、Windows 11 で明るさを管理するすべての方法を次に示します。 Windows 11で明るさを変更する方法【10の方法を解説】 シングルモニターユーザーは、次の方法でWindows 11の明るさを調整できます。これには、ラップトップだけでなく、単一のモニターを使用するデスクトップ システムも含まれます。はじめましょう。方法 1: アクション センターを使用する アクション センターにアクセスできる

iPhoneのSafariでプライベートブラウジング認証をオフにする方法は? iPhoneのSafariでプライベートブラウジング認証をオフにする方法は? Nov 29, 2023 pm 11:21 PM

iOS 17 では、Apple はモバイル オペレーティング システムにいくつかの新しいプライバシーおよびセキュリティ機能を導入しました。その 1 つは、Safari のプライベート ブラウジング タブに対して 2 段階認証を要求する機能です。その仕組みとオフにする方法は次のとおりです。 iOS 17 または iPadOS 17 を実行している iPhone または iPad では、Safari でプライベート ブラウズ タブを開いていて、再度アクセスするためにセッションまたはアプリを終了する場合、Apple のブラウザでは Face ID/Touch ID 認証またはパスコードが必要になります。言い換えれば、ロックが解除されている iPhone または iPad を誰かが手に入れても、パスコードを知らなければプライバシーを閲覧することはできません。

Win10/11 デジタル アクティベーション スクリプト MAS バージョン 2.2 がデジタル アクティベーションを再サポート Win10/11 デジタル アクティベーション スクリプト MAS バージョン 2.2 がデジタル アクティベーションを再サポート Oct 16, 2023 am 08:13 AM

有名なアクティベーション スクリプト MAS2.2 バージョンでは、デジタル アクティベーションが再びサポートされています。このメソッドは @asdcorp とそのチームが考案したもので、MAS 作成者はそれを HWID2 と呼んでいます。 https://github.com/massgravel/Microsoft-Activation-Scripts から Gatherosstate.exe (オリジナルではなく、変更されたもの) をダウンロードし、パラメータを指定して実行し、AuthenticTicket.xml を生成します。まず元のメソッド: Gatherosstate.exePfn=xxxxxxx;DownlevelOriginalState=1 を確認し、次に最新のメソッド: Gatheros と比較します。

Cookie はどこに保存されますか? Cookie はどこに保存されますか? Dec 20, 2023 pm 03:07 PM

Cookie は通常、ブラウザの Cookie フォルダに保存されます。ブラウザの Cookie ファイルは通常、バイナリ形式または SQLite 形式で保存されます。Cookie ファイルを直接開くと、文字化けしたり判読できないコンテンツが表示される可能性があるため、使用することをお勧めします。 Cookie を表示および管理するためにブラウザによって提供される Cookie 管理インターフェイス。

コンピューター上の Cookie はどこにありますか? コンピューター上の Cookie はどこにありますか? Dec 22, 2023 pm 03:46 PM

コンピュータ上の Cookie は、使用するブラウザとオペレーティング システムに応じて、ブラウザ上の特定の場所に保存されます。 1. Google Chrome、C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data\Default \Cookies に保存されます。等

See all articles