質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

1616閲覧

セキュリティの関わる問題なので削除させていただきました。

amaguri

総合スコア227

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/07/27 09:31

編集2018/06/18 09:54

セキュリティの関わる問題なので削除させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

これは自作したコンポーネントですか?
コンポーネントの親クラスは、componentだったと思います

CakePHP

1class CommonComponent extends Component { 2345}

投稿2016/07/27 15:09

KatsumiTanaka

総合スコア924

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2016/07/28 00:54

はい自作したcomponentになります
KatsumiTanaka

2016/07/28 11:15

継承元をComponentに変更してら、どうなります?
guest

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

amaguri

総合スコア227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2016/07/27 09:36

/////////////////////////////////////////////////////////////////// // 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; } } ?>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問