PHP7技術者認定初級試験の勉強方法 後編

PHP7技術者認定初級試験の勉強方法 後編


PHP7技術者認定初級試験に合格しましたので
その勉強方法等、これから受験する方に向けての記事です。
要点だけまとめましたので試験前にさらっと確認すると良いかと思います。

下記の公式問題集に沿って要点をまとめてみました。
今回は10章から13章になります。
下記のテキストをやり込めば合格は確実です。

1章から6章はこちらで解説しました。

7章から9章はこちらです。

  • 10.ユーザの記憶:クッキーとセッション

  • 11.他のWebサイトやサービスとのやり取り

  • 12.デバッグとテストと開発の心得

  • 13.一般的な処理や話題

10.ユーザの記憶:クッキーとセッション

  • Webページのログイン画面を開くと既にIDやパスワードが入力されている状態だったことがあるかと思います。
    これがクッキーと呼ばれる仕組みで成り立っています。
    まずログイン画面でIDを入力するとします。
    サーバは受け取ったIDを書き込んだクッキーをブラウザに送信します。
    そしてそのクッキーをブラウザで保存するのです。
    次にアクセスした時にクッキーの情報をサーバへ送ります。
    これによってサーバは同じ情報を再利用できます。

  • ブラウザに対してクッキーを発行して保存させるためにはsetcookie関数を用います。
    setcookie(クッキーの名前、保存する値、有効期限、パス、ドメイン、セキュア、httponly)
    有効期限を設定しなければ自動的に0が設定されブラウザを閉じた時に有効期限が切れます。
    有効期限を1時間に設定する場合、60秒×60分をtime()+60*60と指定します。
    クッキーの名前以外は省略可能です。
  • パス・・・setcookie(“name”,”taro”,0,”http://example.com/sample”);
    http://example.com/sample以下の場所にあるwebページを要求するときにクッキーが送られます。
    デフォルトまたはnullにてクッキーが発行された現在のディレクトリのみに送信されます。
  • ドメイン・・・デフォルトまたはnullにてクッキーが発行されたサーバのみに送信されます。
    example.comのように設定するとサブドメインアクセス時にも送信されます。
  • セキュア・・・trueにすることでhttps通信時のみクッキーを送ることができます。
  • httponly・・・trueにすることでJavaScriptによりクッキーを操作できないようにします。
    ※セキュア及びhttponlyはデフォルトではOffになりますので設定を忘れないようにしましょう。
  • setcookie関数に利用できる値は文字列または数字です。

setcookie関数の引数について詳しく勉強されたい方は下記がよろしいかと思います。

https://www.engilaboo.com/cookie-attribute-summary/

  • それではセッションについてです。
    サーバ側ではアクセスしてきたあなたを識別するためにセッションを使います。
    あなたがサイトのAページにアクセスした場合、セッションIDを発行し、クッキーに保存します。
    なたはBページに移動したとします。セッションIDをサーバへ送信することでAページにいたあなたとBページのあなたを同一であると判断します。
  • セッションIDはクッキーに保存されますが、その際PHPSESSIDという名前でIDが保存されています。
  • セッションを開始するにはsession_start()関数を用います。
    セッションIDを作成しPHPSESSIDの値にそれを設定します。
    その後ブラウザに返信します。
    2回目以降や、ページ遷移時にブラウザからPHPSESSIDを送信します。
    webサーバ側では一致するセッションIDのデータを送信します。
    ブラウザ側では$_SESSION配列によってそのデータを利用できます。

  • セッションを破棄するにはsession_destroy()関数を用います。
  • php.iniファイルにてsession.cookie_httponlyをonにすることでhttponly属性を設定できます。
  • php.iniファイルにてsession.cookie_sechあureをonにすることでsecure属性を設定できます。
  • setcookie関数やsession_start()関数はヘッダと言われる実データ(画面に表示されるデータ)以外の情報に情報を追加する関数であり、実データよりも前に記述する必要があります。

11.他のWebサイトやサービスとのやり取り

  • file_get_contents()関数はローカルファイル、リモートファイルの読み込みを行います。
    またURLを引数にすることでWebサイトの情報を取得することができます。
  • cURLはブラウザを利用しなくてもHTTPリクエストとレスポンスを行うことができます。
    基本的な使い方は
    ①$ch = curl_init(); cURLセッションを開始します。
    ②curl_setopt(セッション名, オプション名, 設定値); オプションを指定します。
    ③$info = curl_exec($ch); 情報を送信もしくは受信します。
    ④curl_close($ch); cURLセッションを終了します。

以下のようなphpファイルを作成して、そのファイルにブラウザからアクセスすると
設定値に指定したwebページが表示されます。
オプション名にCURLOPT_URL、 オプション名にhttps://www.yahoo.co.jpを設定します。


オプション名には他にも様々なものがあります。
例えばオプション名にCURLOPT_RETURNTRANSFER, オプション名にtrueを設定しますと、
curl_close()関数の戻り値を文字列で返します。
以下のように記述します。


結果です。
以下のように文字列で出力されます。

  • header()関数はhttpヘッダ(実データ以外)を送信する(サーバからクライアントへ送信する)ために用います。
    代表的な使い方はheader(‘Location: 遷移先のURL’)です。
    if文で未ログインでアクセスした場合等にログインページにリダイレクトさせます。

12.デバッグとテストと開発の心得

  • プログラム中の誤りを見つけて修正することをデバッグといいます。
    開発中はデバッグしやすくするためさまざまな設定をしますが、本番環境ではそれらの設定を解除します。
  • PHPの動作を決める設定を構成ディレクティブといいます。
    php.iniに記述します。
  • Webブラウザにエラーメッセージを表示するにはdisplay_errors構成ディレクティブをOnにします。
    本番環境ではエラーメッセージが表示されるとよろしくないのでOffにします。
  • Webサーバのエラーログにエラーを送信する場合、log_errors構成ディレクティブをOnにします。
    phpコードに記述する場合はerror_log()関数を用います。
  • PHPエラーの種類について学びます。
    Parse Error・・・構文上の問題がある。
    Fatal Error・・・内容に重大な問題がある。
    Warning・・・疑わしいi箇所がある。
    Notice・・・マナー違反
    Strict Notice・・・コーディングスタイルについて注意
    DEPRECATED・・・将来のバージョンで動作しなくなるコードを警告する。
  • 筆者の環境(PHP 7.4.29)にて
    Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
    となっており、これはNotice、Strict Notice、DEPRECATEDを除くすべてのエラーを表示する設定です。
    ※php.iniファイルに記述されています。
  • PHP対応エディタには変数などに色をつけるシンタックスハイライト機能や引用符、括弧を用いるとそれに対応する文字を強調表示する機能、行番号表示機能があります。
  • エラーメッセージからエラー行数が表示されますが、それが実際にエラーのある行とは限りません。
  • var_dump()関数にて配列の内容を表示することができます。
  • php付属のデバッガ(デバッグを支援するソフト)としてphpdbgがあります。
  • phpdbgにてデバッグを開始する場合、phpdbg -e test.phpと入力します。
  • 例外がキャッチされなかった場合に備えてset_exception_handler()関数を用いることで、例外ハンドラを設定することができます。

  • phpunitは単体テストを行うためのフレームワークです。
  • phpunitはcomposerと呼ばれるライブラリ管理ツールを用いてインストールすることができます。
  • プログラムが必ず満たすべき条件を確認する機能をアサーションと言います。

  • 機能実装のためのコードを書く前にその機能のテストを記述する開発手法をテスト駆動開発(テストファースト)といいます。
  • バージョン管理システムはファイルの変更管理を行います。
    Gitが有名です。
  • parse_ini_file()関数は下記のようなkey = value形式のファイルを連想配列に変換します。

サンプルコードは下記になります。

  • webブラウザでの表示が遅い場合、php動作以外にもDBとの通信の遅延、画像動画の読み込み等が関係しています。
  • プロファイラと呼ばれる解析ツールを利用することでphp固有の部分を高速にすることができます。
  • PDOはプリペアドステートメントをサポートしておりSQLインジェクション対策として有効です。
    中編でも解説しましたが再度詳細を記載します。
    ※PDOとはデータベース接続用のクラスになります。

ショッピングサイトで登録情報を確認したいとします。
大抵のサイトは下記のような個人情報の閲覧ページがあります。
個人IDを入力することで登録情報を閲覧できます。
※通常はパスワードの入力も必須ですが簡易的なものですのでご了承ください。

一般的には自身のIDを入力しますが、
悪意のあるユーザが以下のように入力するとします。
1000 or 1 = 1
すると以下のように出力されます。
登録されているすべてのユーザー情報が出力されてしまいました。
なぜこのようなことがおきるのでしょうか?



ソースコードをみてみましょう。
特に重要なのは30行目のユーザが直で入力した値が$idに格納されています。
その$idが直でSQL文に挿入されている点です。33行目。
そのため1000 or 1 = 1がそのまま挿入されて
select * from person where ID = 1000 or 1 = 1が実行されています。
whereというのは条件です。
つまりIDが1000もしくは 1 と 1 が等しいものという条件を指定しているのです。
1 と 1 が等しいというのは未来永劫変わらない事実ですのですべて真となりますので
すべての行が出力されてしまいます。



このように不正にDBを操作して意図しない情報を表示したりすることを
SQLインジェクションといいます。
こうした不正を防ぐためにプリペアドステートメントがあります。
ようやく本題ですね。
お疲れ様です。

プリペアドステートメントを利用する前が
コメントアウトした33行目~35行目になります。
プリペアドステートメントを使用した37行目と41行目です。
ユーザが入力した値を直でwhereに挿入するのではなく、? としています。
? に入力したい値を配列にしておきます。39行目。
※ ? をプレースホルダといいます。
query()でなくprepare()メソッドを利用します。
プレースホルダを利用するためです。
40行目のexecute()メソッドによってプレースホルダに代入すべき値を指定します。
= のようなPG中で利用する特殊文字をただの文字として扱ってくれます。
エスケープ処理といいます。
DBに対する出力だけでなく、入力をフィルタリングすることもセキュリティ対策には重要です。


以上の処理の流れをプリペアドステートメントと呼びます。
テスト対策でも重要ですが、
実務において非常に大切ですので詳しく解説致しました。
1000 or 1 = 1と入力してみましょう。
何も表示されませんね。

  • WAFとはセキュリティの一種で、パケットの中身を確認することができます。
    webシステムの攻撃を防ぐにはファイアウォールと呼ばれる特定のIPやポート番号のみを許可するものがあります。
    しかしながらIPやポート番号のみでは防ぎきれないためIDS、IPSと呼ばれる対策方法があります。
    これは不正通信(Dos攻撃)を防ぐことができます。
    ただこれだけではSQLインジェクションやクロスサイトスクリプティングのような一見正常に見える攻撃を防ぐことができません。
    そのためWAFにて中身をチェックし悪意性のある通信を遮断します。
  • クロスサイトスクリプティングとは
    webサイトがユーザからのあらゆる入力を、なんの処理もせずにそのままブラウザに表示してしまう脆弱性をついた攻撃です。
    ユーザからHTMLやJavaScriptが入力された場合も表示されてしまうため、攻撃者はあらゆる悪意のあるスクリプトを記述することができてしまいます。

13.一般的な処理や話題

  • タイムゾーン
    同じ標準時を用いる地域、区分をいいます。
    PHPではデフォルトでUTC(協定世界時間)が設定されます。
    スクリプト内でdate_default_timezone_set()関数で設定することができます。
  • DateTimeクラスを用いれば日付や時刻を表現できます。
    format()メソッドによって以下のように出力されます。
  • modify()メソッドでは日付を調整します。
  • diff()メソッドは2つの日付の差を返します。
  • setDate()メソッドは別の日付に設定します
  • format()メソッドでは多様な出力が可能です。
    Yは年を4桁、Mは月名、Dは曜日で出力されます。
  • composerとはパッケージ管理システムで既存のライブラリをインターネット上から探し出すことができます。
  • composerで入手したライブラリを活用するにはcomposer.jsonファイルにrequire “vendor/autoload.php”と記述します。
  • Packagistと言われるインストール可能な一覧リストを示すwebサイトがあります。

  • Swift_SmtpTransportをnewすることでSMTPサーバ設定を行います。
    Swift_Mailerをnewすることでメーラーを設定します。
    Swift_Messageをnewすることでメッセージを作成できます。
    setFrom()メソッドで送信元、setTo()メソッドで宛先、setSubject()メソッドで件名、setBody()メソッドでメール本文、send()メソッドで送信を設定します。

  • 日本語のようなマルチバイト文字を扱うには下記の関数を用います。


お疲れ様でした。
以上になります。
本記事は下記テキストを参考に分かりづらい箇所を中心に解説致しました。
本記事では載せていませんが下記テキストの最後に総合問題がありますので
是非チャレンジしてみてください。