最初に $_GET を使用して送信されたものからいくつかの変数を割り当てる php ファイルがあります。
次に、いくつかの mysql クエリを実行し、出力を処理してから、いくつかのテキストと変数をエコーします。
コードで設定した唯一の保護はmysql_real_escape_string
、GET に対するものです。
それは攻撃を防ぐのに十分ですか?
他に何ができますか?
最初に $_GET を使用して送信されたものからいくつかの変数を割り当てる php ファイルがあります。
次に、いくつかの mysql クエリを実行し、出力を処理してから、いくつかのテキストと変数をエコーします。
コードで設定した唯一の保護はmysql_real_escape_string
、GET に対するものです。
それは攻撃を防ぐのに十分ですか?
他に何ができますか?
まあ、あなたはmysql_real_escape_string
ひどく間違っています。
しかし、それはあなたのせいではありません。それは、PHP 社会で最も邪悪な妄想の 1 つです。公式のマニュアルページでさえ、すべて間違っています。
この関数は、一般的に何かを保護することとは何の関係もありません。特に GET 変数
この関数は、文字列区切り文字をエスケープして、文字列区切り文字が文字列を分割できないようにするだけです。したがって、2 つの最も重要な結果:
mysql_real_escape_string()
は、ソースや起源、危険性の可能性に関係なく、で処理する必要があります。したがって、SQLクエリを保護するには、「mysql_real_escape_stringでデータをサニタイズする」だけでなく、一連のルール全体に従う必要があります。
同様のトピックに関する私の以前の回答から、SQL を保護する方法を学ぶことができます。
シナリオを更新
して、mysql_real_escape_string が特効薬ではない理由を示します
URL
http://www.example.com/news.php?offset=99999+UNION+SELECT+password+FROM+users+--で指定
コード
$offset = mysql_real_escape_string($_GET['offset']);
$sql = "SELECT title FROM news LIMIT $offset,20";
小さなボビーテーブルほど豪華ではないにしても、それほど悲惨ではありません。
いいえ、防御できない攻撃がたくさんあります。その一例が CSRF です。これは大きな分野なので、Owasp サイトで次の内容を読むことをお勧めします。
これを使用するだけでは十分ではありません。SQLインジェクションだけを考えても十分ではありません。文字列のみでSQLインジェクションを検討する場合は十分ですが、整数(IDなど)を取得するとすぐに問題が発生します。
http://example.com/foo.php?id=10
通過します:
$q = "SELECT * FROM foo where id = " + mysql_real_escape_string($_GET['id'])
これにより、次の SQL クエリが生成されます。
SELECT * FROM foo where id = 10
これは、たとえば次のように簡単に悪用できます。
http://example.com/foo.php?id=10%3B%20DROP%20TABLE%20foo
通過します:
$q = "SELECT * FROM foo where id = " + mysql_real_escape_string($_GET['id'])
これにより、次の SQL クエリが生成されます。
SELECT * FROM foo where id = 10;DROP TABLE foo
これで十分ではない理由が明確になることを願っています。
これをどのように解決する必要がありますか?許可される入力を定義し、入力が実際にその形式であることを確認します。たとえば、次のようになります。
if(preg.match("^[0-9]+$",$_GET['id']){
// your code here
}else{
// invalid id, throw error
}
しかし、(SQL インジェクションに関して) 安全を確保する最善の方法は、準備済みステートメントを使用することです: http://php.net/manual/en/pdo.prepared-statements.php
isset() および empty() 関数を使用して get 変数に値がある場合は、