/* (^_^) 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を使いなさいとの回答はお控えください...
書き換えたコードをくれるのであれば別ですが...!
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
退会済みユーザー
2016/09/07 05:55