ひとこと

― 今日のひとこと ―
年に1回くらい、EVE Onlineやりたくなるのよね。
(2025.12.24)
ラベル data base の投稿を表示しています。 すべての投稿を表示
ラベル data base の投稿を表示しています。 すべての投稿を表示

2016年2月24日水曜日

Hackme攻略 - Lv別ヒント -

「糸口すらつかめねえ・・・でも答えは自力で導き出したい!」というハイエンドなあなたに朗報
HackmeのLv1からLv4までのヒントだけを書いておく。Lv5は知りません。

ヒントといってもいくつかのキーワードだけ。
しかし、もし基礎知識が充分であれば、それだけでも突破口は見えてくるはず。


■Lv1
・ソースコード

■Lv2
・データベース
・サニタイジング

■Lv3
・URL
・passwdファイル

■Lv4
・スクリプト
・サニタイジング
・Cookie
・セッション


健闘を祈る!

2015年1月16日金曜日

セミナー参加 -MySQLレプリケーション入門-

本日Oracle青山センターで開催された『【初心者向け】MySQLレプリケーション入門』に参加してきた。

100席くらいの部屋は満席。
2時間だけの短い講習だったけど色々と勉強になった。

レプリケーションといえば冗長化!可用性向上!っていうイメージがこれまで強かったが、実は負荷分散にもなるんだね。
レプリケーションの概念から仕組みから実際の設定方法まで、具体的な説明を聞くことができた。
PC1台で実演してるところも見れたし、なかなか楽しかったな。

やり方はわかったので自分で試して手順をここに載せようかと思ったけど風邪っぽい上に明日も仕事なので今日はやめておこう。。
いつか時間がある時にでも。


【2015/01/28 追記】
内容を資料にまとめた。
ブラウザで表示すると体裁が崩れたり図内の文字が消えてたりするのでダウンロード推奨
https://drive.google.com/file/d/0BwTM4PitwqqoQ0hBbFl4SFpZNGM/view?usp=sharing

2013年8月17日土曜日

Oracle PL/SQL開発 No.3 -SQL Developerによるデバッグ-

現場ではSQL DeveloperとA5:SQL Mk-2を使って製造と単体試験を行っています。

SQL Developerでデバッグする方法をメモ。
ちなみに今回はプロシージャをステップ実行しています。


1.ユーザにデバッグ権限を付与する。
プロシージャのデバッグに必要な権限は以下の2つ。

・Debug Connect Session
・Debug Any Procedure

  GRANT DEBUG CONNECT SESSION ,DEBUG ANY PROCEDURE TO <ユーザ名>;




2.デバッグしたいプロシージャを、デバッグ用にコンパイルする。
「接続」のツリーからプロシージャ名を右クリックし、コンテキストメニューから「デバッグ用にコンパイル」を選択する。




3.デバッグ画面に移る
プロシージャ名をクリックすると、微妙にコードが整形されたデバッグ画面に遷移する。




4.ブレークポイントを設定し、デバッグを開始する。
ブレークポイントを設定したい行の行番号をクリックするか、その行でF5キーを押してブレークポイントを設定する。
ブレークポイントを解除する時も同様。
※処理が行われない行(コメント行など)にブレークポイントを設定しても意味がありません

その後、画面上方のデバッグボタンをクリックする。

赤い丸印がブレークポイント。てんとう虫がデバッグボタン。



5.引数がある場合は入力する。
デバッグボタンを押すとダイアログが表示される。
そのダイアログ中のコード部分に、引数の値を入力できる。
入力後、「OK」ボタンをクリックする。






6.ステップ実行する。
F8キーを1回押すと、処理が1行実行される。

ここで変数の値を監視することもできる。
監視したい変数をコード中で選択し、右クリックしてコンテキストメニューの「監視」をクリックする。

「監視」ツリーに選択した変数の現在の値が表示される。


監視機能はすごく便利だけど、カーソル属性は監視できない様子




こんなところかな
暇があったらいつかユニットテストの方法も書いておこう
レンジが僕を呼んでいる。炒飯食べてきます。

2013年6月1日土曜日

Oracle PL/SQL開発 No.2-指定したテーブルの主キーを表示-

普段は社用PCのローカルにインストールしたOracle DBでプログラムを書いていて、
テストテーブルや変更履歴を自動保存するトリガなんかを色々と作って使っている。

面倒なので自宅PCのOracle DBではデフォルトのサンプルを使ってなんやかんやしているわけだが
サンプルのテーブルは僕が作ったわけではないのでテーブル構造がわからない。

型とNot Null制約の有無くらいならdescribeで分かるけどね・・・
主キーが知りたいんだよ!っていう場合が多々ある。

主キーを判別する方法はいくつかあるようだが
user_cons_columnsテーブルを使ってユーザが指定したテーブルの主キーを列挙するPL/SQLプログラムを作ってみた。


declare
  -- レコード型コレクション(結合配列)変数
  type column_data is table of user_cons_columns%rowtype index by pls_integer;
  col column_data;
  -- カーソル変数
  type refcs is ref cursor;
  cs refcs;
  -- ループカウンタ
  lc number default 1;
begin
  -- カーソルにSQL文を設定してオープン
  open cs for
   'select * from user_cons_columns
    where constraint_name = (
      select constraint_name from user_constraints
      where table_name = :table_name_input
      and constraint_type = ''P''
    )' using upper('&table_name_input');  -- ユーザ入力値を大文字に変換してバインド

    -- Fetchループ
    loop
      fetch cs into col(lc);
        exit when cs%notfound;
        -- 所有者と対象テーブル名は一度だけ出力
        if 1 = cs%rowcount then
          dbms_output.put_line('所有者:'||col(lc).owner||' / '||
                               'テーブル:'||col(lc).table_name);
        end if;
        dbms_output.put_line('主キー:'||col(lc).column_name);
        lc := lc + 1;
    end loop;
  
    -- 結果セットが0行だった場合はエラーメッセージを表示する
    if 0 = cs%rowcount then   -- !カーソルをcloseした後はカーソル属性を使用できない!
      raise_application_error(
        -20999,
        '指定した表またはビューが存在しないか、データが空です。'
      );
    else
      dbms_output.put_line(CHR(13)||CHR(10)||'正常に処理が終了しました。');
    end if;
  close cs;
exception
  -- テーブルに主キーが無い場合はエラーメッセージを出力
  when no_data_found then
    dbms_output.put_line('主キーがありません。');
  -- その他のエラーが発生した場合は対応するエラーメッセージを出力
  when others then
    dbms_output.put_line(sqlerrm);
end;
/


実行すると入力要求が出る


主キーを知りたいテーブルの名前を入力する。
たとえばサンプルのEMP表だと結果はこうなる。

EMPNO列が主キーだということがわかる。


複合主キーのテーブルを作ってみた。

このDOUBLE_PRIME表の主キーは

COMP_ID列とEMP_ID列。複合主キーにも対応していることがわかる。



大したこと無いプログラムだけど、作りたい物が作れた時の達成感は味わえた。






データがinsertされてない表には使えないのはご愛嬌!
(もう疲れ果てました)

Oracle PL/SQL開発 No.1-SQL Developerインストール-

こうして投稿するのは4ヶ月ぶりくらいか
2~4月はDBスペシャリストの勉強と社内研修、4~5月は社内研修とPL/SQL研修で死ぬほど忙しかった。

PL/SQL研修といっても「現場出る前にこれやっとけ」って上長から言われて
『プロとしてのOracle PL/SQL入門』をやってただけなんだけどね(僕だけしかも社内研修と並行してたった3週間で)
昼休みは昼食を摂る暇もなくすべて勉強に費やし、毎日終業後は定時で帰る同僚たちを背に居残り。
土日も課題が出るからストレスたまりまくり。合間にはネットワークスペシャリストの勉強もしてるわけで
他の新人と比べて学習の量も難度も高すぎやしないか・・・特に平日なんか気の休まる時がまるで無いんだが。。
今日もバルク処理やら何やらのプログラム作らないといけないんだよ月曜提出だよ



まぁ愚痴はこの辺にして、SQL版Eclipseのような開発環境SQL Developerのインストール方法をメモ。
※事前にJavaとOracle SQL環境の用意が必要です。

1.ここからファイルをダウンロードする



2.ダウンロードしたファイルを解凍し、『sqldeveloper.exe』を起動

初回起動時はjava.exeのパスを尋ねられるので入力する。
Javaをデフォルトの位置にインストールしたならProgram Files内にJavaフォルダがあるはずなので、
その中にあるjdkのbinフォルダにjava.exeがあります


3.画面左側の「接続」を右クリックし、「接続の作成」をクリックする



4.Oracleデータベースへの接続情報を登録する

接続情報を入力したら、「テスト」ボタンをクリックして接続確認をする。
正しくDBに接続できたらステータス欄に「成功」と表示される。



ここまでやれば開発できる状態になる。
sqlスクリプトはメニューの「ファイル」->「新規」から作成する。



Terapadとかメモ帳で作ったsqlファイルって、SQL*Plusで実行するとコメント内外問わず日本語が文字化けして
プログラムによってはちゃんと動かないんよね。
その点SQL Developerで作ったsqlファイルはしっかり動くからいいよね
入力補完機能もあるしF5かF9押せば実行できるし開発作業も楽



ちなみに、DBMS_OUTPUTの出力内容を確認する方法は以下の通りだ

1.メニューの「表示」->「DBMS出力」をクリック



2.緑色十字マークの「接続のDBMS_OUTPUTを有効化」ボタンをクリック


これだけ。


複数の上司から聞いた話では、JavaとPL/SQLとShellプログラミングができるとかなり重宝されるとのこと。
特にPL/SQLは若い人はやりたがらないから人材が全然足りないんだと。
だから早いうちにPL/SQLを覚えておくと今後大きな武器になるらしい





関係ないけど、さっき京急蒲田駅の6番ホームでリーアム・ニーソンに激似の日本人男性を見かけた。

2013年2月3日日曜日

Amazon Web Serviceで仮想サーバ構築 No.9 -MySQLインストール-

後々使う可能性が高いので、AWS-EC2で作成した仮想サーバにMySQLをインストールしておく。




1.No.2にメモした方法でインスタンスに接続する。


2.MySQLをインストールする。
$ sudo apt-get install mysql-server
↓の画面でrootアカウントのパスワードを設定



3.デフォルトだと日本語が文字化けするので、文字コードを変更する。
# /etc/mysql/conf.d に.confファイルを作成する。ファイル名は任意(ここではcharset.cnf)
$ sudo nano /etc/mysql/conf.d/charset.cnf

# charset.cnfに以下の内容を記述

[client]
default-character-set=utf8

[mysqld]
character_set_server=utf8
skip-character-set-client-handshake



4.MySQLを再起動
sudo /etc/init.d/mysqld restart



これでおしまい。確認する時は以下のコマンドを実行する。
# MySQLにログイン
$ mysql -u root -p
Enter the password: パスワード入力

# MySQLの設定を確認
$ status

文字コードが正しく変更されていれば↓のようにutf-8が並ぶ!





ついでにinsertとselectだけできるユーザをひとつ作成しておく。
--grant <与える権限> on *.* to <ユーザ名> identified by '<パスワード>' [with grant option];
grant insert,select on *.* to user identified by 'user';

2013年1月28日月曜日

Hackme攻略 Lv2

今回はHackme Lv2の攻略。


以下、Hackmeの攻略に関するネタバレを多大に含みます。自力で攻略したいなら見ちゃだめです。





[Lv2]




1.ヒントを探す

今回もまた、ページを眺めてみてもこれといった発見はない。右クリックもできる。
ソースコードにもアカウント情報は記載されていない(当然といえば当然だが)
物は試しとLv1と同じ情報を入力してみると・・・

「ユーザ名またはパスワードが違います」というエラーメッセージが表示された。

そういえば、たまにパスワードだけが間違っているって表示しちゃうサイトがあるが、
それって結構危ないんだよな。IDはデータベース上に存在してるって自分で証明してるわけだから。
Lv2さんはそんなに甘くないってことだな。流石や!


2.考える

さて、どうやらユーザが見ることができる範囲にヒントになるような情報はなさそうだ。
仕方がないので少し専門的な知識を使おう。

Q.Webサイトのログインフォームを作る際に注意しなければならない攻撃は?
A.SQLインジェクションです。

Q.SQLインジェクション対策として有効なのは?
A.サニタイジング処理またはバインド機構です。

という具合に、データベースとWebセキュリティの基本を知ってれば誰もが考える。
では早速検証してみよう。


3.検証する

要は、SQLにおいて意味を持つ特殊文字がどう扱われているかを調べればいいわけだ。
代表的なのはアポストロフィ(')だな。

というわけでIDをてきとーに入力し、パスワードにただ1文字 ' と入力してみる。


結果は・・・


pg_queryとかいういかにもデータベース扱ってますよと云わんばかりに命名されたメソッドでエラーが!
アポストロフィ付近で文法エラーが起きてクエリが発行できなかったと書いてある。

さっきまでクラッカーにヒントを与えない完璧なエラーメッセージを発し続けていたLv2さんが
こんな明瞭なヒントを出すなんて・・・妙に変だなぁ・・・

プログラムでサニタイジングやプレースホルダが使われているなら、
はじめのように「ユーザ名またはパスワードが違います」と表示されるはず。
しかしSQL文法エラーが起きているという事は、入力された特殊文字がSQL文中で意味を持っているということ!
SQLインジェクションが有効だと考えられるね。


4.Hackyou!

SQLインジェクションというのは、簡単に言えばフォームにSQL文を打ち込んで実行させる手法だ。
ログインフォームでは、認証に用いられるクエリの実行結果が「true」になるようにSQL文を入力すればいい。

たとえば、↓のようなSQL文でパスワードの認証を行っているとする。
  SELECT user_password FROM user_info WHERE user_password = '<入力された値>';
この一文の内、WHERE句の条件に注目する。
素直に「password = ?」の形でクラッキングを試みたところで勝算はない。
このままでは本当に存在するパスワードを入力する以外ではクエリの結果を「true」にできないからだ。

上記クエリの実行結果を「true」にするには、SQL文を↓のように書き換えて実行させればいい。
  # xxxは任意の文字列
  SELECT user_password FROM user_info WHERE user_password = 'xxx' OR 絶対にtrueになる式 --';

条件式にある「A OR B」という形は、「最低限AかBのどちらかがtrueなら結果もtrue」っていう意味。
だからxxxが間違っていても、後に書いた<絶対にtrueになる式>によって実行結果はtrueになる。

そして、「--」は「それ以降をコメント化(無視)する」という意味。
これをつけないと末尾に残るアポストロフィによって文法エラーになってしまう。


説明が長くなったが、そんなこんなの理由から僕が入力したのは以下の通りだ。
ID :まろ最高
Pass:a' or 1=1 --


結果は・・・

Lv2クリア!



次回はLv3の攻略。