独学数ヶ月の初心者の質問で恐縮です。
もろもろの事情で仕方なくmysql_real_escape_stringを
以下(1)のように使用しなくてはならないと仮定し、
セキュリテイの面で(2)のようにシングルクオテーションつける
事で危険を回避できますか?
またシングルクオテーションは(2)のようにつけてはいけない
とかありますか?(記述の基本が曖昧なため、ただの確認の質問)
(1)
$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",
mysql_real_escape_string($id),
mysql_real_escape_string($password));
(2)
$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",
’mysql_real_escape_string($id)’,
’mysql_real_escape_string($password)’);
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
まずmysql_real_escape_string自体がmysql系の古い関数なので非推奨です。
独学で学習されているのでしたら、参考にしている書籍やサイトを新しいものに変えてください。
最低でもmysqli系の処理に置き換えてください。
また$idや$passwordなど管理側が仕様を指定できるものは
・m文字以上でn文字以下であること
・構成文字が英数字のみに限られること
などをチェックして、そうでない場合はエラーを返すような仕様にしておけば
あえてエスケープする必要はありません
任意の文字列を利用して検索をかけたりするような場合はPDOを利用し、
プリペアドステートメントで処理するのが妥当だといわれています。
詳しいご回答と、アドバイスありがとうございます。
管理側で仕様を指定する事でエスケープが不要というのは
勉強になりました。(m文字以上n文字以下、の意味が
ちょっとわからないので勉強します。)
ありがとうございました。
No.3
- 回答日時:
「mysql_real_escape_stringを使うな」というのが正論なのですが、
>もろもろの事情で仕方なくmysql_real_escape_stringを
ということなので、回答しようかと思いましたが、(2)のようなプログラムを書く人であれば、やはり、生のmysql関数は使ってはいけません。
>PDOを利用し、プリペアドステートメントで処理する
でしょうね。それ以前にPHPの基本的な事柄についての理解を深める必要があります。
>$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",’mysql_real_escape_string($id)’,’mysql_real_escape_string($password)’);
を実行すると、$sql は、
SELECT id , password FROM `adminDatabase` where id = 'mysql_real_escape_string($id)' and password = 'mysql_real_escape_string($password)' order by id
になりますよ。
ご指導ありがとうございます。
シングルクオテーションで囲むと、囲まれたところが全て
文字になってしまうという事ですね。
勉強不足を解消したくググッてもうまく求めているものに対する
答えに到達できません。
(危険回避にシングルクオテーションを使用する事を
どこかで中途半端に覚えてしてしまったのが混乱の始まりです。)
PDOで書くのが良い等の情報も得ていますが、色々もろもろの事情で仕方なく
あえてmysql_real_escape_stringを使わなくてはいけないと仮定した場合、
本当にプログラムを熟知している人は、この条件化でどのように記述するのか
が知りたかったです。
色々ありがとうございます。
もっともっとがんばって調べてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
[MySQL] 3つのテーブルの結合で...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
SQLサーバから、項目の属性(型...
-
上位3位を求めるSQL文は?
-
副問合せの書き方について
-
SQL Left Join で重複を排除す...
-
SQLにて特定の文字を除いた検索...
-
[MySQL] UNIQUE制約の値を更新...
-
Access パラメータクエリをcsv...
-
selectした大量データをinsert...
-
親と子供が複数のSQL取得方法
-
テーブルが5つの時の結合の仕...
-
書籍の内容はまともでしょうか?
-
クエリ表示と、ADOで抽出したレ...
-
【SQL文】Insert into文で文法...
-
VIEWの元のテーブルのindexって...
-
inner joinをすると数がおかし...
-
Mysqlでunionを使った検索速度...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
VIEWの元のテーブルのindexって...
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
select文のwhere句に配列を入れ...
-
sqlで、600行あるテーブルを100...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
Unionした最後にGROUP BYを追加...
-
期間の重複を調べるSQL文につい...
-
クエリ表示と、ADOで抽出したレ...
-
Access パラメータクエリをcsv...
-
PL/SQLの変数について
-
MySQLのDATE型カラム値がNULLの...
-
php+mysqlで複数選択削除について
-
上位3位を求めるSQL文は?
おすすめ情報