CMP演習

Similar documents
CMP2-4PDO2b.pptx

情報システム設計論II ユーザインタフェース(1)

CMP2-3SQL2b.pptx

_IMv2.key

Taro php.jtdc

hands_on_4.PDF

Microsoft Word - Android_SQLite講座_画面800×1280

PHP と Postgresql を用いた 図書館管理システムの構築 裘彬濱 Qiu Binbin 南山大学 情報理工学部

PowerPoint プレゼンテーション

( 前回 ) 提出課題 課題 1( 提出課題 ): データベースからデータを読み込み, そのデータを表示する Web ページ作成してみましょう user テーブルから書籍のデータを一覧表示する. 手順 1:PHP のファイルを user_list.php という名前で作業フォルダに作成する. プログ

2019年度 Webシステムプログラミングa

Microsoft Word - PHP_SQLServer2012

2003年度 情報処理概論

PowerPoint Presentation

WEBシステムのセキュリティ技術

1

<4D F736F F D A957A A A8FEE95F18F88979D DEC90AC E646F63>

システム分析とデータベース設計

■新聞記事

ii II Web Web HTML CSS PHP MySQL Web Web CSS JavaScript Web SQL Web

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

2019年度 Webシステムプログラミングa

実験 5 CGI プログラミング 1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを通じて基本的な仕組みを学ぶ 2 実験 実験 1 Webサーバの設定確認と起動 (1)/etc/httpd/conf にある httpd.conf ファイルの cgi-bin に関する

復習 (SQL 文 ) 3/6 復習 (SQL 文 ) 4/6 表の作成 CREATE TABLE...; 表の削除 DROP TABLE テーブル名 ; 表内のデータが全て消えてしまう. 表内のデータを得る SELECT 列名 FROM 表名...; 表にデータを挿入する. INSERT INTO

JavaScript 演習 2 1

リスト 1 1 <HTML> <HEAD> 3 <META http-equiv="content-type" content="text/html; charset=euc-jp"> 4 <TITLE> 住所の検索 </TITLE> 5 </HEAD> 6 <BODY> <FORM method=

Si 知識情報処理

Microsoft PowerPoint - myadmin.ppt

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

Web データ管理 JavaScript (3) (4 章 ) 2011/12/21( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/18

テーブルの確認 sqlite>.tables.tables コマンドでデータベース内のテーブル一覧を表示する テーブルスキーマの表示 sqlite>.schema mytable.schema コマンドで指定のテーブルのスキーマを表示できる テーブル出力の整形.explain コマンドを使うと テー

3 Powered by mod_perl, Apache & MySQL use Item; my $item = Item->new( id => 1, name => ' ', price => 1200,

情報システム設計論II ユーザインタフェース(1)

10th Developer Camp - B5

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

CodeIgniter とは? アメリカ EllisLab 社が開発配布しているオープンソースの PHP フレームワーク 2006 年 2 月リリース

復習 (SQL 文 ) 3/6 復習 (SQL 文 ) 4/6 表の作成 CREATE TABLE...; 表の削除 DROP TABLE テーブル名 ; 表内のデータが全て消えてしまう. 表内のデータを得る SELECT 列名 FROM 表名...; 表にデータを挿入する. INSERT INTO

eラーニング資料 e ラーニングの制作目標 データベース編 41 ページデータベースの基本となる概要を以下に示す この内容のコースで eラーニングコンテンツを作成予定 データベース管理 コンピュータで行われる基本的なデータに対する処理は 次の 4 種類です 新しいデータを追加する 既存のデータを探索

Webデザイン論

演習室の PC のハードディスクには演習で作成したデータは保管できません 各 PC の ネットワーク接続 ショートカットからメディア情報センターのサーバーにアクセスしてください (Z ドライブとして使用できます ) 講義で使うフォルダ 2/23

PowerPoint プレゼンテーション

演習室の PC のハードディスクには演習で作成したデータは保管できません 各 PC の ネットワーク接続 ショートカットからメディア情報センターのサーバーにアクセスしてください (Z ドライブとして使用できます ) Web プログラミング 1 CGI (3 章 ) 2012/6/12( 水 ) 講義

PowerPoint Presentation

Microsoft PowerPoint pptx

Exam : 1z0-882 日本語 (JPN) Title : Oracle Certified Professional, MySQL 5.6 Developer Vendor : Oracle Version : DEMO 1 / 4 Get Latest & Valid 1z0-882-JP

2019年度 Webシステムプログラミングa

SOC Report

C:\Apache Software Foundation\Apache2.2\htdocs\sample\login.html サンプルプログラム passworddisc.php <head><title> ログイン </title></head> $user=$_post['user']; $

Webプログラミング演習

Microsoft Word - PHP演習資料.doc

Microsoft Word - wpphpmysql.doc

情報システム設計論II ユーザインタフェース(1)

データベースアクセス

mySQLの利用

標準化 補足資料

SQLite データベース IS04 組み込み 1

myx_backup Ver 1.10のPHP7対応

2009 Web B012-1

フォームとインナー HTML を使って動的にページ内の文章を変更しよう 問題 1. つぎの指示と画面を参考に HTML を組みなさい 仕様 テキストボックスに任意の文字を入力し [ コメント ] ボタンをクリックすると 下部の文章がテキストボックスの内容に置き換わる フォーム名 : f1 テキストボ

Chapter Two

学 習 目 標 SQLインジェクションについて 理 解 する SQLインジェクションの 実 験 をする SQLインジェクション 対 策 について 理 解 する インターネットに 公 開 する 際 の 対 策 について 理 解 する

tkk0408nari

メディプロ1 Javaサーブレット補足資料.ppt

Chapter Two

SQL インジェクションの脆弱性

データベースS 演習資料

◎phpapi.indd

第 7 回の内容 動的な Web サイト フォーム Web システムの構成

スライド 0

KeyWeb Creator 概要 What s KeyWeb Creator? 動的なホームページを作成するためのツール!! 従来の Web ページ DB を利用した Web ページ <HTML> <HEAD> <TITLE>show_book</TITLE> </HEAD> <BODY> <DI

NetworkApplication-09

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

Microsoft PowerPoint - prog03.ppt

PowerPoint Presentation

プログラミング基礎I(再)

スライド 1

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

データベースS

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

データセンターの効率的な資源活用のためのデータ収集・照会システムの設計

情報基礎A

Oracle Database Connect 2017 JPOUG

II 2 p.2 2 GET POST form action URL Aisatsu 2.1 Servlet GET GET : Query String QueryStringTest.java 1 import java.io.ioexception; 2 import java.io.pri

ブログ制作教材

_unix_text_command.pptx

Webデザイン論

TALON Tips < 親子関係のある構成データを TALON で表示する > 株式会社 HOIPOI 第 1.1 版 p. 1

Microsoft PowerPoint _2b-DOM.pptx

[ ][ ] HTML [ ] HTML HTML

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

Microsoft Word - Android_SQLite講座_画面800×1280

3 CSS について Cascading Style Sheets(CSS カスケーディング スタイル シート カスケード スタイル シート) とは HTML や XML の要素をどのように修飾 ( 表示 ) するかを指示する W3C による仕様の一つ 文書の構造と体裁を分離させるという理念を実現す


2

ウェブデザイン技能検定 1 級実技 平成 28 年度 第 4 回 ウェブデザイン技能検定 1 級 実技試験概要 試験にあたっての注意事項 試験者は本試験の留意事項 注意事項に留意して作業を行うこと ペーパー実技試験は 課題 1 から 5 までの 5 課題を 60 分間で行うこと 作業実技試験は 課題

Microsoft PowerPoint - TwitterInsight edit.pptx

forever朝活

Microsoft Word 基_シラバス.doc

ビジネスサーバ設定マニュアル_Standard応用編

Microsoft PowerPoint - 04WWWとHTML.pptx

Transcription:

サーバサイドプログラミング 4. PDO (PHP から SQL アクセス ) コンテンツメディアプログラミング演習 Ⅱ 2014 年 菊池, 斉藤

1. PDO 概要 PDO (PHP Data Object) PHP5.1 から採用された SQL の標準クラス. を採用し, オブジェクトからメソッドやクラス変数を操作する. MySQL, SQLite などのサーバソフトに依存せず, ほぼ共通のコードでプログラミングできる.

PHP から SQL 文の実行 PDO オブジェクト作成 ( 準備 ) $ 変数 = new PDO(" ドライバ : host= ホスト ; dbname= データベース名 );» ドライバ = mysql,sqlite など» host はローカルの場合は省略可能» "dbname=" を省略可能» $ 変数がメソッドなどを含むオブジェクト. 例 ) Mts データベースにアクセスする $db = new PDO("sqlite:mts.sqlite");

SQL コマンドの実行 query ( クエリ ) $ 変数 -> (SQL 文 );» 任意の SQL 文を実行する.$ 変数は PDO オブジェクト. 例 ) $db->query("insert INTO mts(name) VALUES(' 高尾山 ')"); この場合は返り値はなし (VOID)

検索結果の抽出 (1/3) fetch ( 物を取に行く ) $ 検索結果 = $ 変数 ->query(select 文 ); $ 行 = $ 検索結果 ->fetch();» SELECT 文は複数の行と列を含むテーブルを返す» fetch() はテーブルから 1 行づつ取り出す.» 返し値 = ( もう行がない時 ) 列から成る ( 通常の ) 配列列名をメンバとする連想配列 例 ) $rows = $db->query("select * from mts"); テーブル mts から 1 行 $rows に取出す.

検索結果の抽出 (2/3) 例 1) 配列で列を取出す $cols = $rows->fetch() print $cols[0]. $cols[1]. $cols[2]. $cols[3]. " n"; 1 谷川岳 05 2 丹沢 06 例 2) 配列を "-" で繋いで出力. print join($cols,"-"). " n"; 1-1- 谷川岳 - 谷川岳 -0-0-5-5-1227-1227 例 3) 連想配列で名前と標高のみ出力. print $cols['name']." t". $cols['height']. " n"; 1 谷川岳 05 2 丹沢 06 例 4) 全ての行を出力. while($cols = $rows->fetch()){ print $cols['name']. ","; } 谷川岳, 丹沢, 天城山, 八ヶ岳, 那須岳, 駒ヶ岳, 燕岳, 奥穂岳,

検索結果の抽出 (3/3) fetchall ( 全ての行を抽出 ) $ 検索結果 = $ 変数 ->query(select 文 ); $ 表 = $ 検索結果 ->fetchall();» fetchall() は全部の行から成るテーブル全体を取出す.» 返し値 = 列名をメンバとする連想配列 の配列 例 ) $rows = $db->query( "SELECT * from mts"); $all = $rows->fetchall(); print_r($all); 全行をまとめて表示 Array ( [0] => Array ( [ID] => 1 [0] => 1 [name] => 谷川岳 [1] => 谷川岳 [day] => 0 [2] => 0 [hour] => 5

サンプル 1 mts-list.php <html> <head> <meta charset='utf-8'> <title> 山登り </title> </head> <body> <H1> 登りたい山リスト </h1> <?php $db = new PDO("sqlite:Mts-u.sqlite"); $rows = $db->query('select * FROM mts'); $i = 0; while($cols = $rows->fetch()){ print ++$i. " ". $cols[1].", ". $cols[2]. ", ". $cols[3]. "<br> n"; }?> </body> </html>

演習 1 Mts.sqlite データベースを用いて, 標高順に山名を次の様に出力する mts-top.php を書き, ブラウザから閲覧せよ. ヒント : select でソートを行う. 必要な項目のみ選択.Table タグ利用. UTF-8 のデータベース mts-u.sqlite

2. データベースの更新 マイ電話帳 姓 (lastname), 名 (firstname), TEL(phone) の列から成る表 phonebook.sqlite CREATE TABLE users (id integer primary key autoincrement, firstname text, lastname text, phone text)

全ての行を表示 phonebook-list.php <html><head> <title> phonebook</title> <meta charset="utf-8"></head> <body> <h1> マイ電話帳 </h1> <table border=0 cellpadding=0 cellspacing=0> <tr bgcolor=#f87820> <td width=50><br>no</td> <td width=80><br><b> 姓 </b></td> <td width=80><br><b> 名 </b></td> <td width=150><br><b>tel</b></td> <?php $db = new PDO("sqlite:phonebook.sqlite"); $result=$db->query("select * FROM users"); for($i = 0; $row=$result->fetch(); ++$i ){ echo "<tr valign=center>"; echo "<td >". $row['id']. "</td>"; echo "<td >". $row['lastname']. "</td>"; echo "<td >". $row['firstname']. "</td>"; echo "<td >". $row['phone']. "</td></tr>";?> } <tr> <td bgcolor=#fb7922 colspan=6>&nbsp</td> </tr> </table> </body></html>

行の追加 query メソッドで INSERT 文実行 $db->query( "INSERT INTO テーブル VALUES( 値 )"); 例 )» $db はデータベースを含む (new PDO)» 返し値はない. エラーのない様に値を用意.» $firstname=$_get['firstname'];» $db = new PDO("sqlite:phonebook.sqlite");» $db->query("insert INTO users VALUES(null, '$firstname',null,null)");

FORM からのデータ受け取り phonebook-add.html <html> <head><title> phonebook</title> </head> <body> <h2> エントリー追加 </h2> <form action=phonebook-add.php method=get> <table > <tr><td> 姓 :</td><td><input type=text name=lastname> </td></tr> <tr><td> 名 :</td><td> <input type=text name=firstname> </td></tr> <tr><td>tel:</td><td> <input type=text name= phone> </td></tr> <tr><td> </td><td><input type= submit value= " 追加 "></td></tr> </table> </form> 単一の php ファイルにまとめてしまう phonebook-add.php <?php if(isset($_get['firstname'])) $firstname=$_get['firstname']; if(isset($_get['lastname'])) $lastname=$_get['lastname']; if(isset($_get['phone'])) $phone=$_get['phone']; $db = new PDO("sqlite:phonebook.sqlite"); if(isset($firstname)) { $db->query("insert INTO users VALUES(null, '$firstname','$lastname','$ph one')"); }

FORM からのデータ受け取り (2/2) phonebook-add.html <html> <head><title> phonebook</title> </head> <body> <h2> エントリー追加 </h2> <form action=phonebook-add.php method=get> <table > <tr><td> 姓 :</td><td><input type=text name=lastname> </td></tr> <tr><td> 名 :</td><td> <input type=text name=firstname> </td></tr> <tr><td>tel:</td><td> <input type=text name= phone> </td></tr> <tr><td> </td><td><input type= submit value= " 追加 "></td></tr> </table> </form> phonebook-add.php <?php if(isset($_get['firstname'])) $firstname=$_get['firstname']; if(isset($_get['lastname'])) $lastname=$_get['lastname']; if(isset($_get['phone'])) $phone=$_get['phone']; $db = new PDO("sqlite:phonebook.sqlite"); if(isset($firstname)) { $db->query("insert INTO users VALUES(null, '$firstname','$lastname','$ph one')"); }

行の削除 query メソッドで DELETE 文実行 $db->query( "DELETE FROM テーブル WHERE 条件 "); 例 )» 条件は,id=2 などの行を一意に決める式» 返し値はない.» $id=$_get['id'];» $db = new PDO("sqlite:phonebook.sqlite");» $db->query("delete FROM users WHERE id='$id' ");

演習 2 phonebook.php を参考にして, ポケモン図鑑 pokemon.php を作れ. pokemon.sqlite CREATE TABLE monsters ( id integer primary key autoincrement, name text, hp integer, offense integer, defense integer, speed integer, type text); 好きなポケモンを 5 匹追加せよ. http://www.pokemon.co.jp/zukan/

3. セキュリティの考慮 演習 2 のモンスターの名前に次を入力して何が起きるか観察せよ. 1. <h1> ピカチュー </h1> 2. <script> alert('hello') </script> 3. <body bgcolor=black>

クロスサイトスクリプティング Cross Site Scripting ( ) B ( おとりサーバ ) cookie の読出し自動実行 A ( クライアント ) name= <Script> cookie </script> <Script> cookie </script> C ( 脆弱なサーバ )

SQL インジェクション データベースへの攻撃 意図しない SQL 文の注入 ( ) 例 ) 演習 2 のエントリーの削除 ( 注意 ) DELETE FROM monsters WHERE id = $id 入力 = 3 OR 1=1 DELETE FROM monsters WHERE id = 3 OR 1= 1 ; 全行を削除する.( 全データを抽出すると情報漏えい )

対策 サニタイジング ( 衛生化 ) $ 変換後変数 = htmlspecialchars($ 入力変数 );» 入力変数に含まれるタグを HTML の特殊文字記号に置き換える.» < = <, > = >, &=&, "=" など. 例 ) <h1> ピカチュー </h1> <h1> ピカチュー </h1> ( 見た目は同じ )

その他の対策 ( 参考 ) サニタイジングだけでは完全に SQL インジェクションを防止できない. タグや特殊記号を含まない命令 整数化 $intid = round($id); 文字列を整数のみに ( 切り捨て ) 正規表現 preg_match("/[0-9]+/", $ 入力変数 ) 入力が数字のみかどうかを判定する Prepared Statement $ps = $db->prepare("select * from tb where id=:a"); $ps->bindparam(":a", $a); $ps->execute(); :A の位置に $a の整数のみが代入.

対策 1. SQL DB を外部のフォルダーに. 2. SQL DB を直下の別フォルダーに. webserver htdoc phonebook.php SQL phonebook.mysql 欠点 : ファイルの管理 htdoc phonebook.php SQL phonebook.mysql.htaccess

アクセス制御ファイル.htaccess ( ドットに注意 ) Order deny,allow Deny from all deny ( ),allow ( ) order は, 優先順序を指定. このフォルダでは全てのウェブからのアクセスを禁じる (sqlite コマンドは別 )

演習 3 演習 2 で作成した pokemon.php を, 次の 2 点を考慮した安全な pokemon-secure.php にせよ. 検査方法 (1) エントリー追加で名前 <h1> ピカチュー </h1> を持つ行を追加し,H1 の大きさで表示されないこと. (2) データベース本体を http://localhost/pokemon.sqlite で外部からアクセスできないこと

まとめ PDOはオブジェクト指向を用いた ( ) の SQLアクセスライブラリ.( ) により任意のSQL 文を実行する. PDOから行を追加するには,queryメソッドにより,SQLの( ) を実行する. データベースを操作するコマンドにタグが入っていると ( ) の攻撃を受ける. 防止するには, タグをHTMLの特殊文字に置き換える ( ) がある.