電子書籍の厳選無料作品が豊富!

プログラム初心者です

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)
));

}

よろしくお願いします

A 回答 (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だからいいじゃん」と言われればそれまでですが、気になるならばここまでやっておいても損はないでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/24 04:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!