0

ajax を介して動的 SQL クエリを php スクリプトに渡すための、堅牢で、シンプルで、安全で、包括的な方法を構築しようとしています。まだ勝者を思いついたとは思いませんが、今持っているものは私のアプリケーションでうまくいくようです. 入力変数を使用して SQL クエリを作成し、クエリを実行して、結果を Web サイトに返す Web サーバーに 1 つの php スクリプトを配置したいと考えています。クエリを実行して結果を返すことは問題ではありません。問題は、これらの入力変数をスクリプトに渡す適切かつ安全な方法です。

私が抱えている最大の混乱は、可能なすべての異なる WHERE 句をまだ説明できる WHERE 句を作成する方法です。

サーバー上の PHP ファイルの名前がmaster.php.

Javascirpt から私はこれを持っています:

$.ajax({
  type: "POST",
  url: "master.php",
  dataType: "xml",
  data: { 
      schema: "the_schema", 
      table: "the_table",
      select: JSON.stringify(['col_name_1','col_name_2','...']),
      where: JSON.stringify(["status","!=","Some Status","and","STR_TO_DATE(date,","%m/%d/%Y",")",">","(date(now())","-","INTERVAL","30","day)"])
  },
  success: function (data){
      alert(data);
      // of course here I will actually do something with the data, this is just for illustration of how the data is returned to the web page.
  }
});

data変数は、データベースからの XML データか、文字列「failure: error msg」のいずれかになります。

サーバー上のmaster.phpスクリプトには、次のものがあります。

<?php
    include '/config_file.php'; //checks user permissions and establishes mysqli connection

    /*
     * Table and schema are required 
     */
    $table = $mysqli->real_escape_string($_POST['table']);
    $schema = $mysqli->real_escape_string($_POST['schema']);

    /*
     * Select section
     * if there is no select then just use *
     */
    if (isset($_POST['select'])){
        $select_string = 'select ';
        $select = json_decode($_POST['select']);
        foreach($select as $key => $value){
            $select_string .= '`'.$mysqli->real_escape_string($value).'`, ';
        }
    }else{
        $select_string = 'select * ';
    }

    /*
     * Where section
     */
    if (isset($_POST['where'])){
        $where = json_decode($_POST['where']);
    }

    if (isset($where)){
        $where_string = ' where ';
        foreach ($where as $key => $value){
            if (strpos($value, ' ') !== false or strpos($value, '%') !== false){
                // if there is a space or % in the value, it must be a string so enclose it in quotes
                $where_string .= '"'.$mysqli->real_escape_string($value).'" ';
            }else{
                $where_string .= $mysqli->real_escape_string($value).' ';
            }
        }
        $where_string = rtrim($where_string);
    }

    if(!isset($where_string)) $where_string = '';

    /*
     * End of Where Section
     */


    /*
     * Build SQL
     */
    $SQL = $select_string.'from '.$schema.'.'.$table.$where_string;

    //...continue to execute query and echo results
?>

ご覧のとおり、where配列のすべての部分がエスケープされ、列名や演算子 (=、!=、>、< など) も含めてクエリに追加されます。

また、ご覧のとおり、where句のこの部分のすべての部分に個別の文字列を渡しています->and STR_TO_DATE(date, "%m/%d/%Y" ) > (date(now()) - INTERVAL 30 day)

もし皆さんが持っているなら

  1. ajax スクリプトに動的 where 句を渡す経験
  2. もっと良いアイデアがあれば
  3. スクリプトのセキュリティ ホールを確認する

私にお知らせください。万能なデータベース スクリプトを実行できるようになることを願っています。

ありがとう!

4

1 に答える 1

1

個人的には、JavaScriptでデータベースの列名を公開するこの種のアプローチはお勧めしません。これは完全に危険です。

簡単な例は、ブラウザーレベルでajaxパラメーターを操作し、データベースに対して実行できることです。ハッカーがデータに関する詳細情報を入手できるようにするだけです。

たとえば、whereパラメータを指定せずに呼び出しを実行することで、データベースのすべてのデータを表示できるように、wherecloseを停止できます。このような動的クエリを開発する場合は、列がハッカーに直接公開されないように、ajaxで渡されたパラメーターと実際のテーブル列の間でいくつかのマッピングを使用していることを確認してください。

これが、このスクリプトで確認できる基本的なセキュリティの問題です。

お役に立てれば。

ありがとう。

于 2012-08-17T09:30:05.877 に答える