0

最初に $_GET を使用して送信されたものからいくつかの変数を割り当てる php ファイルがあります。

次に、いくつかの mysql クエリを実行し、出力を処理してから、いくつかのテキストと変数をエコーし​​ます。

コードで設定した唯一の保護はmysql_real_escape_string、GET に対するものです。

それは攻撃を防ぐのに十分ですか?

他に何ができますか?

4

5 に答える 5

5

まあ、あなたはmysql_real_escape_stringひどく間違っています。
しかし、それはあなたのせいではありません。それは、PHP 社会で最も邪悪な妄想の 1 つです。公式のマニュアルページでさえ、すべて間違っています。

この関数は、一般的に何かを保護することとは何の関係もありません。特に GET 変数

この関数は、文字列区切り文字をエスケープして、文字列区切り文字が文字列を分割できないようにするだけです。したがって、2 つの最も重要な結果:

  • GET 変数だけでなく、引用符で囲まれたクエリに入れられるすべての変数mysql_real_escape_string()は、ソースや起源、危険性の可能性に関係なく、で処理する必要があります。
  • 引用符で囲まれた文字列のみに影響します。この関数をクエリの他の部分、たとえば LIMIT 句の変数に使用してもまったく役に立ちません。

したがって、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";

小さなボビーテーブルほど豪華ではないにしても、それほど悲惨ではありません。

于 2011-03-02T09:36:19.253 に答える
0

いいえ、防御できない攻撃がたくさんあります。その一例が CSRF です。これは大きな分野なので、Owasp サイトで次の内容を読むことをお勧めします。

http://www.owasp.org/

于 2011-03-02T09:30:54.180 に答える
0

これを使用するだけでは十分ではありません。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

于 2011-03-02T11:05:51.703 に答える
-1

isset() および empty() 関数を使用して get 変数に値がある場合は、

于 2011-03-02T09:25:28.913 に答える