-2

OK、ページの URL に変数を渡す PHP があります。PHP ページは「item1」という名前の変数を取得し、次のように変数の前に文字列を追加します (例として、変数が 10 であるとします)。

$v1 = $_GET['item1'];
echo "$v1"; 
$v2 = 'table-';
$v3 = $v2.$v1;
echo "$v3";

これにより、Web ページに「table-10」が出力されます。素晴らしい。

これを MySQL の select ステートメントに渡し、"table-10" という名前のテーブルをクエリできるようにします。

$sql = "select * from $v3"; 
       $result = mysql_query ($sql);

ただし、これは機能しません。私はここで本当に愚かなことをしていますか?どんな助けでも大歓迎です。

編集:

すべてのヘルプ担当者に感謝します。SQLi インジェクションに関しては、コメントを歓迎しますが、これはローカルのみのシステムであり、外部への露出がまったくないため、エクスプロイトは現状ではかなり重要ではありません。このシステムは概念実証にすぎないため、実際に完全なシステムを構築するときに、エクスプロイトが含まれていないことを確認します。この問題は、バックティックを使用することで解決されました。どうもありがとうございました!

4

3 に答える 3

0
  1. テーブル名にはハイフンが含まれているため、mySQLがテーブル名を認識できるようにするには、SQL文字列のバックティック文字でテーブル名をラップする必要があります。例えば:

    SELECT * FROM `table-10`
    
  2. テーブル名の一部を変数として受け入れるため、$_GETSQLインジェクション攻撃に対して脆弱です。これは、ハッカーが$_GET['item1']他のSQLコマンドを含む値を投稿し、知らないうちにそれらのコマンドを実行する可能性があることを意味します。これを行うことにより、彼がデータベースから必要なデータを見つけたり、データを変更したりすることが可能になります。

    これを回避するには、入力を「サニタイズ」する必要があります。あなたの場合、値は常に数値でなければならないことがわかっているので、値を整数にするだけで十分であり、ハッカーが渡す可能性のある卑劣な余分なクエリデータを破棄することができます。例えば:

    $v1 = (int)$_GET['item1'];
    

    item1渡されない場合は、参照しようとするとPHPが警告メッセージをスローすることにも注意してください。今は無視しますが、おそらく修正する必要があります)

  3. DB構造についてはあまり情報を提供していませんが、提供したコードに記載されているヒントは、データベースの設計が非常に貧弱であることを示しています。これは大きなトピックであるため、ここではあまり詳しく説明しませんが、WHERE句のないselectの場合と同様に、動的テーブル名は通常は悪い考えであると言えば十分です。またSELECT *、フィールドを明示的に指定する方がよいため、一部のサークルでは眉をひそめています(ただし、フィールド*が多数ある場合は便利なショートカットになる可能性があります)。

  4. mysql最後に、古い関数の使用は避けてください。それらは廃止されました。mysqliライブラリは非常によく似ており、簡単に切り替えることができます。(古い関数に基づいたチュートリアルを読んでいる場合はmysql、より良いチュートリアルを見つける必要があります!)

于 2013-02-14T16:33:52.260 に答える
0

次のようにクエリを使用します

$sql = "select * from '$v3'"; 
       $result = mysql_query ($sql);

mysql_* https://wiki.php.net/rfc/mysql_deprecationを使用しないでください。代わりに mysqli_* を使用してください

として使用します

 $sql = "select * from '$v3'"; 
           $result = mysqli_query ($sql);

それでも、SQL インジェクションに対して脆弱です。

使用する

mysqli_real_escape_string



$v3= $mysqli->real_escape_string($v3);


   //Now this is the string with special chars escaped

そして今、それをクエリで次のように使用します

$sql = "select * from '$v3'"; 
           $result = mysqli_query ($sql);

simonwhatleyブログの記事で、その説明と対処方法が説明されています。

于 2013-02-14T16:11:47.890 に答える
0

これを試して:

$result = mysql_query ($sql) or die(mysql_error());

ところで、あなたのコードはSQL インジェクションに対して脆弱です。mysql_* 関数の代わりに PDO 拡張を使用します。

于 2013-02-14T16:12:20.497 に答える