Netforest Developer's Note
スポンサーサイト
- -------- (--)
- スポンサー広告
- Comments (Close): -
- TrackBack (Close): -
webの脆弱性-クロスサイト・スクリプティング、SQLインジェクション-
- 2010-07-12 (Mon)
- web関連
DXです。。。
webの脆弱性について簡単にまとめてみました。
webの脆弱性とは
脆弱性とは、攻撃に対し、弱く脆いことです。日々、多くの人々が利用しているwebに潜む弱く脆いことにはいったいどのようなものがあるのでしょうか。
脆弱性の種類
情報処理推進機構(IPA)は脆弱性についての届出を受け付けています。
情報処理推進機構:情報セキュリティ
http://www.ipa.go.jp/security/vuln/report/vuln2010q1.html
上記のページの情報によると、2010年第一四半期に届出のあった脆弱性の中で最も多いのは「クロスサイト・スクリプティング」で全体の53%、次いで「SQLインジェクション」で全体の16%となっています。
今回はその2種類の脆弱性について考えたいと思います。
クロスサイト・スクリプティング
クロスサイト・スクリプティングとは、掲示板のように入力された情報をそのまま表示できるwebページのプログラムが、訪問者のブラウザに悪意のあるコードを埋め込まれたページを表示させてしまう脆弱性のことです。悪意のあるコードを埋め込まれたページが個人情報を入力するページだった場合、送信された個人情報が悪意のあるコードを埋め込んだ人間のもとへ流れ出てしまう可能性があります。
わかりやすい説明は下記のサイトをご覧ください。

クロスサイト・スクリプティング
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文ではデータベースにある情報が書き換えられてしまいます。
わかりやすい説明は下記をご覧ください。

SQLインジェクション
http://www.ipa.go.jp/security/vuln/vuln_contents/sql_flash.html
まとめ
「クロス・サイトスクリプティング」も「SQLインジェクション」も、個人情報流出の危険性があるので対策を忘れず施したいですね。DNSのゾーンファイルのシリアル番号を間違ったメモ
- 2010-07-05 (Mon)
- サーバ
バーボンです。
自宅サーバでDNSのゾーンファイルを書いているときにシリアル値を間違えて大きくしてしまった。
たとえばシリアル値を「年-月-日-二桁」というフォーマットを前提にしたのに間違えて最後を三桁にしてしまったとします。これをもとに戻したい。どうすればいいのでしょうか。
話は変わりまして
そもそもシリアル番号はどうして大きくしないといけないの
RFC2182より抜粋
プライマリーサーバー上のゾーンに1つ変更が加えられる毎に、あるいは
幾つかの変更が加えられる毎に、シリアル番号を増加させなければ
ならない。これにより、セカンダリーサーバーにゾーンの複製を更新する
必要があることを通知する。シリアル番号を減少させることは
できないことに注意してもらいたい。値の増加が定義されている唯一の
修正である。
ゾーン転送のときに、より大きいシリアル番号のものにすれば 「このファイルは更新された」ということを通知してくれるようです。
シリアル番号って何者なの
RFCにこんなことが書いてありました。
シリアル番号
符号なし32ビットのゾーンの原本のバージョン番号。ゾーン転送がこの値を維持します。この値は巡回していて、連続空間演算を使って比較されるべきです。
わからなさすぎたのでスライドにしました。まとめてみたのでみてみてください。
大きい表示はこちら
(別のタブもしくは別のウィンドウで開きます。)
はしょってシリアル番号を元に戻す方法だけ(RFC2182)
たとえばゾーンのシリアル番号が10であると仮定する。この値が誤って 1000に設定されてしまい、これを11に戻したい場合を考える。
①まずプライマリサーバのシリアル番号を2,000,000,000にして、セカンダリーサーバーがゾーンを 更新するのを待つ。
②シリアル番号を4,000,000,000にして、セカンダリーサーバーがゾーンを 更新するのを待つ。
③最後にシリアル番号を11にして、セカンダリーサーバーがゾーンを更新するのを待つ。
おしまいです。なんでこうなるのかはスライドをご一読くださったらもしかしたらなんとなくわかるかもしれません。
RFCの注意書きも読みましょう。
…関係する全サーバーが更新を行ったことを検証することが大切である。 本質的には、全ての事例においてシリアル番号の選択をより積極的な ものにすることで、2回の処理でシリアル番号を訂正することも可能である。 しかし、その場合使用されるシリアル番号はあまり"扱いやすい"ものでは なくなる(less nice)ので、より多くの注意が要求される。 また、全てのネームサーバー実装がシリアル番号処理を正しく 実装しているわけではないことに注意してもらいたい。…
興味があればRFCを読んでみてください。
とりあえずゾーンファイルのシリアル番号は小さい数に戻せるってことはわかりました。
トリビアです。
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 で実行してみる。今日はここまで。
HibernateProxyオブジェクトのinstanceof
- 2010-06-11 (Fri)
- Hibernate
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
- 2010-06-07 (Mon)
- MySQL
take©です。
PHP + MySQLで構築された、あるシステムの開発環境を構築したときに、SQLでエラーが発生したときのメモ。
INT型に空文字などを挿入するなど、制約違反なSQLを許可する場合、MySQLはmy.iniの設定でSTRICT_TRANS_TABLESを無効にすればよいみたいだ。
- Recent Comments
-
- Recent Trackback
- Search
- Meta
- Links
- Feeds