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に関する文書は見つかりませんでした。

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/02/04 10:40:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59

ポイント70pt

>色々あたってみたのですが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は使わずに値の妥当性をチェックしたり、出力する際にも再度、値に変なものが混じっていないかチェックした方がいいと思います。

id:gelgelgel

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

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

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

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

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

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

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

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

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

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

2009/02/03 00:04:12

その他の回答1件)

id:minkpa No.1

回答回数4178ベストアンサー獲得回数55

id:gelgelgel

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

2009/02/02 23:53:15
id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59ここでベストアンサー

ポイント70pt

>色々あたってみたのですが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は使わずに値の妥当性をチェックしたり、出力する際にも再度、値に変なものが混じっていないかチェックした方がいいと思います。

id:gelgelgel

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

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

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

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

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

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

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

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

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

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

2009/02/03 00:04:12
  • id:tobeoscontinue
    >{php}{/php}で囲むやり方は推奨されないと
    >書籍には書いてあったのですがどうなんでしょうか?
    Smartyはテンプレートエンジンなので主な処理はphp側で書けという意味で
    『推奨されない』としているのではないでしょうか。(憶測)
    Smartyを主として書いてあるのであれば{php}{/php}の中に書くのも有りだと思います。
    Smartyで書いてもコンパイルでphpに変換される(確か)ので結局は同じだと思います。

    >オープンソースのEC-CUBEなどでもそのようなやり方は
    >していないと思うのですが一般的なやり方なのでしょうか?
    EC-CUBEなどの大きなものでは多くをphp側で書いているので、わざわざ一部だけ
    {php}{/php}でテンプレートの中で記述する意味がないと思います。

    Smartyの関数や修飾子だけでは実現できないちょっとした機能は{php}{/php}で書くというのは
    有りだとは思いますが。

    >かなり小さなサイトでも攻撃する人っているんですかね?
    私の管理していたサイトは日に数人がアクセスする程度でしたが、改竄と流出をされてしまいました。
    私のサイトが他のサイトにリンクされ、そのサイトが外国のサイトにリンクされていたので、その
    せいではないのかなぁと思っています。

    改竄の恐怖は実際、経験してみないと判らないかもしれません。当然見えるべきものでないものを
    見せらせるのです。しばらくはリンクをクリックするのが恐怖でした。

    攻撃されると被害者だと思いがちですが、流出は利用者にとっては加害者となってしまいます。

    またレンタルやホスティングで攻撃を許してしまうと回りに影響を与えてしまうことも考えられます。
    被害者はまだしも加害者にはならないように対策をたてておくのは重要な事だと思います。
    攻撃を受ける側は有限(時間や対策)ですが攻撃する側は何時、何処から、どのようにも攻撃が可能
    で、断然、攻撃する側が有利なのです。
    利用者に迷惑のかからない視点での対策は必要だと思います。
  • id:gelgelgel
    丁寧なご回答ありがとうございます。

    >Smartyはテンプレートエンジンなので主な処理はphp側で書けという意味で
    >『推奨されない』としているのではないでしょうか。(憶測)
    はい、そのとおりです。あまりにもSmartyにこだわり過ぎるのも
    どうかということですね。

    >EC-CUBEなどの大きなものでは多くをphp側で書いているので、わざわざ一部だけ
    >{php}{/php}でテンプレートの中で記述する意味がないと思います。
    >
    >Smartyの関数や修飾子だけでは実現できないちょっとした機能は{php}{/php}で書くというのは
    >有りだとは思いますが。

    私は「SQLインジェクションの回避方法」ではなく
    「SmartyでのSQLインジェクションの回避方法」が知りたかったので、
    全くできないなら別ですが、
    できるのであればその方法が知りたかったです。
    (たとえ難しくても知った上で取捨選択したかった)

    SQLインジェクションの被害についてのお話も大変参考になりました。
    これからもいろいろ勉強して加害者にならぬよう対策を取りたいと思います。

    ありがとうございました。



この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません