前提条件として、サーバー上で管理者権限が必要です。つまり、php.ini ファイルを変更できる必要があります。ここでは、SQL インジェクションを防ぐために php 設定ファイルを変更する方法を紹介します。それを参照してください。
セキュリティ上の理由から、「php.ini」ファイルのセーフ モードをオンにして「safe_mode=On」を設定できます。PHP 実行エラー情報を表示する「display_erros」オプションがオンになっている場合、悪用可能な情報が大量に表示されます。したがって、このように「display_erros=off」に設定すると、PHP関数実行エラー後の情報がクライアントのブラウザに表示されなくなります。
さらに、ファイルには非常に重要な設定オプションがあります。「magic_quotes_gpc」項目が「オン」に設定されている場合、PHP プログラムはユーザーが送信した変数を「'」、「」、を含むように自動的に変更します。 "" バックスラッシュを含むエスケープ文字に自動的に変換します。このオプションは ASP プログラムのパラメーター フィルターに似ており、ほとんどの文字インジェクション攻撃を防ぐことができます。
サーバー管理権限を持っていない場合、このプログラムは非常に優れています
コードをコピー | |
クラス sqlsafe { private $getfilter = "'|(and|or)b.+?(>|<|=|in|like)|/*.+?*/| * コンストラクター */ パブリック関数 __construct() { foreach($_GET as $key=>$value){$this->stop攻撃($key,$value,$this->getfilter);} foreach($_POST as $key=>$value){$this->stop Attack($key,$value,$this->postfilter);} foreach($_COOKIE as $key=>$value){$this->stop攻撃($key,$value,$this->cookiefilter);} } /** *パラメータチェックとログ書き込み */ パブリック関数 stop Attack($StrFiltKey, $StrFiltValue, $ArrFiltReq){ if(is_array($StrFiltValue))$StrFiltValue = implode($StrFiltValue); if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue) == 1){ $this->writeslog($_SERVER["REMOTE_ADDR"]." ".strftime("%Y-%m-%d %H:%M:%S")." ".$_SERVER["PHP_SELF"] ." ".$_SERVER["REQUEST_METHOD"]." ".$StrFiltKey." ".$StrFiltValue); Showmsg('送信したパラメータは不正です。システムはあなたの操作を記録しました!','',0,1); } } /** *SQLインジェクションログ */ パブリック関数 writeslog($log){ $log_path = CACHE_PATH.'logs'.DIRECTORY_SEPARATOR.'sql_log.txt'; $ts = fopen($log_path,"a+"); fputs($ts,$log."rn"); fclose($ts); } } ?> |