この関数は、各訪問者が短期間に訪問した回数をカウントするために使用され、訪問数が制限を超えた場合は TRUE を返します。その後、PHP を使用して Linux の iptables を呼び出してブロック操作を実行できます。私は実際に DDOS ツールをいくつか使用しましたが、結果は非常に良好でした。ちなみに、コード内でファイルを使用して訪問者の IP と時間を記録しています。データベースは使用しないのが最善です。賢明にはセッションに保存しないでください) さらに、このファイルは SSD ハード ドライブに保存するのが最善です。その理由については、誰もが知っていると思います。
/** クライアント側での悪意のある再編成を防ぐ- 使用法:
- $isf5=Fun::isf5();
- Return:
- Return bool[true: 相手が悪意を持って再編成している; false: 通常のアクセス]
- /**/
- パブリック静的関数 isf5(){
- $_f=Run.'_isf5';
- if(!file_exists($_f)){
- file_put_contents($_f,serialize(array) ()),LOCK_EX);
- chmod($_f,0777);
- }
- $arr=unserialize(file_get_contents($_f));
- $arr=(!is_array($arr)) array() : $arr ? ;
-
- //10 秒前に訪問したユーザーをクリアします
- foreach($arr as $k=>$v){
- if($_ENV['now']-$v['t'] >= 10 ){
- unset($arr[$k]);
- }
- }
-
- $ip='_'.(self::cur('ip'));
-
- if(!isset($arr[$ip ])){
- $arr[$ip]['n']=1; // 1 秒以内の接続数
- $arr[$ip]['t']=$_ENV['now']; //初回アクセス時刻
- file_put_contents($_f,serialize($arr),LOCK_EX);
- chmod($_f,0777);
- unset($_f,$arr,$ip);
- return FALSE;
- }else {
- if(!isset($arr[$ip]['t']) または !is_numeric($arr[$ip]['t'])){
- unset($arr[$ip]);
- file_put_contents ( $_f,serialize($arr),LOCK_EX);
- chmod($_f,0777);
- unset($_f,$arr,$ip);
- return FALSE;
- }
- if(($_ENV['now ' ]-$arr[$ip]['t']) <= 1){ //前回のアクセスからの時間が1秒以内の場合は回数のみ累積します
- $arr[$ip] ['n'] +=1;
- if($arr[$ip]['n']>=5){
- unset($_f,$arr,$ip);
- return TRUE;
- }else{
- file_put_contents($_f ,serialize($arr),LOCK_EX);
- chmod($_f,0777);
- unset($_f,$arr,$ip);
- return FALSE;
- }
- }else{ //If前回の訪問からの距離 時間が 1 秒を超えた場合は、再度カウントします
- $arr[$ip]['n']=1;
- $arr[$ip]['t']=$_ENV['now'] ;
- file_put_contents($_f, Serialize($arr),LOCK_EX);
- chmod($_f,0777);
- unset($_f,$arr,$ip);
- return FALSE;
- }
- }
- unset($ _f,$arr,$ip );
- return FALSE;
- }
-
-
コードをコピー
|
DDOS、関数