セキュリティの関わる問題なので削除させていただきました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
これは自作したコンポーネントですか?
コンポーネントの親クラスは、componentだったと思います
CakePHP
1class CommonComponent extends Component { 2 ・ 3 ・ 4 ・ 5}
投稿2016/07/27 15:09
総合スコア924
0
/////////////////////////////////////////////////////////////////// //WebHiveのクエリ実行数 /////////////////////////////////////////////////////////////////// function GetQueryExecuteNum() { $query_cnt=0; //処理中のクエリをチェック $querys=$this->Runhists->find('all', array( 'conditions' => "rsts='0'")); for($i=0; $i<count($querys); $i++){ //PIDファイル名生成 $u_userid=$querys[$i]['Runhists']['username']; $u_rid=$querys[$i]['Runhists']['rid']; $pid_file=DIR_RESULT."/${u_userid}/${u_rid}.pid"; //$this->log($pid_file,LOG_DEBUG); //プロセス存在チェック if ( !file_exists($pid_file) ){ continue; } if ( !($fp=fopen($pid_file,"r")) ){ continue; } $pid=fgets($fp, 10240); $pid=rtrim($pid); fclose($fp); if ( $pid == "" ){ continue; } if ( !posix_kill($pid,0) ){ continue; } $query_cnt++; } return $query_cnt; } /////////////////////////////////////////////////////////////////// //HiveQLのexplainチェック /////////////////////////////////////////////////////////////////// function CheckSQLexplain($u_userid,$u_id) { $stage_cnt=0; $mapreduce_cnt=0; $line_cnt=0; $exp_file=DIR_RESULT."/${u_userid}/${u_id}.exp"; //予想時間 if ( !($fp=fopen($exp_file,"r")) ){ return array(-1,-1,-1); } while(!feof($fp)){ $data = fgets($fp, 10240); $line_cnt++; if ( eregi("^Time taken:",$data) ){ $stage_cnt++; } if ( eregi("Map Reduce",$data) ){ $mapreduce_cnt++; } } fclose($fp); return array($stage_cnt,$mapreduce_cnt,$line_cnt); } /////////////////////////////////////////////////////////////////// //データベース実行権限チェック(0=許可/1=不許可) /////////////////////////////////////////////////////////////////// function CheckExplainDatabase($u_userid,$u_id,$u_databases) { //$this->log("CheckExplainDatabase($u_userid,$u_id,$u_databases)",LOG_DEBUG); if ( $u_databases == "" ){ return 0; } //EXPLAINファイルを解析してクエリ種類とデータベース名を抽出 $results=CommonComponent::CheckExplainParce($u_userid,$u_id); //$this->log($results,LOG_DEBUG); //ユーザロール情報検索 $users=$this->Roles->find('all', array('conditions' => array("username"=>"$u_userid"), "order"=>array("seq") )); //$this->log($users,LOG_DEBUG); //クエリ許可チェック $check_cnt=0; $valid_cnt=0; for ( $i=0; $i<count($results); $i++){ $check_cnt++; $u_type=$results[$i]->type; $u_db=$results[$i]->db; if ( count($users) == 0 ){ if ( CommonComponent::CheckMatchDB(DATABASE_PERMISSION,$u_db) != 0 ){ continue; } if ( CommonComponent::CheckMatchQuery($u_type,LDAP_AUTH) != 0){ return 1; } $valid_cnt++; }else{ for($j=0; $j<count($users); $j++){ $u_auth=$users[$j]['Roles']['authority']; $u_ptn=$users[$j]['Roles']['hive_database']; if ( CommonComponent::CheckMatchDB($u_ptn,$u_db) != 0 ){ continue; } if ( CommonComponent::CheckMatchQuery($u_type,$u_auth) != 0 ){ return 1; } $valid_cnt++; break; } } } if ( $valid_cnt >= $check_cnt and $check_cnt > 0 ){ return 0; } } //EXPLAINファイルを解析してクエリ種類とデータベース名を抽出 function CheckExplainParce($u_userid,$u_id){ $cnt=0; $results=array(); $cur_db="default"; $sql_query=""; $sql_query_no=0; $exp_file=DIR_RESULT."/${u_userid}/${u_id}.exp"; if ( !($fp=fopen($exp_file,"r")) ){ return $results; } while(!feof($fp)){ $data = fgets($fp, 10240); $data=str_replace(array("\r\n","\n","\r"), '', $data); if ( eregi("^use ",$data) ){ list($dummy,$cur_db)=split("[ ;]",$data); } //クエリ if ( eregi("^explain ",$data) ){ $sql_query=substr($data,8); $sql_query_no++; } // トークン部分の解析 // // 【解析仕様】 // ・トークンは『ABSTRACT SYNTAX TREE』行と『STAGE DEPENDENCIES』行の間にある // ・データベース名及びテーブル名(以降 オブジェクト部)は次のターゲットトークンの次の行以降にインデントされて定義されている // → TOK_TABNAME、TOK_TABTYPE、TOK_ALTERTABLE、TOK_TABTYPE、TOK_SHOW // ・オブジェクト部には『データベース名行 + テーブル名行』または『テーブル名行』のパターンがある // ・オブジェクト部の範囲はターゲットトークンのインデントと同じまたは浅い行の前行までとする // ・オブジェクト部に別のターゲットトークンがあった場合、オブジェクト部はその前行までとし、別のターゲットトークン以降を新しいオブジェクト部として処理する // if (eregi("^ABSTRACT SYNTAX TREE", $data) and !feof($fp)) { $data = fgets($fp, 10240); $data = str_replace(array("\r\n","\n","\r"), '', $data); $sql_type=""; while (!feof($fp)) { if (eregi("^STAGE DEPENDENCIES", $data)) { break; } $sql_type = CommonComponent::CheckTOK2SQLtype(trim($data), $sql_type); if (eregi("^TOK_TABNAME|^TOK_TABTYPE|^TOK_ALTERTABLE|^TOK_TABTYPE|^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE", trim($data))) { $tok_indent = strlen($data) - strlen(ltrim($data)); $token = trim($data); $data = fgets($fp, 10240); $data = str_replace(array("\r\n","\n","\r"), '', $data); $objects = array(); while (!feof($fp)) { if (eregi("^TOK_TABNAME|^TOK_TABTYPE|^TOK_ALTERTABLE|^TOK_TABTYPE|^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE", trim($data))) { break; } if ($tok_indent >= (strlen($data) - strlen(ltrim($data)))) { break; } if (!eregi("^TOK_|\.", trim($data))) { $objects[] = trim($data); } $data = fgets($fp, 10240); $data=str_replace(array("\r\n","\n","\r"), '', $data); } if (count($objects) >= 2) { $results[$cnt]->no = $sql_query_no; $results[$cnt]->type = $sql_type; $results[$cnt]->db = $objects[0]; $results[$cnt]->tbl = $objects[1]; $cnt++; } else if (count($objects) == 1) { $results[$cnt]->no = $sql_query_no; $results[$cnt]->type = $sql_type; if (eregi("^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE", $token)) { $results[$cnt]->db = $objects[0]; $results[$cnt]->tbl = ""; } else { $results[$cnt]->db = $cur_db; $results[$cnt]->tbl = $objects[0]; } $cnt++; } else if (count($objects) == 0 and eregi("^TOK_SHOW", $token)) { $results[$cnt]->no = $sql_query_no; $results[$cnt]->type = $sql_type; $results[$cnt]->db = $cur_db; $results[$cnt]->tbl = ""; $cnt++; } } else { $data = fgets($fp, 10240); $data = str_replace(array("\r\n","\n","\r"), '', $data); } } $sql_query = ""; } } fclose($fp); return $results; } //トークン名からクエリに変換 function CheckTOK2SQLtype($data,$sql_type){ if ( $data == "TOK_DESCTABLE" ){ return "desc"; } if ( $data == "TOK_CREATETABLE" ){ return "create table"; } if ( $data == "TOK_TABREF" ){ return "select"; } if ( $data == "TOK_INSERT" ){ return "insert"; } if ( $data == "TOK_DROPTABLE" ){ return "drop table"; } if ( eregi("^TOK_SHOW",$data) ){ return "show"; } if ( eregi("^TOK_ALTER",$data) ){ return "alter table"; } if ( $data == "TOK_CREATEDATABASE" ){ return "create database"; } if ( $data == "TOK_DROPDATABASE" ){ return "drop database"; } return $sql_type; } /////////////////////////////////////////////////////////////////// // データベース名パターンマッチ(0=一致 / 1=不一致) /////////////////////////////////////////////////////////////////// function CheckMatchDB($chk_ptn, $chk_db){ if ( $chk_ptn == "" ){ return 0; } if ( eregi($chk_ptn,"all") ){ return 0; } if ( $chk_db == "default" ){ return 0; } //マッチ判定 $not_flg=0; $match_flg=0; if ( substr($chk_ptn,0,1) == '!' ){//substr — 文字列の一部分を返す $chk_ptnの0と1を返す。 が'!'の場合 $not_flg=1; $chk_ptn=substr($chk_ptn,1); } if ( preg_match("/$chk_ptn/i",$chk_db) ){ $match_flg=1; } $ck_flg=0; if ( $not_flg == 0 and $match_flg == 0 ){ $ck_flg=1; } if ( $not_flg == 1 and $match_flg == 1 ){ $ck_flg=1; } //$this->log("[$chk_ptn][$chk_db] -> [$not_flg][$match_flg] -> $ck_flg",LOG_DEBUG); return $ck_flg; } /////////////////////////////////////////////////////////////////// // クエリのパターンマッチ(0=許可 / 0以外=不許可) /////////////////////////////////////////////////////////////////// function CheckMatchQuery($u_query, $u_auth) { //許可 $ck=Configure::read("USER_AUTH_${u_auth}.query"); if ( $ck == "" ){ return 1; } if ( eregi($ck,"all") ){ return 0; } //コメント除外処理 $arr=preg_split("/[\r\n]/",$u_query);// $u_query2=""; for ($i=0; $i<count($arr); $i++){ if ( eregi('^--',$arr[$i]) ){ continue; } $u_query2.="$arr[$i]\n"; } //権限チェック $arr=preg_split("/;/",$u_query2);//preg_split — 正規表現で文字列を分割する for ($i=0; $i<count($arr); $i++){ $arr[$i]=str_replace(array("\r\n","\n","\r"), ' ', $arr[$i]); $arr[$i]=ltrim($arr[$i]); if ( $arr[$i] == "" ){ continue; } if ( !eregi($ck,$arr[$i]) ){ return 2; } } return 0; }
投稿2016/07/27 09:36
総合スコア227
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
///////////////////////////////////////////////////////////////////
// Job実行状況の取得
///////////////////////////////////////////////////////////////////
function GetJobInfo($hql_file,$out_file,$fin_file,$pid_file) {
$err_flg=0;
$total_p=1;
$stage_p=0;
$map_p=0;
$reduce_p=0;
$stage_cnt=0;
$stage_max=0;
$query_cnt=0;
$query_max=0;
$total_cnt=0;
$total_max=0;
$file_cnt=0;
$file_max=0;
//子プロセス処理中チェック
if ( file_exists($pid_file) ){
//子プロセスのPID取得
$fp=fopen($pid_file,"r");
$pid = fgets($fp, 1024);
fclose($fp);
$pid=str_replace(array("\r\n","\n","\r"), '', $pid);
//子プロセス異常終了チェック(PIDファイルのpidが存在するかチェック)
if ( $pid != "start" ){
if ( !posix_kill($pid,0) ){
unlink($pid_file);
return array(100,$total_p,$stage_p,$map_p,$reduce_p);
}
}
}
//実行数(クエリ数)取得
$datas="";
if ( !($fp=fopen($hql_file,"r")) ){
return array(100,$total_p,$stage_p,$map_p,$reduce_p);
}
while(!feof($fp)){
$data = fgets($fp, 1024);
$data=rtrim($data);
$datas = $datas . $data;
}
fclose($fp);
$querys=preg_split("/;/",$datas);
for ( $i=0; $i<count($querys); $i++){
if ( $querys[$i] != "" ){ $query_max++; }
}
//hiveログより情報取得
if ( !($fp=fopen($out_file,"r")) ){
return array(100,$total_p,$stage_p,$map_p,$reduce_p);
}
while(!feof($fp)){
$data = fgets($fp, 1024);
$data=rtrim($data);
if ( ereg("^Total MapReduce jobs",$data) ){
$arr=preg_split("/=/",$data);
$stage_max=ereg_replace(" ","",$arr[1]);
$stage_cnt=0;
}
if ( ereg("^Ended Job =",$data) ){
$stage_cnt++;
}
if ( ereg("map =",$data) and eregi("reduce =",$data) ){
$arr=preg_split("/[ ,%]+/",$data);
$map_p=$arr[6];
$reduce_p=$arr[9];
}
if ( ereg("^Time taken:",$data) ){
$query_cnt++;
}
if ( ereg("^FAILED:",$data) ){
$err_flg=100;
}
}
fclose($fp);
//ログファイルより結果取得
$file_max=OUTPUT_FILE_LIMIT;
if ( file_exists($fin_file) ){
if ( !($fp=fopen($fin_file,"r")) ){
return array(100,$total_p,$stage_p,$map_p,$reduce_p);
}
while(!feof($fp)){
$data = fgets($fp, 1024);
if ( eregi("^OUT:",$data) ){ $file_cnt++; }
if ( eregi("^WAR:",$data) ){ $err_flg++; }
if ( eregi("^ERR:",$data) ){ $err_flg = $err_flg + 100; }
}
fclose($fp);
}
//合計の進捗率
if ( $query_max != 0 ){
$total_p=floor((50 / $query_max ) * $query_cnt );
}
if ( $file_max != 0 ){
$total_p=$total_p + floor( (50 / $file_max ) * $file_cnt );
}
if ( $total_p < 0 ){ $total_p=0; }
if ( $total_p > 100 ){ $total_p=100; }
//stageの進捗率
if ( $stage_max != 0 ){
$stage_p=floor( (100 / $stage_max) * $stage_cnt );
}
if ( $stage_p < 0 ){ $stage_p=0; }
if ( $stage_p > 100 ){ $stage_p=100; }
//$this->log("query=$query_cnt/$query_max stage=$stage_cnt/$stage_max file=$file_cnt/$file_max ($total_p,$stage_p,$map_p,$reduce_p)",LOG_DEBUG);
return array($err_flg,$total_p,$stage_p,$map_p,$reduce_p);
}
///////////////////////////////////////////////////////////////////
// JobIDの取得
///////////////////////////////////////////////////////////////////
function GetJobId($out_file) {
$jobid="";
//ログファイルより情報取得
if ( !($fp=fopen($out_file,"r")) ){
return "";
}
while(!feof($fp)){
$data = fgets($fp, 1024);
$data=rtrim($data);
if (preg_match('/application_\d{13}_\d{4,}/', $data, $arr)) {
$jobid=$arr[0];
}
}
fclose($fp);
return $jobid;
}
///////////////////////////////////////////////////////////////////
//クエリ実行結果を更新
///////////////////////////////////////////////////////////////////
function UpdateRunhistsResult($u_rid,$u_res){
$this->log("UpdateRunhistsResult($u_rid,$u_res)",LOG_DEBUG);
//実行履歴検索
$qwk=$this->Runhists->find('all', array('conditions' => "rid='$u_rid'"));
if ( count($qwk) == 0 ){
return 1;
}
//処理結果更新
$runlog['Runhists']['id'] = $qwk[0]['Runhists']['id'];
$runlog['Runhists']['rsts'] = $u_res;
$runlog['Runhists']['findate'] = date('Y-m-d H:i:s');
if ( !($this->Runhists->save($runlog, array('id','rsts','findate') )) ){
return 2;
}
return 0;
}
///////////////////////////////////////////////////////////////////
//環境名
///////////////////////////////////////////////////////////////////
function GetSubTitle(){
//ファイル名指定の場合
if ( eregi("^FILE:",APP_TITLE_MSG) ){
$sub_title="";
$sub_title_file=substr(APP_TITLE_MSG,5);
if ( !file_exists($sub_title_file) ){ return ""; }
if ( !($fp=fopen($sub_title_file,"r")) ){
return "";
}
while(!feof($fp)){
$sub_title .= fgets($fp, 1024);
}
fclose($fp);
return $sub_title;
}
return APP_TITLE_MSG;
}
///////////////////////////////////////////////////////////////////
//IP範囲チェック
///////////////////////////////////////////////////////////////////
function IpCheck(){
$access_ip = CommonComponent::getAccessIp();
$sql = "SELECT start_ip, last_ip FROM allow_ips AS AllowIps WHERE INET_ATON(?) between INET_ATON(start_ip) and INET_ATON(last_ip)";
$ips = $this->AllowIps->query($sql,array($this->$access_ip));
return $ips;
}
///////////////////////////////////////////////////////////////////
//フラグIP範囲チェック
///////////////////////////////////////////////////////////////////
function FigIpCheck(){
$access_ip = CommonComponent::getAccessIp();
$sql = "SELECT start_ip, last_ip, full_access_flg FROM allow_ips AS AllowIps WHERE INET_ATON(?) between INET_ATON(start_ip) and INET_ATON(last_ip)";
$ips = $this->AllowIps->query($sql,array($this->$access_ip));
return $ips;
}
///////////////////////////////////////////////////////////////////
//識別します
///////////////////////////////////////////////////////////////////
function identification(){
$results=CommonComponent::CheckExplainParce($u_userid,$u_id);
foreach ($results as $result) {
//$results[$cnt]->typeを抜き出す
$u_type=$result->type;
//更新系の場合
if( eregi($u_type,"^insert|^create table|^create database|^drop database|^drop table")){
//対象のDBを$results[$cnt]->dbを$resultsから抽出
$u_db=$result->db;
//対象のDBが個人情報DBか識別
$dbcheck = $this->PrivateHiveDb->find('count', array(
'conditions' => array('PrivateHiveDb.hive_database' => $u_db))
);
//対象のDBが個人情報系の場合
if($dbcheck){
// 接続元IP情報
$ips=CommonComponent::IpCheck();
if (empty($ips)) {
return 1;
}
}else{
//対象のDBが非個人情報の場合
// 接続元IP情報
$ips=CommonComponent::FlgIpCheck();
foreach ($ips as $row) {
if ($row['full_access_flg'] == '0') {
//0の場合(権限許可IPの場合)
return 1;
}
}
}
}else{
//参照系の場合
//対象のDBを$results[$cnt]->dbを$resultsから抽出
$u_db=$result->db;
//対象のDBが個人情報DBか識別
$dbcheck = $this->PrivateHiveDb->find('count',array(
'conditions' => array('PrivateHiveDb.hive_database' => $u_db))
);
//対象のDBが更新系の場合
if($dbcheck){
// 接続元IP情報
$ips=CommonComponent::IpCheck();
if (empty($ips)) {
return 1;
}
}
}
}
return 0;
}
}
?>
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/28 00:54
2016/07/28 11:15