質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

952閲覧

PHPの投稿ページの必要最低のセキュリティ対策について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/04/20 06:52

編集2018/04/21 06:31

初心者です。

PHPで投稿できるページを見よう見まねで作ってみたのですがセキュリティー対策について何に気をつければいいのかまだわかりません。

初心者の範囲でやっておくべき対策が知りたいです。

特殊文字エスケープ、https化、空でデータベースに接続しない、空入力はエラー表示、sqlインジェクション対策、<input> タグのaccept="audio/mpeg"属性指定、CSRF対策はやってみたのですが他にも気をつけるべき点が知りたいです。

PHP

1 2<?php 3 4//今回はセッションをセキュリティ対策で使用する 5session_start(); 6 7// 投稿画面 8 9/* 10* HTML特殊文字をエスケープする関数 11*/ 12function h($str) { 13 14 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 15 16} 17 18 19// デバッグ(開発)時は必ず記述する 20ini_set('display_errors', true); 21 22error_reporting(E_ALL); 23 24//入力内容再表示のため初期値を持っておく 25$title = ""; 26$body_text = ""; 27$image = ""; 28$audio = ""; 29$token = ""; 30 31// token使って重複防止(CSRF対策) 32$token = (string)filter_input(INPUT_POST, 'token'); 33 34// エラーメッセージ初期化 35$errors = array(); 36 37// POSTされたら空かチェックする 38if($_SERVER["REQUEST_METHOD"] === "POST"){ 39 40 if(isset($_POST['submit']) && $_POST['submit'] && $_POST['submit'] && $_POST['submit'] ==="確認"){ 41 42 // タイトルと本文の特殊文字をエスケープ 43 $title = h($_POST['title']); 44 45 $body_text = h($_POST['body_text']); 46 47 if (!empty($_POST["image"])) { 48 49 $image = h($_POST['image']); 50 51 if (!empty($_POST["audio"])) { 52 53 $audio = h($_POST['audio']); 54 55 } 56 57 } 58 59 if($title === ""){ 60 $errors['title'] = "タイトルが入力されていません。"; 61 } 62 63 if($body_text === ""){ 64 $errors['body_text'] = "本文が入力されていません。"; 65 } 66 67 if($image === ""){ 68 $errors['image'] = "画像が選択されていません。画像はjpeg形式のみになります"; 69 } 70 71 if($audio === ""){ 72 $errors['audio'] = "音声が選択されていません。"; 73 } 74 75if($token === ""){ 76 $errors['token'] = "もう一度やり直してください。"; 77 } 78 79 } 80 81 //エラーがなかったら該当チェック開始 82 if(count($errors) == 0){ 83 84 // POSTが空かどうか判断する 85 if (!empty($_POST['title']) && !empty($_POST['body_text']) && !empty($_POST['image']) && !empty($_POST['audio'])) { 86 87 // データベース情報 88 89 var_dump($title); 90 echo '</br>'; 91 var_dump($body_text); 92 echo '</br>'; 93 var_dump($image); 94 echo '</br>'; 95 var_dump($audio); 96 echo '</br>'; 97 98 echo "タイトル、本文、画像、音声成功データベース格納完了しました!"; 99 } 100 101 102 } 103 104} 105 106?> 107 108<!DOCTYPE html> 109<html> 110<head> 111 <title>投稿画面</title> 112</head> 113<body> 114 115 <?php if (0 < count($errors)): ?> 116 <?php foreach ($errors as $message) : ?> 117 <p style="color: red;"><?= h($message) ;?> </p> 118 <?php endforeach; ?> 119 120 <?php endif; ?> 121 122 <h1>投稿画面</h1> 123 124 <form action = "" method = "POST" enctype="multipart/form-data"> 125 126 <p>タイトル<br></p> 127 <input type="text" name="title"> 128 <br> 129 130 <p>本文<br></p> 131 <input type="text" name="body_text"> 132 <br> 133 134 <p>音声<br></p> 135 <input type="file" accept="audio/mpeg" name="audio"> 136 <br> 137 138 <p>画像<br></p> 139 <input type="file" accept="image/jpeg" name="image"> 140 <br> 141 <br> 142 143 <input type="submit" name = "submit" value="確認"> 144 145 <!--$tokenを使って重複を防止するタグを埋め込む--> 146 <input type="hidden" name="token" value="<?=h(sha1(session_id()))?>"> 147 148 </form> 149 150</body> 151</html> 152 153

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/20 06:59

セキュリティー対策に、初心者も上級者もないと思います。攻撃は常に全力でかかってきます。
退会済みユーザー

退会済みユーザー

2018/04/20 07:05

その為の対策が知りたいです。上記以外でできる対策というのは他に何があるのでしょうか。
guest

回答2

0

ベストアンサー

初心者であれば、まずはここから。といった資料です。
安全なウェブサイトの作り方

で、このへんでセキュアなコードの書き方の「雰囲気」をつかむ。
【PHP初心者向け】セキュアな掲示板を最小構成から作る

ただし、これって入り口なので、ちゃんとした解説書を入手して、体系的な学習をされることをオススメします。

実務では、セキュリティ要件を整理する必要があるので、この辺りも読んでください。
情報システムの構築等における
セキュリティ要件及びセキュリティ機能の
検討に関する解説書

投稿2018/04/20 07:13

編集2018/04/20 07:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/20 07:19

参考になります。ありがとうございます。
guest

0

セキュリティに関する事ではないですが、

<form action = "" method = "POST"> ↓ <form action="" method="POST" enctype="multipart/form-data">

画像アップロードの場合enctypeの設定がいるのでは?

投稿2018/04/20 06:58

DaisukeMori

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/20 07:04

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問