初心者です。
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
セキュリティー対策に、初心者も上級者もないと思います。攻撃は常に全力でかかってきます。
その為の対策が知りたいです。上記以外でできる対策というのは他に何があるのでしょうか。
回答2件
あなたの回答
tips
プレビュー