วิธีตรวจสอบที่อยู่อีเมลใน PHP


218

ฉันมีฟังก์ชั่นนี้เพื่อตรวจสอบที่อยู่อีเมล:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}

การตรวจสอบว่าที่อยู่อีเมลถูกต้องหรือไม่


1
ถ้ามันใช้งานได้ผล คุณไม่สามารถทำให้ดีขึ้นได้มันมีขนาดเล็กเกินไป สิ่งเดียวที่ไม่ดีคือสไตล์ validateEmailจะ corret เช่นเดียวกับที่ผ่านไม่ได้$email $EMAIL
สแตน

แค่อยากจะให้แน่ใจว่าผมไม่ได้มีปัญหาใด ๆ ที่สำคัญในรหัสที่ :) ทั้งหมด
คาเมรอน

ดูเพิ่มเติมที่stackoverflow.com/questions/201323/…สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการและวิธีการใช้นิพจน์ทั่วไปเพื่อตรวจสอบที่อยู่อีเมล
legoscia

5
ที่จะล้มเหลวในการตรวจสอบที่อยู่อีเมลที่ถูกต้องจำนวนมาก ตัวอย่างเช่น *@example.com หรือ'@example.com or me @ [127.0.0.1] หรือคุณ @ [ipv6: 08B0: 1123: AAAA :: 1234]
jcoder

7
@jcoder ไม่ใช่ว่าฉันขอแนะนำ regex แต่อย่างน้อยเราก็หวังว่าทุกคนที่ใช้ที่อยู่เช่นนี้เพื่อร้องเพลง ฯลฯ จะไม่บ่นเมื่อมันล้มเหลว :)
Halil Özgür

คำตอบ:


569

วิธีที่ง่ายที่สุดและปลอดภัยที่สุดในการตรวจสอบว่าที่อยู่อีเมลมีรูปแบบถูกต้องหรือไม่คือการใช้งานfilter_var()ฟังก์ชั่น:

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

นอกจากนี้คุณสามารถตรวจสอบว่าโดเมนกำหนดMXระเบียน:

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

แต่นี่ก็ยังไม่รับประกันว่าจดหมายนั้นจะมีอยู่ วิธีเดียวที่จะพบว่าเป็นโดยการส่งอีเมลยืนยัน


ตอนนี้คุณมีคำตอบง่าย ๆ อย่าลังเลที่จะอ่านเกี่ยวกับการตรวจสอบที่อยู่อีเมลถ้าคุณสนใจที่จะเรียนรู้หรือใช้คำตอบอย่างรวดเร็วและดำเนินการต่อ ไม่มีความรู้สึกยาก.

การพยายามตรวจสอบที่อยู่อีเมลโดยใช้ regex นั้นเป็นงานที่ "เป็นไปไม่ได้" ฉันจะไปไกลเท่าที่จะบอกว่า regex ที่คุณทำนั้นไร้ประโยชน์ มีอยู่สามประการของ rfc ที่เกี่ยวกับที่อยู่อีเมลและการเขียน regex เพื่อจับที่อยู่อีเมลที่ไม่ถูกต้องและในเวลาเดียวกันไม่มีข้อผิดพลาดที่ผิดพลาดเป็นสิ่งที่มนุษย์ไม่สามารถทำได้ ตรวจสอบรายการนี้สำหรับการทดสอบ (ทั้งล้มเหลวและสำเร็จ) ของ regex ที่ใช้โดยfilter_var()ฟังก์ชันของ PHP

แม้แต่ฟังก์ชั่น PHP ในตัวไคลเอนต์อีเมลหรือเซิร์ฟเวอร์ก็ไม่ถูกต้อง ในกรณีส่วนใหญ่filter_varยังเป็นตัวเลือกที่ดีที่สุด

หากคุณต้องการที่จะทราบว่ารูปแบบ regex PHP (ปัจจุบัน) ใช้ในการตรวจสอบที่อยู่อีเมลดูแหล่งที่มาของ PHP

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับที่อยู่อีเมลฉันขอแนะนำให้คุณเริ่มอ่านข้อกำหนด แต่ฉันต้องเตือนคุณว่ามันไม่ใช่เรื่องง่ายที่จะอ่าน:

  • rfc5322
  • rfc5321
  • rfc3696
  • rfc6531 (อนุญาตให้ใช้อักขระ unicode แม้ว่าไคลเอนต์ / เซิร์ฟเวอร์จำนวนมากไม่ยอมรับ)

โปรดทราบว่าfilter_var()ตามที่ระบุไว้แล้วใช้ได้เฉพาะใน PHP 5.2 ในกรณีที่คุณต้องการให้ทำงานกับ PHP เวอร์ชันก่อนหน้าคุณสามารถใช้ regex ที่ใช้ใน PHP:

<?php

$pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';

$emailaddress = 'test@gmail.com';

if (preg_match($pattern, $emailaddress) === 1) {
    // emailaddress is valid
}

PS หมายเหตุเกี่ยวกับรูปแบบ regex ที่ใช้ด้านบน (จากแหล่ง PHP) มันดูเหมือนว่ามีลิขสิทธิ์บางอย่างกับมันของไมเคิลรัชตัน ตามที่ระบุไว้: "อย่าลังเลที่จะใช้และแจกจ่ายรหัสนี้อีกครั้ง แต่โปรดแจ้งให้ทราบลิขสิทธิ์นี้"


คำตอบที่ดี แต่ตามลิงค์นี้: haacked.com/archive/2007/08/21/…ชื่อผู้ใช้ o ส่วนภายในสามารถอ้างถึงสตริงได้ แต่ FILTER_VALIDATE_EMAIL ไม่ยอมรับ
Daniel De León

3
ไม่สามารถใช้ได้กับที่อยู่อีเมลทั้งหมดตามที่ระบุไว้ ดูรายการของการทดสอบที่ล้มเหลวในคำตอบของฉันเพื่อดูว่าสตริงที่ยกมาบางตัวทำงานได้และที่อื่นไม่ได้
PeeHaa

4
ไม่การทดสอบที่ล้มเหลวมากเกินไปในรูปแบบนั้นemailtester.pieterhordijk.com/test-pattern/MTAz :-)
PeeHaa

1
รูปแบบนี้ซับซ้อนมากในกรณีที่คุณจำเป็นต้องใช้กับฟังก์ชันเช่น "preg_match_all" เหนือสตริงข้อความขนาดใหญ่ที่มีอีเมลอยู่ภายใน หากคุณคนใดมีความเรียบง่ายกรุณาแบ่งปัน ฉันหมายถึงถ้าคุณต้องการ: preg_match_all (รูปแบบ $, $ text_string, $ ตรงกัน); รูปแบบที่ซับซ้อนนี้จะโอเวอร์โหลดเซิร์ฟเวอร์หากคุณต้องการแยกวิเคราะห์ข้อความที่มีขนาดใหญ่มาก
Vlado

4
@PeeHaa: Postfix 3.0 สนับสนุนมาเกือบสองปีแล้ว: postfix.org/SMTPUTF8_README.htmlและมันรวมอยู่ใน Ubuntu 16.04 และจะรวมอยู่ใน Debian รุ่นถัดไป Exim มีการสนับสนุนการทดลอง ผู้ให้บริการเว็บเมลเช่น Gmail ได้เพิ่มการสนับสนุนสำหรับการส่ง / รับอีเมลดังกล่าวแม้ว่าคุณจะยังไม่สามารถสร้างบัญชี Unicode ได้ การใช้งานและการสนับสนุนอย่างกว้างขวางนั้นอยู่ใกล้แค่เอื้อมและfilter_varจะล่าช้าไปบ้างในบางครั้งแม้ว่าพวกเขาจะเปลี่ยนมันทันที (ฉันได้โพสต์รายงานข้อผิดพลาด)
iquit

43

คุณสามารถใช้filter_varสำหรับสิ่งนี้

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>

1
หยุดเพิ่มฟังก์ชันนี้เนื่องจากไม่ได้ตรวจสอบความถูกต้องของโดเมน หากคุณกำลังเพิ่มที่อยู่ @ ที่ถูกต้อง และมันไม่ใช่!
Herr Nentu '11

อะไรคือฟังก์ชั่นหนึ่งบรรทัดที่มีฟังก์ชั่นหนึ่งบรรทัด ฉันเห็นพวกเขาทุกที่ สิ่งนี้กลายเป็น "สิ่ง" เมื่อใด (วาทศิลป์) สิ่งนี้ต้องหยุด
บลูวอเตอร์

15

จากประสบการณ์ของฉันregexการแก้ปัญหามีผลบวกปลอมมากเกินไปและfilter_var()วิธีแก้ปัญหามีผลเชิงลบที่ผิดพลาด (โดยเฉพาะกับTLDรุ่นใหม่ทั้งหมด)

แต่จะดีกว่าเพื่อให้แน่ใจว่าที่อยู่มีทุกส่วนที่จำเป็นของที่อยู่อีเมล (ผู้ใช้สัญลักษณ์ "@" และโดเมน) จากนั้นตรวจสอบว่าโดเมนนั้นมีอยู่จริง

ไม่มีวิธีกำหนด (ฝั่งเซิร์ฟเวอร์) หากมีผู้ใช้อีเมลสำหรับโดเมนภายนอก

นี่เป็นวิธีที่ฉันสร้างในคลาส Utility:

public static function validateEmail($email)
{
    // SET INITIAL RETURN VARIABLES

        $emailIsValid = FALSE;

    // MAKE SURE AN EMPTY STRING WASN'T PASSED

        if (!empty($email))
        {
            // GET EMAIL PARTS

                $domain = ltrim(stristr($email, '@'), '@') . '.';
                $user   = stristr($email, '@', TRUE);

            // VALIDATE EMAIL ADDRESS

                if
                (
                    !empty($user) &&
                    !empty($domain) &&
                    checkdnsrr($domain)
                )
                {$emailIsValid = TRUE;}
        }

    // RETURN RESULT

        return $emailIsValid;
}

Neverbounce อ้างว่า API ของพวกเขาสามารถตรวจสอบการจัดส่งได้ถึง 97% ตราบใดที่คุณไม่สนใจส่งฐานข้อมูลผู้ติดต่อของคุณ
Tom Russell

stristrจะไม่สามารถรับโดเมนได้หากมีเครื่องหมาย @ หลายรายการ ดีกว่าที่จะexplode('@',$email)ตรวจสอบสิ่งนั้นsizeof($array)==2
Aaron Gillion

@AaronGillion ในขณะที่คุณถูกต้องเท่าที่เป็นวิธีที่ดีกว่าที่จะได้รับส่วนโดเมนวิธีการจะยังคงกลับเท็จเช่นเดียวกับที่checkdnsrr()จะกลับเท็จถ้ามีการลงชื่อเข้าใช้ @ ในโดเมน
Jabari

11

ฉันคิดว่าคุณน่าจะใช้ตัวกรอง inbuilt ของ PHP ดีกว่าในกรณีนี้:

มันสามารถส่งคืนจริงหรือเท็จเมื่อมาพร้อมกับFILTER_VALIDATE_EMAILพารามิเตอร์


9

สิ่งนี้จะไม่เพียง แต่ตรวจสอบความถูกต้องของอีเมลของคุณ แต่ยังทำให้ถูกต้องสำหรับอักขระที่ไม่คาดคิด:

$email  = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);

if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
    $emailB != $email
) {
    echo "This email adress isn't valid!";
    exit(0);
}

4

ตอบคำถามนี้ใน 'คำถามยอดนิยม' เกี่ยวกับการยืนยันอีเมลhttps://stackoverflow.com/a/41129750/1848217

สำหรับฉันวิธีการตรวจสอบอีเมลที่ถูกต้องคือ:

  1. ตรวจสอบว่ามีสัญลักษณ์ @ อยู่และก่อนและหลังมีสัญลักษณ์ที่ไม่ใช่ @: /^[^@]+@[^@]+$/
  2. ลองส่งอีเมลไปยังที่อยู่นี้ด้วย "รหัสเปิดใช้งาน"
  3. เมื่อผู้ใช้ "เปิดใช้งาน" ที่อยู่อีเมลของเขาเราจะเห็นว่าทั้งหมดถูกต้อง

แน่นอนคุณสามารถแสดงคำเตือนหรือคำแนะนำเครื่องมือในส่วนหน้าเมื่อผู้ใช้พิมพ์อีเมล "แปลก" เพื่อช่วยให้เขาหลีกเลี่ยงข้อผิดพลาดทั่วไปเช่นไม่มีจุดในส่วนโดเมนหรือช่องว่างในชื่อโดยไม่ต้องอ้างถึง แต่คุณต้องยอมรับที่อยู่ "hello @ world" หากผู้ใช้ต้องการมันจริงๆ

นอกจากนี้คุณต้องจำไว้ว่ามาตรฐานที่อยู่อีเมลนั้นเป็นและสามารถวิวัฒนาการดังนั้นคุณจึงไม่สามารถพิมพ์ regexp "มาตรฐานที่ถูกต้อง" บางครั้งและทุกครั้ง และคุณต้องจำไว้ว่าเซิร์ฟเวอร์อินเทอร์เน็ตที่เป็นรูปธรรมบางตัวสามารถล้มเหลวในรายละเอียดของมาตรฐานทั่วไปและอันที่จริงแล้วใช้งานได้กับ

ดังนั้นเพียงแค่ตรวจสอบ @ ให้คำแนะนำผู้ใช้ในส่วนหน้าและส่งอีเมลยืนยันตามที่อยู่ที่ระบุ


1
regex ของคุณทำการตรวจสอบ@แต่ไม่ได้ตรวจสอบจริง ๆ ว่าถูกต้องสำหรับ RFC ใด ๆ ที่ควบคุมอีเมล มันไม่ทำงานตามที่เขียนไว้ ฉันวิ่งผ่าน regex101.com และไม่สามารถจับคู่ที่อยู่ที่ถูกต้องได้
Machavity

คุณอ่านเฉพาะ regex หรือคำตอบทั้งหมดหรือไม่ ไม่เห็นด้วยอย่างเต็มที่กับคุณ เพียงแค่บอกฉันโปรดตามสิ่งที่ RFC เซิร์ฟเวอร์ gmail.com ถือว่า joe@gmail.com และ jo.e@gmail.com เป็นที่อยู่เดียวกัน มีเซิร์ฟเวอร์จำนวนมากที่ทำงานไม่ได้ตามมาตรฐานหรือไม่ตามมาตรฐาน FRESH แต่ให้บริการอีเมลของผู้ใช้ หากคุณพิมพ์ regexp หนึ่งครั้งและตรวจสอบโดยที่คุณไม่รับประกันว่าจะอยู่ในอนาคตและผู้ใช้ในอนาคตของคุณจะไม่ล้มเหลวด้วยอีเมล "ทางใหม่" ของพวกเขา ดังนั้นตำแหน่งของฉันเหมือนกัน: ประเด็นหลักถ้าคุณต้องการยืนยันที่อยู่อีเมล - เพียงแค่ส่งอีเมลยืนยันการใช้งาน
FlameStorm

@Mavavity แต่ขอบคุณสำหรับ bugreport ใน regexp ฉันแก้ไขมันจาก/^[^@]+@[^@+]$/ไป/^[^@]+@[^@]+$/
FlameStorm

อุปกรณ์ประกอบฉากสำหรับคุณในการแก้ไข regex แต่มันมีวิธีการที่ดีกว่าfilter_varวิธีนี้อย่างไร ไม่สามารถแก้ไขปัญหาของการยอมรับที่อยู่ในรูปแบบที่ไม่ดีเช่นกัน regex ของคุณจะยอมรับอย่างมีความสุขjoe@domainในฐานะที่อยู่อีเมลที่ถูกต้องเมื่อไม่ใช่
Machavity

@Machavity อย่างเช่นมี PHP รุ่นที่เป็นรูปธรรมบนเซิร์ฟเวอร์ของคุณและคุณไม่สามารถอัปเดตเป็นรุ่นใหม่ล่าสุด ตัวอย่างเช่นคุณมี php 5.5.15 ในปี 2018 มาตรฐานของอีเมลที่ถูกต้องได้รับการขยาย มันจะรับรู้ใน php 7.3.10 เร็ว ๆ นี้ และจะมีฟังก์ชั่นที่ใช้งานfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)ได้ดี แต่คุณมีฟังก์ชั่นเก่า ๆ บนเซิร์ฟเวอร์คุณไม่สามารถอัพเดทได้ในบางกรณี และคุณจะหลวมลูกค้าด้วยอีเมลที่ถูกต้องใหม่ ยิ่งไปกว่านั้นฉันสังเกตเห็นอีกครั้งว่าผู้ให้บริการอีเมลไม่ใช่ทุกคนที่ทำงานอย่างเคร่งครัดตามมาตรฐานที่อยู่อีเมลมาตรฐานและทันสมัยของที่อยู่อีเมล
FlameStorm

3

หากคุณต้องการตรวจสอบว่าโดเมนจากที่อยู่อีเมลถูกต้องหรือไม่ให้ใช้สิ่งที่ต้องการ:

/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
    function check_email_domain($email) {
        //Get host name from email and check if it is valid
        $email_host = explode("@", $email);     
        //Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        $host = end($email_host) . "."; 
        //Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)       
    }
}

วิธีนี้เป็นวิธีที่มีประโยชน์ในการกรองจำนวนมากที่อยู่อีเมลที่ไม่ถูกต้องพร้อมกับการตรวจสอบอีเมลมาตรฐานเพราะที่ถูกต้องในรูปแบบอีเมลไม่ถูกต้องไม่ได้หมายถึงอีเมล

โปรดทราบว่าidn_to_ascii()ฟังก์ชั่น (หรือฟังก์ชั่นน้องสาวของเขาidn_to_utf8()) อาจไม่สามารถใช้งานได้ในการติดตั้ง PHP ของคุณซึ่งต้องใช้ส่วนขยาย PECL intl> = 1.0.2 และ PECL idn> = 0.1

โปรดทราบว่าuser@[IPv6:2001:db8::1]ไม่สามารถตรวจสอบความถูกต้องของIPv4 หรือ IPv6 เป็นส่วนหนึ่งของโดเมนในอีเมล (ตัวอย่าง) เฉพาะโฮสต์ที่มีชื่อเท่านั้น

ดูเพิ่มเติมได้ที่นี่


ฉันไม่คิดว่ามันจะใช้งานได้หากส่วนโฮสต์ของที่อยู่อีเมลเป็นที่อยู่ IP ในรูปแบบ IPv6
GordonM

2

หลังจากอ่านคำตอบที่นี่นี่คือสิ่งที่ฉันลงเอยด้วย:

public static function isValidEmail(string $email) : bool
{
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }

    //Get host name from email and check if it is valid
    $email_host = array_slice(explode("@", $email), -1)[0];

    // Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
    if (!filter_var($email_host,FILTER_VALIDATE_IP, [
        'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
    ])) {
        //Add a dot to the end of the host name to make a fully qualified domain name
        // and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        // Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        $email_host = idn_to_ascii($email_host.'.');

        //Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
        if (!checkdnsrr($email_host, "MX")) {
            return false;
        }
    }

    return true;
}

1

หากคุณเพียงแค่มองหา regex [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+ที่เกิดขึ้นจริงที่ช่วยให้การจุดต่างๆและขีดขีดกลางดังต่อไปนี้: ที่จะช่วยให้การtom_anderson.1-neo@my-mail_matrix.comตรวจสอบอีเมลที่ค่อนข้างโง่ดูเหมือนว่าจะถูกตรวจสอบ


0
/(?![[:alnum:]]|@|-|_|\.)./

ทุกวันนี้ถ้าคุณใช้แบบฟอร์ม HTML5 type=emailคุณก็ปลอดภัยแล้ว 80% เนื่องจากเบราว์เซอร์เอ็นจิ้นมีเครื่องมือตรวจสอบของตัวเอง เพื่อเสริมให้เพิ่ม regex นี้ของคุณpreg_match_all()และคัดค้าน:

if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }

ค้นหา regex ที่ใช้โดยแบบฟอร์ม HTML5 สำหรับการตรวจสอบความถูกต้อง
https://regex101.com/r/mPEKmy/1


ฉันเกลียดคำอธิบาย downvotes เช่นกันโดยไม่มีคำอธิบาย ฉันเดาว่าเขาอาจจะพูดว่า: การตรวจสอบอีเมลของเบราว์เซอร์ (ฝั่งไคลเอ็นต์) ไม่ปลอดภัยเลย ทุกคนสามารถส่งสิ่งใดไปยังเซิร์ฟเวอร์ได้โดยเปลี่ยนรหัส ดังนั้นจึงเป็นวิธีที่ชัดเจนและปลอดภัยที่สุดในการตรวจสอบฝั่งเซิร์ฟเวอร์ (อีกครั้ง) คำถามที่นี่ขึ้นอยู่กับ PHP ดังนั้นคาเมรอนที่ชัดเจนจึงมองหาโซลูชันเซิร์ฟเวอร์และไม่ใช่โซลูชันของลูกค้า
Jonny

คำตอบนี้อาจไม่เกี่ยวข้องกับ PHP อย่างสมบูรณ์ แต่คำแนะนำ HTML ครอบคลุมผู้ใช้ "มาตรฐาน" โดยใช้เพียงโทรศัพท์ / พีซี ผู้ใช้ยังได้รับข้อมูลโดยตรงในเบราว์เซอร์ "ของเขา" ในขณะที่ใช้เว็บไซต์ ตรวจสอบจริงในฝั่งเซิร์ฟเวอร์จะไม่ครอบคลุมกับสิ่งนี้แน่นอน Btw, @Thielicious พูดถึงการเปลี่ยนแปลง PHP ดังนั้นความคิดเห็นของเขาจึงเกี่ยวข้องกับ IMHO
k00ni

อาจได้รับคะแนนโหวตลดลงเนื่องจากข้อสันนิษฐานว่าคุณ "ปลอดภัย 80% เนื่องจากเครื่องมือเบราว์เซอร์มีเครื่องมือตรวจสอบของตนเอง" มีวิธีอื่นในการส่งคำขอ HTTP มากกว่าผ่านเบราว์เซอร์ดังนั้นคุณจึงไม่สามารถคาดเดาได้ว่าคำขอใด ๆ จะปลอดภัย ... แม้ว่าคุณจะตรวจสอบตัวแทนของเบราว์เซอร์ก็ตาม
Jabari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.