現在、PHPでのセキュリティ対策の一環として、SQLインジェンクション対応のためのユーザ入力値をチェックするための関数を検討しています。
以下のサイトなどを参考に、以下のようなサンプルコードを検討してみました。
特筆すべき点は、PHPのマジッククォートがONになっているかどうかのチェックを最初に入れ、余分に不正コードをエスケープしないようにしたことでしょうか。
あまりセキュリティについて詳しくないので、有識者の方の見解を伺いたく投稿いたしました。その他付け加えるべきチェックなどありましたら、ご意見賜りたく存じます。
(参考にしたサイト)
http://jp.php.net/manual/ja/security.database.sq …
(サンプルコード)
function str_check($value)
{
// strip slashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// quote except numbers
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
(使用例)
$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
str_chec($_POST['username']),
str_chec($_POST['password']));
mysql_query($query);
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
インジェクション処理にはやりすぎと言うものはありません。
どんなにチェックしても抜けるときは抜けますので
「余分にエスケープしない」など考える余裕はないはずです。
以下注意すると方針がきめやすくなると思います
・基本はエスケープしづらいshiftjisは排除する。
・各SQL用に用意されたエスケープ関数は積極的に使う
例:mysql_real_escape_string()とかpg_escape_string()
・怪しいデータがとんできたときはとにかく早期にはじく
No.1
- 回答日時:
無識者です.
処理の定義域と値域を考えることが大切です.
処理が何を入力として取り,何を出力するかですね.
str_checで考えれば,定義域はユーザIDか,パスワードですが
単に何かの文字列というだけで何が入っているかや長さは不明です.
JavaScriptで入力を制限していたとしても,攻撃者の作ったフォームから送信されたら終わりですね.
ですから,値域はstripslashesでバックスラッシュが取り除かれ
mysql_real_escape_stringでエスケープ関連の文字が取り除かれ?た長さ不明の文字列です.
英数字以外に漢字やひらがなが混じっているかもしれません.
次にsprintfですが,入力が何が入っているともわからない長さ不明の(いちおう危なそうな文字は除いた)文字列が定義域です.
となると,値域はSQL文に内容不明の文字列が含まれる長さ不明の文字列です.
という風に,考えていくとあなたがSQL文に与えるクエリは内容不明,長さ不明の危なっかしい文字列だと言うことになります.
ユーザ名とパスの文字種別と長さを確認するだけでだいぶよくなります.
またこの場合は処理の大半が外部の関数に丸投げされていますが
使っている関数の入出力,それが本当に信用できるかも確認した方が良いです.
古いバージョンなら既知の脆弱性がある可能性がありますし,
新しい脆弱性が見つかる可能性があるのでこまめに確認が必要です.
と,素人が何となく思い浮かぶくらいでこれくらいありますね.
間違った内容があるかもしれませんが,プロならもっと考慮すべき事項があるかもしれません.
詳細なコメントありがとうございました。
たしかに、セキュリティ対策って対策を施してもまた破られたり、イタチごっこだったりすることもあるので、難しいですよね。いろいろな観点から、もう少し考えをめぐらせてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP php ログイン 1 2022/11/01 00:24
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP php テーブルが作成できない 1 2022/11/17 23:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLインジェンクション対応...
-
ヒットする初回のみ置換する方法
-
bashで文字列に含まれる//(ス...
-
sedでの最短一致の書き方
-
正規表現でシングルクォーテー...
-
VBAのコマンドボタンの文字列の...
-
delphi でのコード上でTab を入...
-
reuterの記事をbeautiful.soup....
-
全角英数文字が嫌われる理由を...
-
セッションが文字化け、エンコ...
-
nl2brを使用すると<br />が挿入...
-
SJIS→UTF-8変換後の文字化けに...
-
半角記号、全角記号を含む正規...
-
VC++のボタン
-
数値をASCII文字にする方法につ...
-
C# DataGridViewのセルを改行禁...
-
文字の入力で横バー上段、中断...
-
Objective-c 改行コードによる...
-
VBAを使ってHTMLソースから特定...
-
Shift-JISの文字と改行コードに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
VBSで"をエスケープする文字は?
-
○分から○時間○分に変換
-
文字列の置換をCStringで(C++)
-
PHP・Wordpress preg_replaceを...
-
PHPの¥
-
php 正規表現で、\\マークを取...
-
nl2brが効かないのですが・・・
-
近似した文字列を置換するエク...
-
文字列の括弧について(初心者)
-
ダブルクォーテーションが置換...
-
(から)までの文字列を削除したい
-
c# string型の変数に、ダブルク...
-
PHPで任意の数の行抽出
-
【php】二進数をフラグとして扱...
-
【PHP】preg_replace() で正...
-
2バイトローマ数字小文字につ...
-
文字列から、特定の文字を削除...
-
PHPで文字列をエンコード↔デコ...
-
SQLインジェンクション対応...
おすすめ情報