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

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

Jun 21, 2016 am 08:50 AM
nbsp php quot sql

前回は、コントローラーがデータをビューに転送する方法について説明しました。今日は主に、プログラム内のコードをより「安全」にする方法について説明します。その後、モデルについて説明します。続いてビューの作り方です。最後にコントローラーの機能拡張について説明します。

この記事は、私のスキルが限られているため、PHP フレームワークの作成についての基本的な理解を目的として書いているため、専門家はコメントしないでください。今は時間が限られているので、1記事書くのに2~3日かかることもありますが、1記事あたりの執筆時間は1時間以内に抑えて書いているので、多少の誤差はあるかもしれません。コードにはバグがたくさんあります、ごめんなさい! !

PHP 愛好家の方は、記事の最後に積極的に返信してください。このようなコミュニケーションは、私の PHP スキルを向上させるだけでなく、書き続ける勇気にもなります。ありがとうございます。 !

多くの人は、何も注意せずに PHP コードを作成します。多くの警告が発生すると、次のようなエラー報告を直接ブロックします。これは非常に大きな問題だと思います。 >

1

1

2 $a = $_GET['a'];

<テーブル>

2

1 echo $a;

$a = $_GET['a'];

<テーブル> 1

echo $a;

GET メソッドで渡されるパラメータに が含まれている場合、プログラムは非常に正常ですが、渡されない場合は警告がスローされます。 !

1

2 $a = isset($_GET['a']) ? $_GET['a'] : '';

私のアプローチは、まず error_reporting を E_STRICT に設定して、プログラムからの警告を禁止することです。 !

1 echo $a;
<🎜> このコードは次のように変更する必要がある場合があります: <🎜><🎜><🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>1<🎜><🎜> <🎜><🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>$a = isset($_GET['a']) ? $_GET['a'] : '';<🎜><🎜> <🎜> <🎜> <🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>1<🎜><🎜> <🎜><🎜>echo $a;<🎜><🎜>

この問題に加えて、PHP に特有の @ 記号もあり、多くの人がエラーをブロックするためにこれを使用することを好みますが、プロジェクトが大規模な場合、これを使用すると良いことよりも害が大きいと思います。 、エラーが発生します。このエラーはブロックされているため、このエラーの場所を見つけるのは非常に困難です。 !

例外処理に関しては、try catch はかなりのオーバーヘッドを伴いますが、プログラムの堅牢性のためには必要な try catch は必要だと個人的には考えています。

さて、ここまで言うと安全とは関係ないように思えますが、私にとってはそれらも「安全」の一環です。

ここで、10 日間かけて簡単なブログ システムを作成し、Wanwang から仮想ホストまたは VPS を購入し、ドメイン名を申請し、Web サイトを登録し、コードをデプロイしたとします。その後、ユーザーは www.test.com などのドメイン名を介してブログ システムにアクセスできるようになります。ブログ システムは非常に人気があり、短期間で多くの人気を集めました。しかし、ある日突然、Web サイトが何かに気付いたことがあります。急に調子が悪くなった、どうする?

オンラインで PHP 構成ファイルの error_reporting をオンにして、オンラインでデバッグしますか?

正直に言うと、私も以前にオンラインでブログ システムをデバッグしたことがあります。上記の状況と異なるのは、ブログの管理が面倒なため、ブログへのアクセス数が非常に少ないことです。

Web サイトへのアクセス数が多い場合、オンラインでデバッグすることは不可能です。では、どうすればよいでしょうか。

ログを記録します。Web サイトが失敗する前にログを書き込んでいる場合は、プログラムが失敗した後、ログ ファイルを開くだけで、失敗の場所を確認して修復できます。このままでOK! !

さて、私はあなたのクラスメートであり、私もあなたのブログシステムの開発に参加したと仮定します。しかし、私は少し前にあなたと少し衝突しました。私はあなたのブログを破壊したいと思っています。システムが落ちる、どうやって破壊するのか?

まず、データベースの名前が Test であるとします。このデータベースにはユーザー テーブルがあり、ブログ登録システムのコードは次のとおりです。

<テーブル>

01
01

02 $username = $_POST['username'];

03 $password = $_POST['password'];

<テーブル>

04 if(empty($username) empty($password)) {
<🎜>02<🎜><🎜> <🎜><🎜>$username = $_POST['username'];<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>03<🎜><🎜> <🎜><🎜>$password = $_POST['パスワード'];<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>04<🎜><🎜> <🎜><🎜>if(empty($username) empty($password)) {<🎜><🎜>

05 //跳转到注册界面并提示用户名或密码未填写

06 exit();

07 }

08 //连接数据库

09 //假设DB类封装了很多SQL操作,析构的时候自动关闭数据库连接,具体过程不写了

10 //$db是一个数据库DB类的实例,存在两个方法

11 //$db->isUsernameExists判定是否用户名是否存在

12 //$db->query 执行一条SQL语句

13 if(!$db->isUsernameExists($username)) {

14    $db->query("insert into user (username,password) values ('" . $username . "','" . $password. "')");

15    //设置session并跳转

16    exit();

17 } else {

18     //跳转到注册界面并提示用户名已存在

19     exit();

20 }

このコードには何か問題がありますか? 多くの PHP プログラマーは「SQL インジェクションが言いたいだけではないのですか?」と軽蔑するでしょう。

確かに、これは SQL インジェクションの問題です。この問題はすでに非常に古くから知られているようですが、なぜ私がまだそれについて話すのでしょうか。

これは、以前に学校の後輩が書いた PHP プロジェクトをいくつか見たことがありますが、彼らは基本的にこの問題を考慮していませんでした。もちろん、オンライン SQL に従っている場合です。注入方法を試してみると、PHP がこの問題を自動的に解決してくれたように見えます。実際、それを解決するには、特殊文字の前にバックスラッシュを追加します。

まず、SQL インジェクションが失敗した理由について話しましょう。 php.ini で自動エスケープが設定されている場合、PHP はデータを DB に挿入する前にデータをエスケープします。

この問題について考える必要はないようですが、実際には PHP がこれを実行してくれるため、プログラムを別の Linux サーバーに転送すると、その上で PHP が実行されることになります。サーバー .ini 設定ファイルが自動的にエスケープされないように設定されている場合、プログラムに突然大きな問題が発生することになります。コードのセキュリティをサーバー設定に依存すべきではありません。では、どうやってこれを実現するのでしょうか?

幸いなことに、PHP には特殊文字をエスケープする addlashes 関数がすでにありますが、残念なことに、PHP マニュアルを見ると、次のことがわかりました。

デフォルトでは、PHP 命令 magic_quotes_gpc がオンになっており、主にすべての GET、POST、COOKIE データに対してaddlashes() が自動的に実行されます。二重エスケープになるため、magic_quotes_gpc によってエスケープされた文字列に対して addslashes() を使用しないでください。この状況が発生した場合は、関数 get_magic_quotes_gpc() を使用して

を検出できます。

では、どうすればよいでしょうか? 幸いなことに、PHP には、magic_quotes_gpc がオンになっているかどうかを判断する get_magic_quotes_gpc 関数が用意されているので、次のような addlashes 関数をカスタマイズできます。

1

1

2 function myAddslashes($str) { <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>関数 myAddslashes($str) {<🎜><🎜>

3 if(get_magic_quotes_gpc()){

4 return addslashes($str);

5 }

6 }

実は、この問題を解決する別の方法があります:

1. PDO を使用して DB にアクセスします。PDO で PDOStatement->bindParam を使用すると、PDO がこれらすべてを自動的に実行します。個人的には、PDO は非常に有望だと思います。 !

2. get_magic_quotes_gpc がオンの場合、最初にstripslashesを呼び出してエスケープ文字を削除し、データベースに挿入する前にmysql_real_escape_stringを使用します。個人的には、この方法の方が最初の方法よりも信頼性が高いと思います。 !

もちろん、ここまで言うと SQL インジェクションが何なのか知らない子もいるかもしれませんが、SQL インジェクションのプロセスについて簡単に説明します。SQL インジェクションに慣れている人はそのまま通過できます。このセクション。

上記の例によれば、ユーザーがパスワードフィールドに入力した値が a');drop table user;... であると仮定すると、SQL を実行するときの SQL ステートメントは次のようになります:

ユーザー (ユーザー名,パスワード) 値に挿入 ('ユーザー名','a');ドロップ テーブル ユーザー;...')

この SQL は、まずユーザー テーブルにレコードを挿入し、次にテーブル全体を削除します。 。 。 。 SQL で問題が発生しました。

しかし、SQL にエラーがあるかどうかに関係なく、10,000 人のメンバーがいるブログの場合、ユーザー テーブルが失われるのはかなり大きいと思います。また、データベースに接続するユーザーの権限を変更すると、テーブルを削除できなくなりますが、これは永続的な解決策ではありません。SQL インジェクションの脆弱性を解決する方が確実です。

さて、SQL インジェクションの話は終わったので、XSS (クロスサイト スクリプティングの脆弱性) の問題について話しましょう。

PHP スクリプトがあります:

1

1

2 echo $_GET['a'];
<🎜><🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>エコー $_GET['a'];<🎜><🎜>

コードに問題があると述べましたが、上記のように警告がスローされる場合がありますが、犯罪者がパラメータを渡すときに使用すると、この問題はさらに深刻になります。

ここで、このスクリプトにアクセスするための URL が http://localhost/test.php?a=a であると仮定します。パラメータ a の値を a に設定します。これを渡すのは問題ありません。ですが、これを変更して URL が

になったとします。

http://localhost/test.php?a=<script>location.href="http://www.tmall.com"</script>、スクリプトが実行されるとジャンプ天猫のホームページへ、なんて怖いのでしょう! !

これが Tmall にジャンプせず、ハッカーが設定した URL にジャンプした場合、ハッカーはあなたの Cookie 情報を取得し、Cookie を偽造してあなたの ID ブログ システムにログインできる可能性があります。 。 。 。あなたが知っている。

この問題を解決する方法も非常に簡単で、文字列をエスケープするだけです。実際、このメソッドを呼び出した後はスクリプトを実行できません。スクリプトを実行するにはどうすればよいでしょうか? 使用方法の詳細については、マニュアルを参照してください。

この問題を解決した後、別の問題について説明します。これは CSRF (クロスサイト リクエスト フォージェリの脆弱性) です。 ! !

ここで、メッセージの内容がリッチ テキストであると仮定します。絵文字の HTML コードは です。ユーザーが入力したと仮定します。この式は、提供されたリッチ テキスト エディターを通じて作成されており、問題はありません。しかし、これを使用せずに、img タグを使用して別のことを実行した場合はどうなるでしょうか。

どうやって行うのですか?とても簡単で、img タグの src 属性を変更するだけです:

メッセージを送信した後、画像が表示できないことがわかりました。しかし、これはまったく合法的な画像リンクではありません。ユーザーがこのメッセージ ページを開くたびに、実際に www.tmall.com にアクセスすることになります。この URL がハッカーの URL に変更されると、結果がわかります。 。 。

実はこの他にもファイルのアップロードなどの抜け穴がありますが、時間の関係でここでは触れません。

私がこれについて話しているのは、セキュリティの問題が実際には非常に重要であり、実際にはプログラミング時に考慮しなければならないことがたくさんあることを説明するためです。

本来なら今日はフレームワークでこれらの問題をどう解決するかについて話すつもりでしたが、予想通り1時間以上かかってしまったので次回にお話します。



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

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:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

See all articles