Home

Netforest Developer's Note

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

webの脆弱性-クロスサイト・スクリプティング、SQLインジェクション-

DXです。。。
webの脆弱性について簡単にまとめてみました。

webの脆弱性とは

脆弱性とは、攻撃に対し、弱く脆いことです。
日々、多くの人々が利用しているwebに潜む弱く脆いことにはいったいどのようなものがあるのでしょうか。

脆弱性の種類

情報処理推進機構(IPA)は脆弱性についての届出を受け付けています。

情報処理推進機構:情報セキュリティ:ソフトウェア等の脆弱性関連情報に関する届出状況[2010年第1四半期(1月~3月)]_1278856637458
情報処理推進機構:情報セキュリティ
http://www.ipa.go.jp/security/vuln/report/vuln2010q1.html

上記のページの情報によると、2010年第一四半期に届出のあった脆弱性の中で最も多いのは「クロスサイト・スクリプティング」で全体の53%、次いで「SQLインジェクション」で全体の16%となっています。
今回はその2種類の脆弱性について考えたいと思います。

クロスサイト・スクリプティング

クロスサイト・スクリプティングとは、掲示板のように入力された情報をそのまま表示できるwebページのプログラムが、訪問者のブラウザに悪意のあるコードを埋め込まれたページを表示させてしまう脆弱性のことです。
悪意のあるコードを埋め込まれたページが個人情報を入力するページだった場合、送信された個人情報が悪意のあるコードを埋め込んだ人間のもとへ流れ出てしまう可能性があります。

わかりやすい説明は下記のサイトをご覧ください。
情報処理推進機構:セキュリティセンター:知っていますか?脆弱性 (ぜいじゃくせい)/2. クロスサイト・スクリプティング_1278857388191
クロスサイト・スクリプティング
http://www.ipa.go.jp/security/vuln/vuln_contents/xss_flash.html

SQLインジェクション

SQLインジェクションは、データベースと連携したwebサイトで、データベースの操作を行なうプログラムにパラメータとしてSQL文の一部を挿入することにより、データベースを改ざんしたり不正に情報を入手できてしまう脆弱性です。
たとえば以下のようなSQL文をプログラムから実行するとします。
  select * from テーブル名 where 条件となるカラム名 = '(入力値)';  

このとき、入力値に以下のようなSQLの断片を入れたとします。
  ';update テーブル名 set 更新するカラム名 = '更新' where 条件となるカラム名 = '条件';  

すると、もとあったselect文が以下のようになってしまいます。
  select * from テーブル名 where 条件となるカラム名 = '';update テーブル名 set 更新するカラム名 = '更新' where 条件となるカラム名 = '条件';  

このとき、初めに実行されるselect文では全ての情報が取得可能となり、情報漏洩に繋がります。また、次に呼ばれるupdate文ではデータベースにある情報が書き換えられてしまいます。

わかりやすい説明は下記をご覧ください。
情報処理推進機構:セキュリティセンター:知っていますか?脆弱性 (ぜいじゃくせい)/1. SQLインジェクション_1278859833404

SQLインジェクション
http://www.ipa.go.jp/security/vuln/vuln_contents/sql_flash.html

まとめ

「クロス・サイトスクリプティング」も「SQLインジェクション」も、個人情報流出の危険性があるので対策を忘れず施したいですね。

DNSのゾーンファイルのシリアル番号を間違ったメモ

バーボンです。
自宅サーバでDNSのゾーンファイルを書いているときにシリアル値を間違えて大きくしてしまった。
たとえばシリアル値を「年-月-日-二桁」というフォーマットを前提にしたのに間違えて最後を三桁にしてしまったとします。これをもとに戻したい。どうすればいいのでしょうか。

話は変わりまして

そもそもシリアル番号はどうして大きくしないといけないの

RFC2182より抜粋
プライマリーサーバー上のゾーンに1つ変更が加えられる毎に、あるいは 幾つかの変更が加えられる毎に、シリアル番号を増加させなければ ならない。これにより、セカンダリーサーバーにゾーンの複製を更新する 必要があることを通知する。シリアル番号を減少させることは できないことに注意してもらいたい。値の増加が定義されている唯一の 修正である。

ゾーン転送のときに、より大きいシリアル番号のものにすれば 「このファイルは更新された」ということを通知してくれるようです。

シリアル番号って何者なの

RFCにこんなことが書いてありました。
シリアル番号
符号なし32ビットのゾーンの原本のバージョン番号。ゾーン転送がこの値を維持します。この値は巡回していて、連続空間演算を使って比較されるべきです。

わからなさすぎたのでスライドにしました。まとめてみたのでみてみてください。


大きい表示はこちら
(別のタブもしくは別のウィンドウで開きます。)

はしょってシリアル番号を元に戻す方法だけ(RFC2182)

たとえばゾーンのシリアル番号が10であると仮定する。この値が誤って 1000に設定されてしまい、これを11に戻したい場合を考える。

①まずプライマリサーバのシリアル番号を2,000,000,000にして、セカンダリーサーバーがゾーンを 更新するのを待つ。

②シリアル番号を4,000,000,000にして、セカンダリーサーバーがゾーンを 更新するのを待つ。

③最後にシリアル番号を11にして、セカンダリーサーバーがゾーンを更新するのを待つ。

おしまいです。なんでこうなるのかはスライドをご一読くださったらもしかしたらなんとなくわかるかもしれません。
RFCの注意書きも読みましょう。

…関係する全サーバーが更新を行ったことを検証することが大切である。 本質的には、全ての事例においてシリアル番号の選択をより積極的な ものにすることで、2回の処理でシリアル番号を訂正することも可能である。 しかし、その場合使用されるシリアル番号はあまり"扱いやすい"ものでは なくなる(less nice)ので、より多くの注意が要求される。 また、全てのネームサーバー実装がシリアル番号処理を正しく 実装しているわけではないことに注意してもらいたい。…

興味があればRFCを読んでみてください。
とりあえずゾーンファイルのシリアル番号は小さい数に戻せるってことはわかりました。
トリビアです。

RFC2182
RFC1982

GWTでHello World

  • 2010-07-05 (Mon)
  • Java

take©です。 GWT (Google Web Toolkit) は Javascript を Java で書けるフレームワークです。 GWT が Java のコードを Javascript に変換してくれるので、クライアントサイドのコーティングも eclipse を使ったコンパイルチェックやコード補完によって効率よく開発が可能です。 今回はごく簡単なHello Worldをメモ。

web.xml

今回はクライアントサイドだけのサンプルなので、web.xmlは空っぽ。

war/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
</web-app>

HTML Page

まず画面を用意する。とはいっても body の中は空っぽ。GWTでは画面を構成する要素 (HTML) を Javascript で組み立てる。
これまでは、 Servlet → JSP → HTML な感じのフローだったが、
GWTでは、 HTML → Javascript (AJAX) → Servlet な感じになる。
これが今までの作り方とだいぶ異なるので慣れる必要がある。 もちろん Javascript の部分は Java で書ける。

<script type="text/javascript" language="javascript" src="sample/sample.nocache.js"></script>
は次に記載する Module をコールするためのもので、GWT が Javascript に変換した Java のコードをここで実行する。

war/sample.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" language="javascript" src="sample/sample.nocache.js"></script>
</head>
<body>
</body>
</html>

Module

Module を定義する。GWT の Module は Javascript, HTML, CSS のセットみたいなものでアプリケーションや機能の単位になる。 GWT はクラスパスから *.gwt.xml を探して Module を作成する。

rename-to 属性によって Javascript のパスを変更できる。
HTML に記述した sample/sample.nocache.js の部分がそれにあたる。

source 要素では Java のパッケージ名を指定する。
ここで指定したパッケージ配下の Java コードは GWT が Javascript に変換してくれる。

entry-point 要素では最初に実行される Javascript を指定する。 実際には Java クラスを指定する。Entry Point に指定したクラスはインターフェイス EntryPoint を実装する。

src/jp/ad/netforest/gwt/Sample.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.3//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.3/distro-source/core/src/gwt-module.dtd">
<module rename-to="sample">
	<inherits name="com.google.gwt.user.User" />
	<source path="client"/>
	<entry-point class="jp.ad.netforest.gwt.client.SampleEntryPoint"/>
</module>

Entry Point

EntryPoint を実装する。ここに書いたコードが Javascript に変換され、sample.html を表示したときに実行される。

src/jp/ad/netforest/gwt/client/SampleEntryPoint.java

package jp.ad.netforest.gwt.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;

public class SampleEntryPoint implements EntryPoint {
	public void onModuleLoad() {
		Button button = new Button("click me!");
		button.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				Window.alert("hello world!");
			}
		});
		RootPanel.get().add(button);
	}
}

実行結果

eclipse で実行してみる。今日はここまで。

20100705_01

HibernateProxyオブジェクトのinstanceof

mattyです。
Hibernateで遅延ロードしたプロキシオブジェクトをinstanceofするときのメモ。

マッピング時にlazy属性をtrueに指定するとプロキシオブジェクトが設定されるため 本来のクラスでinstanceofしてもfalseになってしまいます。

そのようなプロキシオブジェクトではなく本来のオブジェクトを呼び出したいときに便利なのが
org.hibernate.proxy.HibernateProxyHelpeクラスの getClassWithoutInitializingProxyメソッドです。
このメソッドでは下記のように本来のオブジェクトプロキシオブジェクトから取得。

public static Class getClassWithoutInitializingProxy(Object object) {
	if (object instanceof HibernateProxy) {
		HibernateProxy proxy = (HibernateProxy) object;
		LazyInitializer li = proxy.getHibernateLazyInitializer()
		return li.getPersistentClass();
	}
	else {
		return object.getClass();
	}
}

このメソッドにオブジェクトを渡せば本来のクラスを取得してinstanceof出来ます。

MySQLのSTRICT_TRANS_TABLES

take©です。
PHP + MySQLで構築された、あるシステムの開発環境を構築したときに、SQLでエラーが発生したときのメモ。

INT型に空文字などを挿入するなど、制約違反なSQLを許可する場合、MySQLはmy.iniの設定でSTRICT_TRANS_TABLESを無効にすればよいみたいだ。

Home

Recent Comments
Recent Trackback
Search
Meta
Links
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。