လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> DOS တိုက်ခိုက်မှုများကိုကာကွယ်ရန် Socket_Accept () ဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုကန့်သတ်နည်း

DOS တိုက်ခိုက်မှုများကိုကာကွယ်ရန် Socket_Accept () ဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုကန့်သတ်နည်း

M66 2025-06-03

Network Prockamming အတွက် PHP အတွက် PHP ကိုအသုံးပြုသောအခါ client connection များကိုလက်ခံသည့် core function ဖြစ်သည်။ DOS (0 န်ဆောင်မှုငြင်းပယ်မှုငြင်းပယ်ခြင်း) ၏မျက်နှာသည်များသောအားဖြင့် angearkers များသည်များသောအားဖြင့်အန္တရာယ်ရှိသောဆက်သွယ်မှုတောင်းဆိုမှုများကိုအသုံးပြုလေ့ရှိပြီး, ဤဆောင်းပါးသည် socket_accept () မှလက်ခံသောဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုကန့်သတ်ခြင်းဖြင့်ဆာဗာကိုမည်သို့ထိထိရောက်ရောက်ဆွဲချခြင်းမှကာကွယ်ရန်မည်သို့ထိရောက်စွာတားဆီးရမည်ကိုရှင်းပြပါမည်။

1 ။ DOS တိုက်ခိုက်မှုများနှင့်ဆက်သွယ်မှုကန့်သတ်ချက်များကိုနားလည်ပါ

DOS တိုက်ခိုက်မှုများတွင်တိုက်ခိုက်သူသည်ဆာဗာ၏တစ်ပြိုင်နက်တည်းဆက်သွယ်မှုများကိုဖြည့်ဆည်းပေးသည့်တစ်ပြိုင်နက်တည်းဆက်သွယ်မှုများစွာကိုဖန်တီးသည်။ ဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုကန့်သတ်ခြင်းနှင့်ဆာဗာသည်အရင်းအမြစ်ခွင့်ပြုချက်အတွင်းရှိ 0 န်ဆောင်မှုခံယူသူ၏ဆက်သွယ်မှုအချို့ကိုသာကိုင်တွယ်နိုင်ကြောင်းသေချာစေရန်ဤတိုက်ခိုက်မှု၏သက်ရောက်မှုကိုထိရောက်စွာလျှော့ချနိုင်သည်။

2 ။ အမြင့်ဆုံးဆက်သွယ်မှုအရေအတွက်ကိုကန့်သတ်ရန် PHP Socket_Accept_Accept ကို သုံးရန်အကြံဥာဏ်များ

  • လက်ရှိထူထောင်ထားသောဆက်သွယ်မှုအရေအတွက်ကိုရေတွက်ရန် variable များကိုသုံးပါ။

  • ဆက်သွယ်မှုအသစ်ကိုလက်ခံရရှိသည့်အခါလက်ရှိဆက်သွယ်မှုနံပါတ်သည်ကန့်သတ်ချက်ထက်ကျော်လွန်ခြင်းရှိ / မရှိဆုံးဖြတ်သည်။

  • ကန့်သတ်ချက်ကိုကျော်လွန်သွားသည့်အခါဆက်သွယ်မှုကိုငြင်းပယ်ပါ

  • ဆက်သွယ်မှုကိုပိတ်ထားသည့်အခါ connection count ကိုအချိန်မီလျှော့ချပါ။

3 ။ နမူနာကုဒ်

အောက်ပါကုဒ်သည် PHP တွင် Socket_Acception တွင်အမြင့်ဆုံးဆက်သွယ်မှုကန့်သတ်ချက်ကိုမည်သို့အကောင်အထည်ဖော်ရမည်ဟုထင်မြင်သည်။

 <?php
set_time_limit(0);
error_reporting(E_ALL);

$address = '0.0.0.0';
$port = 12345;
$maxConnections = 100;
$currentConnections = 0;

// ဖန်တီး TCP Socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port) or die('binding ပျက်ကွက်');
socket_listen($sock);

echo "ဆာဗာစတင်ခြင်း,စောင့်ရေှာက် {$address}:{$port}\n";

$clients = [];

while (true) {
    // ဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုကျော်လွန်ခြင်းရှိမရှိဆုံးဖြတ်ရန်
    if ($currentConnections < $maxConnections) {
        // ပိတ်ဆို့ခြင်းမဟုတ်သော mode သည်ဆက်သွယ်မှုအသစ်များကိုလက်ခံသည်
        socket_set_nonblock($sock);
        $client = @socket_accept($sock);

        if ($client !== false) {
            // ဆက်သွယ်မှုအသစ်အောင်မြင်ခဲ့သည်,တ ဦး တည်းရေတွက်
            $currentConnections++;
            $clients[] = $client;

            // client ကိုတက် settingsocketပိတ်ဆို့ခြင်းမဟုတ်ပါ
            socket_set_nonblock($client);

            echo "ဖောက်သည်အသစ်,လက်ရှိဆက်သွယ်မှုနံပါတ်: $currentConnections\n";
        }
    } else {
        // ဆက်သွယ်မှုအများဆုံးအရေအတွက်ကျော်လွန်,ဆက်သွယ်မှုအသစ်ကိုငြင်းပယ်ပါ(optional ကိုစောင့်ဆိုင်းအချိန်)
        usleep(100000); // 100ms
    }

    // Connected clients များမှအချက်အလက်များကိုလုပ်ဆောင်ရန်မဲရုံများ
    foreach ($clients as $key => $clientSocket) {
        $data = @socket_read($clientSocket, 2048, PHP_NORMAL_READ);

        if ($data === false) {
            // ြငင်းခုံခြင်း,client ကိုဖယ်ရှားပါ
            socket_close($clientSocket);
            unset($clients[$key]);
            $currentConnections--;
            echo "client ကိုအဆက်ပြတ်,လက်ရှိဆက်သွယ်မှုနံပါတ်: $currentConnections\n";
            continue;
        } elseif ($data !== '') {
            $data = trim($data);
            if ($data === 'quit') {
                // client ကိုတက်ကြွစွာအဆက်ပြတ်
                socket_close($clientSocket);
                unset($clients[$key]);
                $currentConnections--;
                echo "client ကိုတက်ကြွစွာအဆက်ပြတ်နေသည်,လက်ရှိဆက်သွယ်မှုနံပါတ်: $currentConnections\n";
                continue;
            }

            // client ကိုမှပေးပို့သောလုပ်ငန်းစဉ်အချက်အလက်များကို
            $response = "ဆာဗာကိုလက်ခံရရှိခဲ့သည်: {$data}\n";
            socket_write($clientSocket, $response, strlen($response));
        }
    }

    usleep(50000); // လေှျာ့ပေါ့CPUနေထိုင်ခြင်း
}
?>

4 ။ ကုဒ်ဖော်ပြချက်

  • လက်ရှိတက်ကြွသောဆက်သွယ်မှုအရေအတွက်ကိုမှတ်တမ်းတင်ရန် $ curralconnections ကို သုံးပါ။

  • call socket_accept_Accept () ဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုမကျော်လွန်သောအခါဆက်သွယ်မှုအသစ်များကိုလက်ခံရရှိရန်သာဖြစ်သည်။

  • ဆက်သွယ်မှုအသစ်ကိုဖန်တီးပြီးသည်နှင့် client socket ကို $ clients array သို့သိမ်းဆည်းပြီးပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်ပါ။

  • $ client များ မဲရုံများဖြင့် 0 န်ဆောင်မှုခံယူသူအချက်အလက်များကိုဖတ်ရှုပြီးတုန့်ပြန်မှုအပြီးတွင်ဆက်လက်နားထောင်ခြင်းကိုပြုလုပ်ပါ။

  • အကယ်. client သည် quit command ကိုအဆက်ဖြတ်ခြင်းသို့မဟုတ်ပို့လျှင် socket ကိုပိတ်ပြီး connection connection ကိုလျှော့ချပါ။

  • CPU overcation ကိုလျှော့ချရန် USEEEP () ကိုသုံးပါ။

5 ။ နောက်ထပ်ကာကွယ်ရေးအကြံပြုချက်များ

  • အချိန်ကုန်ခံခန်း - client connection ပျင်းရိအချိန်ကိုစစ်ဆေးပါ။

  • IP ဆက်သွယ်မှုအရေအတွက်ကိုကန့်သတ်ထားပါ

  • Firewall ကိုအသုံးပြုခြင်း - ဆာဗာအဆင့်မှာချွင်းချက်ချိတ်ဆက်မှုများကိုကန့်သတ်ပါ။

  • Load Balancing ကိုသုံးပါ

  • စောင့်ကြည့်လေ့လာခြင်းမှတ်တမ်း - အချိန်မီပုံမှန်မဟုတ်သောအသွားအလာကိုရှာဖွေပါ။

6 ။ နိဂုံးချုပ်

PHP Socket Server ရှိဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုကန့်သတ်ခြင်းအားဖြင့် DOS တိုက်ခိုက်မှုများကိုထိရောက်စွာခုခံတွန်းလှန်နိုင်ပြီးဆာဗာအရင်းအမြစ်များကိုအန္တရာယ်ရှိသောပျောက်ကွယ်သွားခြင်းကိုရှောင်ရှားနိုင်သည်။ အခြားလုံခြုံရေးအစီအမံများနှင့်ပေါင်းစပ်ပြီး၎င်းသည်ဆာဗာအတွက်ခိုင်မာသောကာကွယ်မှုပေးပြီး 0 န်ဆောင်မှုများ၏တည်ငြိမ်မှုကိုသေချာစေသည်။