• ベストアンサー

セキュリティ

プログラム初心者です PDOやる前にmysqliの手続き型で勉強中です 手続き型でフォームから入力された値をこんな感じにするのは危険でしょうか? 悪意を持ったユーザーに簡単に突破されますか? if(!empty($_POST['name'])){ $sql = sprintf('SELECT * FROM hoge WHERE name="%s"', mysqli_real_escape_string($link,$_POST['name']) ); } 更新するとき if(!empty($_POST['name'])){ mysqli_query($link,sprintf('UPDATE hoge SET name="%s" WHERE id=%d', mysqli_real_escape_string($name), mysqli_real_escape_string($link,10) )); } よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

セキュリティ上の危険はないと思いますが、普通はプリペアドステートメントを使います。 http://php.net/manual/ja/mysqli.prepare.php 【習得難易度】 [○] Mysql関数(非推奨) < PDOクラス < Mysqli関数 = Mysqliクラス [△] 【おすすめ度】 [○] PDOクラス > Mysqliクラス > Mysqli関数 > Mysql関数(非推奨) [△] Mysqliから入ってもいいですが、かえって足かせになるような気がしないでもないですね・・・Mysqliをわざわざ選ぶ人と言えば「チューニングに拘るベテラン」か「クラスとオブジェクトを毛嫌いする初心者」ぐらいしかいないでしょう・・・ 以下蛇足 emptyはissetの機能に加えて空文字列を弾くようにもなっていますが、空文字列だけでなく文字列「0」を弾いてしまいますので、一般的にはあまり用いられません。 http://php.net/manual/ja/types.comparisons.php 厳密に「空でない文字列」だけを許容するようにしたければ if ( ____isset($_POST['name']) && ____is_string($_POST['name']) && ____$_POST['name'] !== '' ) { .... .... } という条件になります。 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea 各項目に対して毎回このように記述するのが煩わしかったり、配列をフォームから受け取る必要があって子要素までの厳密なチェックが手に負えなくなると感じる場合、こういった関数を用意しておくのも1つの手です。 http://qiita.com/mpyw/items/c39b9ee695a5c2e74627 「ここまで厳密にしなくても本番環境ではどうせdisplay_errors=Offだからいいじゃん」と言われればそれまでですが、気になるならばここまでやっておいても損はないでしょう。

flash0
質問者

お礼

回答ありがとうございます 手続き型でもプリペアドステートメント使えるんですね。勉強になりました emptyも使い方を気を付けます。

すると、全ての回答が全文表示されます。

関連するQ&A