プログラム初心者です
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)
));
}
よろしくお願いします
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だからいいじゃん」と言われればそれまでですが、気になるならばここまでやっておいても損はないでしょう。
回答ありがとうございます
手続き型でもプリペアドステートメント使えるんですね。勉強になりました
emptyも使い方を気を付けます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PHP PHPでMysqlにデータがあるかどうか判別したい 1 2023/03/02 11:48
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
scanfでの読み込み文字数制限
-
VBA で、スペースを含むファイ...
-
phpで変数を使ってcopyできない
-
サブフォルダ内の全てのテキス...
-
PHPからHTMLへの変数の受け...
-
【PHP】void関数についてよく理...
-
fputcsv()で1レコード1行になる...
-
UPDATEできない
-
セキュリティ
-
$_REQUESTの意味を教えて下さい
-
SQLインジェンクション対策法を...
-
csvファイルチェック
-
パラメータを2個つけたい
-
foreachがうまく動かない
-
if文のもっとスマートな書き方
-
Emacs Lisp: 関数に引数が渡せ...
-
IPアドレスによる振り分け
-
laravelを利用してコントロール...
-
<input type="hidden" >で配列...
-
PHPの関数実行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA で、スペースを含むファイ...
-
ファイル名を変更してアップロ...
-
アップロードファイル名の文字化け
-
PHPからHTMLへの変数の受け...
-
プログラミングC++のmapについて
-
phpで変数を使ってcopyできない
-
Flaskでサーバー立ち上げに関して
-
SQLインジェンクション対策法を...
-
POSTの項目に追加
-
パラメータを2個つけたい
-
サブフォルダ内の全てのテキス...
-
フォームで送られてきたメール...
-
PHP FTPサーバへの画像アップロ...
-
name属性が全角の場合・・・
-
if function PHP
-
連想配列を複数条件で比較して...
-
マクロ(VBA)について
-
PDOのprepareでLIKEの部分一致...
-
テキストボックスの値を取得したい
-
画像をDBに登録できない
おすすめ情報