PHP7技術者認定初級試験に合格しましたので
その勉強方法等、これから受験する方に向けての記事です。
要点だけまとめましたので試験前にさらっと確認すると良いかと思います。
下記の公式問題集に沿って要点をまとめてみました。
今回は10章から13章になります。
下記のテキストをやり込めば合格は確実です。
setcookie関数の引数について詳しく勉強されたい方は下記がよろしいかと思います。
https://www.engilaboo.com/cookie-attribute-summary/
以下のようなphpファイルを作成して、そのファイルにブラウザからアクセスすると
設定値に指定したwebページが表示されます。
オプション名にCURLOPT_URL、 オプション名にhttps://www.yahoo.co.jpを設定します。
オプション名には他にも様々なものがあります。
例えばオプション名にCURLOPT_RETURNTRANSFER, オプション名にtrueを設定しますと、
curl_close()関数の戻り値を文字列で返します。
以下のように記述します。
結果です。
以下のように文字列で出力されます。
サンプルコードは下記になります。
ショッピングサイトで登録情報を確認したいとします。
大抵のサイトは下記のような個人情報の閲覧ページがあります。
個人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と入力してみましょう。
何も表示されませんね。
お疲れ様でした。
以上になります。
本記事は下記テキストを参考に分かりづらい箇所を中心に解説致しました。
本記事では載せていませんが下記テキストの最後に総合問題がありますので
是非チャレンジしてみてください。