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

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

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

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

Q&A

解決済

1回答

1916閲覧

phpプログラムの安全性、パフォーマンスについて

nosonosolife

総合スコア42

PHP

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

0グッド

2クリップ

投稿2016/06/19 20:45

現在phpで掲示板スクリプトを制作しているのですが、
プログラムのセキュリティー面での対策や、処理速度などのパフォーマンス等について
修正したほうがいい部分などがあればご提示いただきたいと思っております。

以下、PHPコードです。

【書き込み投稿画面】

php

1<?php 2//接続文字列 3$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8'; 4$user = 'ユーザー名'; 5$password = 'パスワード'; 6 7try { 8$pdo = new PDO($dsn, $user, $password); 9$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 10 11mb_language("uni"); 12mb_internal_encoding("utf-8"); //内部文字コードを変更 13mb_http_input("auto"); 14mb_http_output("utf-8"); 15 16date_default_timezone_set('Asia/Tokyo'); 17 18$Date = date("Y/m/d D H:i:s"); 19$Name = htmlspecialchars($_POST["Name"]); 20$Title = htmlspecialchars($_POST["Title"]); 21$Message = htmlspecialchars($_POST["Message"]); 22$Message = str_replace(array('\r\n','\r','\n'), '\n', $Message); 23 24$stmt = $pdo->query("SET NAMES utf8;"); // この記述が必要 25$stmt = $pdo -> prepare("INSERT INTO bbs_data (user_date, user_name, user_title, user_mes) VALUES (:date, :name, :title, :mes)"); 26$stmt->bindParam(':date', $Date, PDO::PARAM_INT); 27$stmt->bindValue(':name', $Name, PDO::PARAM_STR); 28$stmt->bindValue(':title', $Title, PDO::PARAM_STR); 29$stmt->bindValue(':mes', $Message, PDO::PARAM_STR); 30$stmt->execute(); 31header('Location: ./sendok.html'); 32exit; 33} 34catch (PDOException $e) 35{ 36 //例外処理 37 die('Error:' . $e->getMessage()); 38 header('Location: ./senderror.html'); 39} 40?>

【書き込み表示画面】

php

1<?php 2//接続文字列 3$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8'; 4$user = 'ユーザー名'; 5$password = 'パスワード'; 6 7try { 8$pdo = new PDO($dsn, $user, $password); 9$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 10 11mb_language("uni"); 12mb_internal_encoding("utf-8"); //内部文字コードを変更 13mb_http_input("auto"); 14mb_http_output("utf-8"); 15 16$userData = null; 17 18$page = empty($_GET["page"])? 1:$_GET["page"];//ページ番号 19$pagemax = 100;//1ページあたりの表示数 20 21$start = ($page == 1)? 0 : ($page-1) * $pagemax; 22 23// 全レコード数を取るSQL 24$sql = "select count(*) from bbs_data"; 25$result = $pdo->query($sql); 26$count = $result->fetchColumn(); 27$count = intval($count, 10); 28$limit = ceil($count/$pagemax);//最大ページ数 29 30//datasテーブルから日付の降順でデータを取得 31$sql = "select * from bbs_data ORDER BY user_date DESC limit ".$start.",".$pagemax; 32$result = $pdo->query($sql); 33 34while ($row = $result->fetchObject()){ 35 $userData[]=array( 36 'id' => $row->user_id 37 ,'date' => $row->user_date 38 ,'name' => $row->user_name 39 ,'title' => $row->user_title 40 ,'message' => $row->user_mes 41 ); 42} 43 44function paging($limit, $page, $disp=10){ 45 //$dispはページ番号の表示数 46 $next = $page+1; 47 $prev = $page-1; 48 49 //ページ番号リンク用 50 $start = ($page-floor($disp/2) > 0) ? ($page-floor($disp/2)) : 1;//始点 51 $end = ($start > 1) ? ($page+floor($disp/2)) : $disp;//終点 52 $start = ($limit < $end)? $start-($end-$limit):$start;//始点再計算 53 54 if($page != 1 ) { 55 //最初のページへのリンク 56 if($start >= floor($disp/2)){ 57 print '<li><a href="?page=1">1</a></li>'; 58 } 59 } 60 61 if($limit > 0 ) { 62 if($page != 1 ) { 63 print '<li><a href="?page='.$prev.'">&laquo; 前へ</a></li>'; 64 }else{ 65 print '<li><span>&laquo; 前へ</span></li>'; 66 } 67 } 68 69 for($i=$start; $i <= $end ; $i++){//ページリンク表示ループ 70 if($i <= $limit && $i > 0 ){//1以上最大ページ数以下の場合 71 if($page == $i){ 72 print '<li><span>'.$i.'</span></li>';//ページ番号リンク表示 73 }else{ 74 print '<li><a href="?page='.$i.'">'.$i.'</a></li>';//ページ番号リンク表示 75 } 76 } 77 } 78 79 if($limit > 0 ) { 80 if($page < $limit){ 81 print '<li><a href="?page='.$next.'">次へ &raquo;</a></li>'; 82 }else{ 83 print '<li><span>次へ &raquo;</span></li>'; 84 } 85 } 86 87 if($page != $limit ) { 88 //最後のページへのリンク 89 if($limit > $end){ 90 print '<li><a href="?page='.$limit.'">'.$limit.'</a></li>'; 91 } 92 } 93} 94require './template/index_temp.php'; 95exit; 96} 97catch (PDOException $e) 98{ 99 //例外処理 100 die('Error:' . $e->getMessage()); 101} 102?>

【書き込み検索画面】

php

1<?php 2//接続文字列 3$dsn = 'mysql:host=ホスト名;dbname=データベース名;charset=utf8'; 4$user = 'ユーザー名'; 5$password = 'パスワード'; 6 7try { 8$pdo = new PDO($dsn, $user, $password); 9$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 10 11mb_language("uni"); 12mb_internal_encoding("utf-8"); //内部文字コードを変更 13mb_http_input("auto"); 14mb_http_output("utf-8"); 15 16$searchword = empty($_GET["searchword"])? null:$_GET["searchword"];//検索ワード 17 18$searchData = null; 19 20$page = empty($_GET["page"])? 1:$_GET["page"];//ページ番号 21$pagemax = 100;//1ページあたりの表示数 22 23$start = ($page == 1)? 0 : ($page-1) * $pagemax; 24$end = ($page * $pagemax); 25 26// 全レコード数を取るSQL 27$sql = "select count(*) from bbs_data where (user_name like '%$searchword%') or (user_title like '%$searchword%') or (user_mes like '%$searchword%')"; 28$result = $pdo->query($sql); 29$count = $result->fetchColumn(); 30$count = intval($count, 10); 31$limit = ceil($count/$pagemax);//最大ページ数 32 33//datasテーブルから日付の降順でデータを取得 34$sql = "select * from bbs_data where (user_name like '%$searchword%') or (user_title like '%$searchword%') or (user_mes like '%$searchword%') ORDER BY user_date DESC limit ".$start.",".$pagemax; 35$result = $pdo->query($sql); 36 37while ($row = $result->fetchObject()){ 38 $searchData[]=array( 39 'id' => $row->user_id 40 ,'date' => $row->user_date 41 ,'name' => $row->user_name 42 ,'title' => $row->user_title 43 ,'message' => $row->user_mes 44 ); 45} 46 47function paging($limit, $page, $disp=10){ 48 //$dispはページ番号の表示数 49 $next = $page+1; 50 $prev = $page-1; 51 52 //ページ番号リンク用 53 $start = ($page-floor($disp/2) > 0) ? ($page-floor($disp/2)) : 1;//始点 54 $end = ($start > 1) ? ($page+floor($disp/2)) : $disp;//終点 55 $start = ($limit < $end)? $start-($end-$limit):$start;//始点再計算 56 57 if($page != 1 ) { 58 //最初のページへのリンク 59 if($start >= floor($disp/2)){ 60 print '<li><a href="?page=1">1</a></li>'; 61 } 62 } 63 64 if($limit > 0 ) { 65 if($page != 1 ) { 66 print '<li><a href="?page='.$prev.'">&laquo; 前へ</a></li>'; 67 }else{ 68 print '<li><span>&laquo; 前へ</span></li>'; 69 } 70 } 71 72 for($i=$start; $i <= $end ; $i++){//ページリンク表示ループ 73 if($i <= $limit && $i > 0 ){//1以上最大ページ数以下の場合 74 if($page == $i){ 75 print '<li><span>'.$i.'</span></li>';//ページ番号リンク表示 76 }else{ 77 print '<li><a href="?page='.$i.'">'.$i.'</a></li>';//ページ番号リンク表示 78 } 79 } 80 } 81 82 if($limit > 0 ) { 83 if($page < $limit){ 84 print '<li><a href="?page='.$next.'">次へ &raquo;</a></li>'; 85 }else{ 86 print '<li><span>次へ &raquo;</span></li>'; 87 } 88 } 89 90 if($page != $limit ) { 91 //最後のページへのリンク 92 if($limit > $end){ 93 print '<li><a href="?page='.$limit.'">'.$limit.'</a></li>'; 94 } 95 } 96} 97require './template/search_temp.php'; 98exit; 99} 100catch (PDOException $e) 101{ 102 //例外処理 103 die('Error:' . $e->getMessage()); 104} 105?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

に、セキュリティ実装の実施状況を確認するためのチェックリスト があります。
この項目の内容を理解し、チェックをしてみては如何でしょう。

または、セキュリテーチェックをするツールを利用する手もあります。
例:

パフォーマンスについては、
想定しているデータの最大量のデータを用意し、実際に操作をしみることが必要とおもいます。

あるいは、ソースコードレビューを teratail でしてもらうことを期待してますか?

投稿2016/06/19 22:37

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問