General

アンケートにご協力お願いします

2008年2月18日

RSSフィードで購読なさっている方へ:アンケートにご協力お願いできますでしょうか。

Jeans CMSにおいては、いくらか規約を設けることでセキュリティーを確保する予定です。ただ、規約があまりにも複雑で敷居が高すぎる場合、その規約が守られないことになってしまいます。過ぎたるは及ばざるが如しにならないように、うまく規約を設定する必要があります。

SQLインジェクションを防ぐため、SQLクエリー実行部分のスクリプトの記述に関して規約を作る必要があるのですが、ここでプリペアードステートメントを使用することを規約とするかどうか、悩んでいます。

例えば、次のスクリプトは、現在のNucleusで使われている様式です。

コード0:現在のNucleus様式
$res=mysql_query(
    'SELECT i.itime as itime, c.cblog as blogid, substr(i.itime,0,4) as year, substr(i.itime,5,2) as month, substr(i.itime,8,2) as day, '.
    'FROM jeans_item as i, jeans_category as c '.
    'WHERE i.icat=c.catid AND c.cblog='.intval($blogid).' '.
    ' AND c.catid='.intval($catid).' '.
    'ORDER BY i.itime DESC LIMIT '.intval($limit));


今のJeansの様式では、2通りの記述の仕方があります。

コード1:Jeans様式1
$res=sql::query(
    'SELECT i.itime as itime, c.cblog as blogid, substr(i.itime,0,4) as year, substr(i.itime,5,2) as month, substr(i.itime,8,2) as day, '.
    'FROM jeans_item as i, jeans_category as c '.
    'WHERE i.icat=c.catid AND c.cblog=<%1%> '.
    ' AND c.catid=<%2%> '.
    'ORDER BY i.itime DESC LIMIT <%3%>',
    array($blogid,$catid,$limit));

コード2:Jeans様式2
$res=sql::query(
    'SELECT i.itime as itime, c.cblog as blogid, substr(i.itime,0,4) as year, substr(i.itime,5,2) as month, substr(i.itime,8,2) as day, '.
    'FROM jeans_item as i, jeans_category as c '.
    'WHERE i.icat=c.catid AND c.cblog=<%blogid%> '.
    ' AND c.catid=<%catid%> '.
    'ORDER BY i.itime DESC LIMIT <%limit%>',
    array('blogid'=>$blogid,'catid'=>$catid,'limit'=>$limit));

現在導入を検討中のPDO (PHP Data Object)は、プリペアードステートメントを実装しているのですが、これを用いて記述すると、例えば次のような感じになります。

コード3:PDO様式1
$sth=sql::prepare(
    'SELECT i.itime as itime, c.cblog as blogid, substr(i.itime,0,4) as year, substr(i.itime,5,2) as month, substr(i.itime,8,2) as day, '.
    'FROM jeans_item as i, jeans_category as c '.
    'WHERE i.icat=c.catid AND c.cblog=? '.
    ' AND c.catid=? '.
    'ORDER BY i.itime DESC LIMIT ?');
$sth->execute(array($blogid,$catid,$limig));

コード4:PDO様式2
$sth=sql::prepare(
    'SELECT i.itime as itime, c.cblog as blogid, substr(i.itime,0,4) as year, substr(i.itime,5,2) as month, substr(i.itime,8,2) as day, '.
    'FROM jeans_item as i, jeans_category as c '.
    'WHERE i.icat=c.catid AND c.cblog=:blogid '.
    ' AND c.catid=:catid '.
    'ORDER BY i.itime DESC LIMIT :limit');
$sth->bindParam(':blogid', $blogid);
$sth->bindParam(':catid', $catid);
$sth->bindParam(':limit', $limit);
$sth->execute();

ここで質問です。もし、上記のコード0ではなくて、コード1からコード4までのいずれかを用いることを規約とした場合、プラグインを作成するときにその規約を守りますか?あるいは、規約は守らずに、コード0のように記述しますか?

解答例 コード1もしくはコード3なら良いが、コード2やコード4は良く分からないので使わない場合は、1:○ 2:× 3:○ 4:×

解答は、下のコメントにお願いします。氏名欄は、『アンケート』で結構です。プリペアードステートメントが何なのかを理解する必要はありません。むしろ、これを良く知らない人のご意見が知りたいです。プロの方や良くご存知の方は、当然ながら積極的に使おうとなさると思いますので。

よろしくお願いします。

コメント

Andy (2008年2月19日 01:25:56)

1:○ 2:○ 3:○ 4:○
4はちょっと鬱陶しい感じもしますが,これが役立つような場面もあるかもしれません(パラメータが一つずつ距離を置いて決まっていくような場合)。

Kimitake (2008年2月19日 20:59:22)

1:x 2:o 3:x 4:o
かな。特に4は◎
パラメータがどこでどう使われてるか、きちんと把握しやすそうなので。

mas (2008年2月20日 02:19:45)

kimitakeさんに同じです。
1:x 2:o 3:x 4:o

1と3はちょっとわかりにくいです。2と4が断然うれしいです。
一番好きなのは2ですね。

プリペアードステートメイントはよく知りません(///)

Kat (2008年2月20日 12:34:03)

なるほど、どうも有り難うございます。まだ皆さんの意見にはコメントせずに、もう少しアンケートを続けたいと思います。

アンケート (2008年2月21日 02:34:53)

1:○ 2:○ 3:○ 4:○

他の人が後からコードをいじることを考えると2、4ですかね

佐藤(な) (2008年2月21日 19:57:29)

1:o 2:o 3:x 4:o
3だと、変更時ちょんぼしそうです。(自分

Kat (2008年2月23日 19:47:06)

みなさん、どうも有り難うございます。

アンケートを行ってみて、プリペアードステートメントやテンプレート挿入式に、みなさんそれほど違和感が無いことが分かりました。

2は、NucleusのTEMPLATE::fillと同じ方式です(サニタイズして挿入する所が違いますが)。Nucleusでプラグインを書いたことのある方なら、なじみがある方法だと思います。Jeansでも、SQLクエリーと、HTMLタグ表示の部分で、これを用いています。

結論としては、やはりPDOを利用することになると思います。プリペアードステートメントの利用は、SQLインジェクションを防ぐには一番だと思いますので。

規約としては、基本的に2または4を用い、パラメータが一つだけの場合は1または3も良いという事になりそうです。

コメント送信