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)
もし皆さんが持っているなら
- ajax スクリプトに動的 where 句を渡す経験
- もっと良いアイデアがあれば
- スクリプトのセキュリティ ホールを確認する
私にお知らせください。万能なデータベース スクリプトを実行できるようになることを願っています。
ありがとう!