参考書を見たところ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に関する文書は見つかりませんでした。
上記以外でもよりシンプルに防げる方法がありましたら
ご教授お願い致します。
>色々あたってみたのですが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は使わずに値の妥当性をチェックしたり、出力する際にも再度、値に変なものが混じっていないかチェックした方がいいと思います。
>色々あたってみたのですが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は使わずに値の妥当性をチェックしたり、出力する際にも再度、値に変なものが混じっていないかチェックした方がいいと思います。
ありがとうございます。かなり小さなサイトでも攻撃する人っているんですかね?
ご回答ありがとうございます。
わたしはSmartyに関しては素人なのでよく分かりませんが、
{php}{/php}で囲むやり方は推奨されないと
書籍には書いてあったのですがどうなんでしょうか?
オープンソースのEC-CUBEなどでもそのようなやり方は
していないと思うのですが一般的なやり方なのでしょうか?
答えていただいたのに大変失礼ですが、
ちょっとすんなり納得いかない部分があります。
>裸の$_POSTは使わずに値の妥当性をチェックしたり、出力する際にも再度、値に変なものが混じっていないかチェックした方がいいと思います。
ありがとうございます。かなり小さなサイトでも攻撃する人っているんですかね?