Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
ある朝、内村がパソコンに向かって、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 って何ですか?」、と質問する内村。
「……」、答えるのに疲れた森川。
コード共有は、ペアプログラミングなどと一体でやらないと意味がない。こっそり直したコードは、あとで説明するのが苦労する、の巻である。
前回:テスト導入ふりかえり 次回:テスト可能な設計
There is no comment.