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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

4回答

11499閲覧

PHP データベースエラーが出る! ( mysql_result() )

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2016/09/06 15:54

編集2016/09/07 06:07
/* (^_^) ERRORS (>_<) */ Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in bbs.php on line 7 Warning: mysql_result() expects parameter 1 to be resource, boolean given in bbs.php on line 36 // これ Warning: Cannot modify header information - headers already sent by (output started at bbs.php:7) in bbs.php on line 48 Warning: Cannot modify header information - headers already sent by (output started at bbs.php:7) in bbs.php on line 49 Warning: Cannot modify header information - headers already sent by (output started at bbs.php:7) in bbs.php on line 52

PHP

1<?php 2/* version 5.6.10*/ 3 // MySQL接続部分 4 $conn = mysql_connect('localhost:8888', 'example', 'example'); 5 mysql_select_db('example', $conn); 6 mysql_query('SET NAMES ujis', $conn); 7 8 // 投稿処理 9 if ( !empty($_POST["dopost"]) && !empty($_POST["name"]) ) { 10 // クエリがエラーになったら、テーブルが存在しないと見て新規作成 11 if ( !mysql_query( "SELECT cout(*) FROM bbs ", $conn) ) { 12 mysql_query( "CREATE TABLE bbs 13 ( 14 id INT UNSIGNED NOT NULL AUTO_INCREMENT, 15 name VARCHAR(255) NOT NULL default '', 16 title VARCHAR(255) NOT NULL default '', 17 body TEXT, 18 pass VARCHAR(255) NOT NULL default '', 19 postdate DATETIME NOT NULL, 20 PRIMARY KEY (id) 21 ) TYPE=MyISAM" , $conn); 22 } 23 24 // パスワードが指定されていなければ、クッキーのパスワードで上書きする 25 if ( empty($_POST["pass"]) && !empty($_COOKIE["pass"]) ) { 26 $_POST["pass"] = $_COOKIE["pass"]; 27 } 28 29 // 名前とパスワードの一致を確認 30 $sql = "SELECT COUNT(*) FROM bbs WHERE name = '" . $_POST["name"] . "' AND pass<>'" . $_POST["pass"] . "'"; 31 $rs = mysql_query($sql, $conn); 32 33 if ( mysql_result($rs, 0, 0) ) { 34 // 同じ名前で、パスワードの異なるレコードがあれば受付拒否 35 header( "Location: http://" . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] . '?message=' . urlencode('その名前は既に使われています') ); 36 exit; 37 } 38 39 // 投稿内容をデータベースへ書き込む 40 $sql = "INSERT INTO bbs SET name='" . $_POST["name"] . "', title='" . $_POST["title"] . "', body='" . $_POST["body"] . 41 "', pass='" . $_POST["pass"] . "', postdate=NOW()"; 42 mysql_query($sql, $conn); 43 44 // 次回の投稿・管理用に、クッキーに名前とパスワードを保存する 45 setcookie( 'name', $_POST["name"], time()+60*60*24*30 ); 46 setcookie( 'pass', $_POST["pass"], time()+60*60*24+30 ); 47 48 // 投稿したらリダイレクト 49 header( "Location: http//" . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] . '?message=' . urlencode('登録しました') ); 50 exit; 51} 52 53// メッセージ削除処理 54if ( !empty($_POST['delete']) ) { 55 // パスワードが指定されていなければ、クッキーのパスワードで上書きする 56 if ( empty($_POST["pass"]) && !empty($_COOKIE["pass"]) ) { 57 $_POST["pass"] = $_COOKIE["pass"]; 58 } 59 60 // idとパスワードが一致したら、削除 61 $sql = "DELETENFROM bbs WHERE id=" . $_POST["id"] . "AND pass='" . $_POST["pass"] . "'LIMIT 1"; 62 mysql_query($sql, $conn); 63 $message = mysql_affected_rows ? "削除しました" : "パスワードが違います"; 64 65 // 削除したらリダイレクト 66 header( "Location: http://" . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] . "?message=" . urlencode($message) ); 67 exit; 68} 69 70// キャラクーセットの指定 71header( "Content-Type: text/html; charset=EUC-JP" ); 72 73// HTML開始部 74echo '<!DOCTYPE html><html lang="ja"><head><meta http-equiv="Content-Type: text/html; charset=EUC-JP" /><title>脆弱性だらけの掲示板</title></head><body>'; 75 76// メッセージがあれば表示 77if ( !empty($_GET['message']) ) { 78 echo '<p style="color:red;">' . $_GET['message'] . '</p>'; 79} 80 81// フォーム描画処理 82echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">'; 83 84echo '名前 : <input type="text" name="name" value="' . @$_COOKIE['name'] . '" /><br />'; 85echo '題名 : <input type="text" name="title" /><br />'; 86echo '内容 : <br /> <textarea name="body" rows="4" cols="40"></textarea><br />'; 87echo 'パスワード : <input type="password" name="pass" size="8" value="" /><br /><br />'; 88echo '<input type="submit" name="dopost" value="投稿" />'; 89echo '<input type="reset" value="リセット" />'; 90echo '</form>'; 91echo '<hr />'; 92 93// 過去の投稿表示部分 (最新順に10件のみ表示) 94$sql = "SELECT * FROM bbs ORDER BY postdate DESC LIMIT 10"; 95$result = mysql_query($sql, $conn); 96if ( $result ) { 97 while ( $row = mysql_fetch_array($result, MYSQL_ASSOC) ) { 98 echo '<p>'; 99 echo 'No.' . $row['id'] . '<br />'; 100 echo '題名 : ' . $row['title'] . '<br />'; 101 echo '名前 : ' . $row['name'] . '<br />'; 102 echo '日時 : ' . $row['postdate'] . '<br />'; 103 echo '<blockquote>' . n12br($row['body']) . '</blockquote>'; 104 echo 'パスワード : ' . $row['pass'] . '<br />'; 105 echo '</p><hr />'; 106 } 107} 108 109// 削除よう 110echo '<form action"' . $_SERVER['PHP_SELF'] . '" method="post">'; 111echo '記事No.<input type="text" name="id" size="4" />'; 112echo 'パスワード<input type="password name="pass" size="8" value="" />'; 113echo '<input type="submit" name="delete" value="記事削除" />'; 114echo '</form>'; 115 116// HTML終了部 117echo '</body></html>';

PHPサイバーテロの技法という本でwebアプリのセキュリティ対策について学んでいるのですが、その本のPHPはバージョンが古く、データベースへの接続はmysql_connectを使用しています。
私には現代風のPDOに書き換えることができないのでMAMPでPHPのバージョン設定を5.6.10にし、PHPMyAdminを用いてユーザーを作成し、プログラムを実行し、投稿ボタンより投稿したのですが、エラーとなります。

いろいろ調べてみると、真偽値がどうこうとのことですが、全くわかりません。
また、サンプルコードでも同じエラーが出ます。

どうしたら、上記のプログラムを実行できますか?

Warning: mysql_result() expects parameter 1 to be resource, boolean given in bbs.php on line 36

このエラー(↑)はどう対応したらいいのですか?

ちなみに本書での実行環境であるXAMPPで実行したら、サンプルコードでは登録しましたの文字のみが表示されました。
私のプログラムは相変わらずエラーです。

※ 先述した通り、私にはmysql_connectをPDOのプログラムに書き換える能力がないのでPDOを使いなさいとの回答はお控えください...
書き換えたコードをくれるのであれば別ですが...!

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

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

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

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

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

guest

回答4

0

mysql_result() http://php.net/manual/ja/function.mysql-result.php の引数として与えているものが想定するresource型じゃない→FALSEでも入っているんでしょう。

// 名前とパスワードの一致を確認 $sql = "SELECT COUNT(*) FROM bbs WHERE name = '" . $_POST["name"] . "' AND pass<>'" . $_POST["pass"] . "'"; $rs = mysql_query($sql, $conn);

ここ、失敗しているんでしょうね。

遡ると、allowsさんの指摘どおり

mysql_query( "CREATE TABLE bbs ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL default '', title VARCHAR(255) NOT NULL default '', body TEXT, pass VARCHAR(255) NOT NULL deafult '', postdate DATETIME NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM" , $conn);

なのですが、
そもそもmysql_query()の返り値を一切点検せず次々と処理を進めていくやり方が危険極まりないです。
せめて結果を変数に受け取ってFALSEを返していないかチェックしましょうよ。
サンプルコードがそう書いてあっても、エラーチェックを適宜加えていくのもセンスです。
SQL(やMySQL)への理解が乏しければ、
転記ミスを発見するためにもmysql_query()がFALSEを返していないかだけでもチェックしてください。

でも、もっと言いたいことがあるんだ、
動作に必要なテーブルが存在しないからといって即席でテーブルを作っちゃうのって、実務でやる?
データベース接続先が間違っていて、想定外のところにテーブルを作っちゃう可能性とか、
そもそもphp側からテーブル作成できちゃう実行権限をもたせるのって別の危険性を孕むよね。
php側からアクセスする際のユーザーはSELECT, INSERT, UPDATE, DELETEくらいしかさせない権限に絞るとか余計な情報にアクセスさせないとかいうのもセキュリティ対策です。

投稿2016/09/07 02:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/09/07 05:55

ありがとうございます! 参考になりました!
guest

0

たとえば

$_PSOT["pass"] = $_COOKIE["pass"];

のtypoとかいろいろ怪しいところはあります。
それとmysql_関数を使い続けるのであれば必ず外から来たデータには
mysql_escape_stringをかましてください

投稿2016/09/07 01:30

yambejp

総合スコア114779

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

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

mpyw

2016/09/07 01:49

文字セットを考慮する mysql_real_escape_string のほうが使用が推奨されます.(とはいえども,mysql関数自体を早急に書き換えるべきに1票,ですが…)
mpyw

2016/09/07 01:52

(↑これは脆弱性を学ぶ本のようなので,そういう回答も相応しくない気がしてきました.しかし実用的なアプリケーションを作る場合には絶対に避けたいところですね.)
yambejp

2016/09/07 01:55

ありがとうござます mysql_real_escape_string・・・ああそういえばそんな関数もありましたね そもそも最近ではmysql_関数が使える環境を作ること自体が難しいですから せめてmysqli_関数の手続き型にすれば似たような処理でできるので こだわりがある方にはそちらを選択してもらうくらいでしょうか
退会済みユーザー

退会済みユーザー

2016/09/07 05:53

お恥ずかしい!! 気づきませんでした! ありがとうございます!!
guest

0

とりあえず PRIMARY LEY (id) → PRIMARY KEY (id) かな

投稿2016/09/06 19:47

allows

総合スコア20

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

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

退会済みユーザー

退会済みユーザー

2016/09/07 05:52

ありがとうございます! 気づきませんでした! 直しましたが同じエラーが出ます...><
guest

0

PHPサイバーテロの技法 正誤表

何ページのものなのかとか私は知らないので、こちらに該当の箇所があるのかどうかも知りませんが…

投稿2016/09/06 16:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/09/07 05:48

ありがとうございます。 私の本ではその誤植等は修正されています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問