2009年10月15日木曜日

[Env] Linux Alias設定について

エイリアスは,ログイン時に,bashが起動され,その過程で設定されます。
※ 各ユーザのログインシェルは /etc/passwd に書かれています。

rootにログインすると,以下の順でスクリプトが実行されます。

・/etc/profile を実行

・/etc/profile.d/*.sh を実行

・/root/.bash_profile を実行

・/root/.bashrc を実行

最後の.bashrcに「alias cp='cp -i'」というエイリアスが書かれています。

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

一般ユーザの.bashrcには,このエイリアスは書かれていないことから,

OSの制限として, ルート権限により,無制限にファイルコピー,削除ができないようになっていると思われます。

※一般ユーザにも制限を適用する場合は/etc/profile, /etc/bashrcに記述するか/etc/skelに記述してしまえば良いです。


以上です。

2009読書リスト

8月
・レバレッジ・シンキング 本田直之
・仕事が3倍できる時間管理術
・陽気なギャングの日常と襲撃 伊坂幸太郎
・Gボーイズ冬戦争 石田衣良

9月
・会計天国
・LPIC Level1 試験対策
・業務システムのための上流工程入門
・RailsによるアジャイルWebアプリケーション開発

2009年10月14日水曜日

[OSS] 気になるオープンソースまとめ

いま気になっているオープンソースについてまとめておきます

Plone: アメリカで人気のCMS(他にも山盛りだが。。。)
Plone

Puppet: システム運用、デプロイ系
Puppet
Puppet記事

Maria: 次世代のMySQLストレージエンジン
Maria
記事


以上です。

2009年10月5日月曜日

[MySQL] バックアップと復元

MySQLのバックアップと復元コマンドをまとめました。
データベース名を指定してバックアップする:
mysqldump -u user_name -p -q db_name > backup.sql;

バックアップを復元する:
mysql -u user_name -p db_name < backup.sql;

テーブル名を指定してバックアップする:
mysqldump -u user_name -p -q db_name table_name > backup_table.sql;


以上です。

[MySQL] いろいろな実行手法

ストアドプロシージャを使用することで、SQLをファイル読み込み、実行できます(MySQL5.0~)

#/bin/sh
mysql -u username -p -D データベース < filename.sql(sql記述のみのファイル)



参考URL:
http://www.atmarkit.co.jp/flinux/special/mysql5/mysql5d.html

ヒアドキュメントを使用する方法です。
#!/bin/sh

mysql -u username --password='password' falcon << EOF use falcon; select c_date_ss from falcon.eagle_log; EOF 結果を格納する RESULT=`mysql -u username --password='password' falcon << EOF use falcon; select c_date_ss from falcon.eagle_log; EOF`


Perlのドライバを使った方が扱いやすいかも。ということで書いてみました。

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

my $conn = DBI->connect(
"dbi:mysql:dbname:localhost", "username", "password") or die "Cannot connect\n";

my $cursor = $conn->prepare(
"SELECT column1, coulumn2 FROM table_name WHERE column1=''") or die $conn->errstr;

$cursor->execute or die $conn->errstr;

while (my ($name, $region) = $cursor->fetchrow_array()){
print "$name\t$region\n";
}

$conn->disconnect;

以上です。

2008年8月21日木曜日

[Security]認証・認可処理のアンチパターン

WEBアプリケーションの認証処理でやってはいけないこと、その理由をまとめます。

Refererを認証・認可に使用しない
認証・認可にRefererを使用し、判定しているサイトがあるが、RefererはWEBブラウザから送信される情報で、容易に改ざん可能であるため、認証・認可に適さない。

認証・認可にDBを利用する場合、適切なエスケープを行うこと
認証・認可において、DBに保存しているユーザ情報を使用する場合、ユーザ入力値(ユーザIDやパスワード)は必ずエスケープすること。また、プリペアード・ステートメントを合わせて使用すること。

ユーザ名とパスワードが一致するレコードの有無で認証している場合、以下のようなロジックを実装することになる。(PHPの例)
$result = pg_query("SELECT * FROM user_table
                                WHERE user_name = '".$_POST['username']."
                                AND password = '".$_POST['username']."'");
if (pg_num_rows($result) === 1) {
    ログインOK
}

ここで、ユーザ名に「'"admin';--"」を入力すると次のようなSQLが発行され、認証に成功する。
SELECT * FROM user_table WHERE username = 'admin';
-- AND password = 'any_password' ← SQLの仕様上コメント扱いとなる。

また、入力値「"'OR 1=1;--"」も認証に成功する。
つまり、ユーザ名を知らなくても認証をバイパス可能となる脆弱性を埋め込むことになるわけです。

対策として、入力値を適切にエスケープし、シングルクォーテーションやダブルクォーテーションを無効化することが重要となる。

以上です。


2008年8月20日水曜日

[Java][Security]XSS対策

最近学んだ、XSS(クロスサイトスクリプティング)にたいする対策コードをまとめる。

XSSは動的にWEBページを生成するサイトの脆弱性を利用し、悪意あるスクリプトを混入させ、サイトを訪れたユーザに不利益となる操作を実行させるセキュリティ攻撃。

根本的な原因は、ユーザ入力に対するエスケープの未実施、または不適切なエスケープである。WEBアプリケーションにおいて、ユーザ入力をそのままHTMLに出力するようなロジックを使用していると、入力値に記述されたスクリプトが動作することを許容してしまう。

対策として、ユーザ入力を疑い、適切なエスケープを施すことが重要となる。

以下Javaにおける対策例。
public class HttpUtility {
    public static String escapeHTML(String str) {
        char c;
        StringBuffer returnStr = new StringBuffer();
        int length = str.length();
        for (int i = 0; i < length; i++) {
            c = str.charAt(i);
            if ( c == '<' ) {
                returnStr = returnStr.append("<");
            } else if ( c == '>' ) {
                returnStr = returnStr.append(">");
            } else if ( c == '&' ) {
                returnStr = returnStr.append("&");
            } else if ( c == '"' ) {
                returnStr = returnStr.append(""");
            } else {
                returnStr = returnStr.append(c);
            }
        }
        return new String(returnStr);
    }
}

以上です。