1

テーブルがすでに存在する場合にテーブルを削除する関数を作成しています。それはユーザーにテーブルを何と呼びたいかを尋ね、その応答を受け取り、それをphp変数に入れます。sqlでエラーが発生しないように、sql用にカスタマイズされたdropステートメントを作成したいと思います。これが私が持っているものです。

$table = $_POST["tablename"];      //gets table name from html page

drop_table($db, $table);           //call function

function drop_table($db,$table){            
    $drop = "DROP TABLE IF EXISTS .$table. ";     //this is the part I can't figure out. How do I add in the table name to the statement, 
    $q = mysqli_query($db, $drop); //since the sql statement has to be in quotes?
} 

ありがとう!

P.Ssこれは分析専用の内部システムです。同僚と私だけがそれを使用していれば、テーブルを落とす心配はありません

4

2 に答える 2

4

$tableここでの問題は、ドットで連結しようとすることによる構文エラーです。それらを削除します。

$drop = "DROP TABLE IF EXISTS $table ";  

しかし、はるかに大きな問題は、入力をフィルタリングしていないため、エンドユーザーがデータベース内の任意のテーブルを削除できるようにすることです。

ユーザーが現在選択されているデータベースにテーブルをドロップするだけであることを確認する必要があります。つまり、少なくとも、次のようなことを防ぐため.に内部を許可しないことを意味します。$table$table = 'information_schema.user'

if (strpos($table, '.') !== FALSE) {
  // don't allow the action!
}

実行する別の手順は、ステートメントを実行する前に、の値が正しい現在のデータベースに$table存在しinformation_schema.TABLES、属していることを確認することです。DROP

// If this returns 1, the table exists in the correct database and can be dropped.
// note that $table is escaped here.  I didn't fill in the mysqli_query() but obviously
// this is to be executed.  It would be even better with a MySQLi prepared statement
"SELECT 1 
 FROM information_schema.TABLES
 WHERE
   TABLE_SCHEMA='the_allowed_database' 
   AND TABLE_NAME='" . mysqli_real_escape_string($db, $table) . "'"`

このチェックに合格した後、ユーザーがアクティブなデータベース内のすべてのテーブルを削除できないように、環境内で柔軟性があり、したがって削除が許可されているテーブルにプレフィックスを指定するとよいでしょう。たとえば、プレフィックスが。のテーブルの削除のみを許可しますusertable_

if (strpos($table, 'usertable_') !== 0) {
   // don't permit deletion
}

これは確保するのが非常に難しい設計であるため、ここで戦略を考え直すことをお勧めします。ユーザーがフォーム入力に基づいてテーブルをドロップできるようにする場合は、細心の注意を払う必要があります。

于 2012-06-22T16:50:33.320 に答える
3

意味は:

$drop = "DROP TABLE IF EXISTS " . $table;

URLに正しい名前を入力することで、誰かがデータベースからテーブルを削除できるようになった場合の影響について、よく考えていただければ幸いです。

于 2012-06-22T16:50:36.127 に答える