Open Source WEB

ある朝、内村がパソコンに向かって、SVN(SubVersion)から最新のソースを落とすと、見慣れないコードが書いてあった。

if ( Session["user"] != null ) 
{
    // ログアウト
    Session["user"] = null;
    setMode( null );
    return;
}

string username = this.textUsername.Text;   // ユーザ名
string password = this.textPassword.Text;   // パスワード

SqlConnection cn = DataConnection.CreateInstance();
DataUser user = new DataUser( cn );
if ( user.Login( username, password ) == false ) 
{

確かログインするときのコードなのだが、昨日、書いたコードと何処かが違う。 ユニットテストを通すとオールグリーン、コードは正しいようだ。 ただ、何が違うのか、よくわからなかった。 なので、内村は SVN で DIFF を取ってみることにした。

SqlConnection cn = new SqlConnection();
cn.ConnectionString = "...";
SqlCommand cmd = new SqlCommand( 
    "select count(*) from User where " + 
    "username = '" + username + "' and " +
    "password = '" + password + "' ");
cn.open();
int count = cmd.Execute();
cn.close();
if ( count == 0 ) 
{

そうだ、確かここにログインのSQLを書いたはずなのだが、DataConnection とか、DataUser とか、見知らぬクラスが作られている。すっきりしているような気もするが、なんとなく腑に落ちない、何故だろう……。

「森川さ〜ん」、内村は隣で作業をしていた森川を呼ぶ。

「ここのところなんですけど…」

「ああ、そうそう。ここなんだけど、username とか password を直接使うと SQL インジェクションが発生してしまうんだよねぇ。それを昨日の夜に気付いたから、直したおいたんだ」

「僕の帰った後ですか?」

「そうそう、あまり残業はしないほうなんだけど、ちょっと書き換えたおいたんだけど、どう? 分かり易いでしょう?」

そう、確かにわかりやすい。SQL インジェクションをどう回避しているのかよくわからないけど、DataUser クラスの Login メソッドの中で回避しているはずだ。

「ほら」

public bool Login( string username, string password )
{
    string sql = @"
        SELECT UserID, NickName 
        FROM TUserInfo
        WHERE LoginName = @username and Password = @password
    ";

    SqlCommand cmd = new SqlCommand( sql, cn );
    cmd.Parameters.Add("@userName", username);
    cmd.Parameters.Add("@password", password);

    DataTable table = cmd.Execute();
    if ( table == null ) 
    {
        // ログインできなかった
        this.status = false;
        return false;
    }

    // ログインできた
    DataRow row = table.Rows[0];
    this.status = true;
    this.userID = (int)row["UserID"];
    this.nickName = (string)row["NickName"];

    return true;
}

なるほど、詳しくはよくわからないけど、これでいいらしい。

「これがコード共有ってものだよね〜」、森川が得意そうに言う。

・・・

と、内村はしばらくコードを眺めていたのだが、どうもよくわからない。

「すみません、森川さん、さっきのコードなんですけど…」

「何?」

「ここの@マークの意味がよくわからないんですけど」

「あぁ、え〜と、この@マークはSQLのプレコンパイルのためで…」、と森川。

「この cn って何処で宣言して…」、と質問する内村。

「え〜と、ここの private 変数で…」、と森川。

「DataConnectionの仕組みが不思議で…」、と質問する内村。

「これは、web.config から取得する…」、と森川。

「web.config って何ですか?」、と質問する内村。

「……」、答えるのに疲れた森川。

コード共有は、ペアプログラミングなどと一体でやらないと意味がない。こっそり直したコードは、あとで説明するのが苦労する、の巻である。


前回:テスト導入ふりかえり 次回:テスト可能な設計


コメントどうぞ!

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us