withアプリーチPHPでプログラムを作成する中で1番大事になってくるのがセキュリティです。PHPではユーザーから入力された値を元にデータベースに格納したり、メールを送ったり、webサイトを変更したりとできることは多岐にわたりますよね。その際に適切なセキュリティ対策をしておかないと大変なことになってしまいます。今回は主な攻撃とセキュリティ対策の実際のコードをまとめていきます。Scripting)とはユーザから入力された値によって情報が盗まれたり、勝手にリダイレクトされたりと言った作り手が許可していない挙動を引き起こさせることです。このようなコードは危険とされています。$_GETはURLの末尾経由で情報を譲渡できます。入力するとjavascriptが実行されポップアップが表示されてしまいます。URL:【https://www.○○○.com?test=<script>alert("JavaScriptを実行しています");</script>】//このURLを直接指定すると。?>//(⇧)このコードがGET['test']の値(⇩)に切り替わり実行されてしまう<script>alert("JavaScriptを実行しています");</script>これはユーザから入力された値を実際のコードとして認識してしまっているためにおこる挙動です。これを防ぐためには適切なエスケープ処理が必要になってきます。エスケープ処理とは入力された値をただの文字列として認識させたりコードの一部として認識しやすい「>」や「""」などを置換したり、削除したりすることを指します。実際のコードをみていきましょう。クロスサイトスクリプティングの対策コードXSS対策として有効なのはhtmlspecialchars関数です。htmlspecialchars関数はHTMLファイルにおいて特殊な意味をもつ「>」や「""」などを文字列に変換する関数です。実際に使用例をみてみましょう。?>//表示されるのはコードではなく文字列としての"<script>alert("JavaScriptを実行しています");</script>"メールヘッダインジェクション続いてはメールヘッダインジェクションについてです。PHPではmb_send_mail関数を使うことで実際にメールを送信することができます。お問い合わせフォームや本人確認メールなどはPHPで作られています。関連記事:【自作】PHPでお問い合わせフォームを作ろう!コードと仕組みを徹底解説!mb_send_mail関数の引数mb_send_mail(宛先,件名,内容,ヘッダ情報(ヘッダ名:値))mb_send_mail関数では引数にメールを送信するにあたって必要な情報を渡してあげます。その中でも送信先のメールアドレスを引数として渡す際に正しいエスケープ処理をしないと勝手に違うメールアドレスに送られてしまうなどの被害が出てしまうことがあるのです。メールを送信するmb_send_mail関数は引数ヘッダ情報に値をセットするときヘッダ名:値と記述します。ヘッダ名2:値2のように「\n(改行コード)」で羅列していく方法になります。そのため入力値に「\n」のエスケープ処理をしていないと自由にヘッダ情報を追加することができてしまうのです。【ame@email.com】にも送信されてしまいますメールヘッダインジェクションの対策コードメールヘッダインジェクションを防ぐにはstr_replace関数を使います。str_replace関数は対象文字列の中から検索文字列を探し出し、指定した文字に変換する関数ですこの関数を使って入力値の中に含まれる改行コード("\r","\n")を置換してしまえば対策完了です。悪意ある改行コードを空白に変換することで実行させない?>このほかにも入力されたメールアドレスを正規表現を駆使して使える文字を制限してしまうのも効果的です。関連記事:【PHP】正規表現(PCRE関数)の使い方!チェックや置換するメソッドを解説!SQLインジェクションSQLとはデータベース(以下DB)を操作するプログラミング言語です。PHPの中でもSQLを使うことができるのでDBを操作することが可能です。PHPでは入力された情報をDBに登録する新規会員登録システムやDBに登録された情報を元にログイン制御するログイン機能など、DBに値を挿入したり、取得したり、はたまた削除したりと何かと絡むことが多いです。SQLインジェクションとはDB操作を実行するSQL文に入力値を絡めるときに悪意あるコードを埋め込まれてDBのデータを不正に操作されてしまう攻撃です。注意すべきことは入力値をそのままSQL文に組み込まないということです。SQLインジェクションの対策コードSQLインジェクションの対策はDB操作にPDOを使っていると楽です。Objects)とは「データベース抽象型レイヤ」の1つです。データベース抽象型レイヤとはDB操作を1つのオブジェクトとして扱い、種類がたくさんあるDBの差異を吸収し共通したコードで操作できるようになります。異なるDBに変更されてもコードを変えなくても使えるようにするのがPDOの役割です。SQL文に入力値を入れ込む場合はPDOの機能:プレイスホルダを使うと便利です。プレイスホルダとは値を入れ込むところを一旦別の文字にしておき、後から挿入する場所のことを指します。PDOではプレイスホルダが「?」と「:名称(例:name)」の2パターンの方法が用意されています。このプレイスホルダを使うことで使用した入力値に対して自動でエスケープ処理を施してくれます。:str_replace関数、正規表現まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。ご覧いただきありがとうございました。友達や家族の誕生日を登録しておくと当日に通知が届きお知らせしてくれるiOSアプリです。貸し借り管理アプリお金の貸し借りを管理するためのアプリです。貸借の色が分かれているので識別しやすく、使いやすさを求めてできるだけシンプルなUIにしています。カシホン人に貸すことが多く、誰に貸したか忘れがちな本の貸し借りを記録できるアプリです。