人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SmartyでのSQLインジェクションについてのご質問です。
参考書を見たところPHPでは

------------------------------------------------------------
$stt=$db->prepare("INSERT INTO article (url,title,published) VALUES($_POST['url'],$_POST['title'],$_POST['published'])");

↓以下に変換

$stt=$db->prepare("INSERT INTO article (url,title,published) VALUES(?,?,?)");
$db->execute($stt,array($_POST['url'],$_POST['title'],$_POST['published']))
------------------------------------------------------------

で防げると参考書に書いてあったのですが、
Smartyではどのようにすれば良いのでしょうか?

色々あたってみたのですがPHPばかりで、Smartyに関する文書は見つかりませんでした。

上記以外でもよりシンプルに防げる方法がありましたら
ご教授お願い致します。

●質問者: gelgelgel
●カテゴリ:インターネット ウェブ制作
✍キーワード:dB PHP Smarty SQLインジェクション URL
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● minkpa
●0ポイント

http://study.rakuto.net/php/smarty0/smarty1/

◎質問者からの返答

これには載ってないと思うのですが・・。


2 ● tobeoscontinue
●70ポイント ベストアンサー

>色々あたってみたのですがPHPばかりで、Smartyに関する文書は見つかりませんでした。

{php}
$stt=$db->prepare("INSERT INTO article (url,title,published) VALUES(?,?,?)");
$db->execute($stt,array($_POST['url'],$_POST['title'],$_POST['published']));
{/php}

のように{php}タグで囲めば直接phpコードを記述できますがSmartyはロジック部分を分離することも一つの目的だと思いますので逆行しているようにも見えます。

とくにDB操作はロジックが長くなりがちなのでテンプレートの中で記述するのはおすすめできません。

register_function() テンプレート関数プラグインで記述することでテンプレートから使用することはできますが結局はphpで記述しなければなりませんし、引数の渡しとか、制御のタイミングとか細かな操作がしにくいように思いますので、DB部分は普通にphpで記述して結果をassign()で渡してやった方が簡単だと思います。


>で防げると参考書に書いてあったのですが、

私もSQLインジェクションについてはprepare、executeの組合せがベストだと思っていますが攻撃はインジェクションだけではありません。

裸の$_POSTは使わずに値の妥当性をチェックしたり、出力する際にも再度、値に変なものが混じっていないかチェックした方がいいと思います。

◎質問者からの返答

ご回答ありがとうございます。

わたしはSmartyに関しては素人なのでよく分かりませんが、

{php}{/php}で囲むやり方は推奨されないと

書籍には書いてあったのですがどうなんでしょうか?

オープンソースのEC-CUBEなどでもそのようなやり方は

していないと思うのですが一般的なやり方なのでしょうか?

答えていただいたのに大変失礼ですが、

ちょっとすんなり納得いかない部分があります。

>裸の$_POSTは使わずに値の妥当性をチェックしたり、出力する際にも再度、値に変なものが混じっていないかチェックした方がいいと思います。

ありがとうございます。かなり小さなサイトでも攻撃する人っているんですかね?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ