คอมพิวเตอร์ หน้าต่าง อินเทอร์เน็ต

คำแนะนำสำหรับการใช้ jSQL Injection ซึ่งเป็นเครื่องมือมัลติฟังก์ชั่นสำหรับการค้นหาและใช้ประโยชน์จากการฉีด SQL ใน Kali Linux คำแนะนำสำหรับการใช้ jSQL Injection - เครื่องมือมัลติฟังก์ชั่นสำหรับการค้นหาและใช้ประโยชน์จากการฉีด SQL ใน Kali Linux #8

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

สิ่งที่สำคัญที่สุดในงานนี้คือการออกแบบฐานข้อมูลสำหรับเมนูหลายระดับของเรา มาสร้างตารางหมวดหมู่ที่มีสามฟิลด์กันเถอะ รหัส, ชื่อ, พ่อแม่ที่ไหน:

  • รหัส- ตัวระบุ
  • ชื่อ- ชื่อเมนู
  • พ่อแม่- ผู้ปกครองหมวดหมู่เริ่มต้น 0

ฟิลด์มีหน้าที่แยกเมนู พ่อแม่ถ้า ผู้ปกครอง = 0หมวดหมู่นี้เป็นหมวดหมู่หลัก หากต้องการเพิ่มลูกในหมวดหมู่หลัก คุณต้องระบุในช่องหลัก รหัสผู้ปกครองที่ต้องการ ตัวอย่างเช่น:

ตารางที่มีหมวดหมู่

ดังที่เห็นได้จากตาราง หมวดหมู่พาเรนต์ รถมีทายาทสองคน มาสด้าและ ฮอนด้าที่เกี่ยวข้องตามเขตข้อมูล พ่อแม่. และหมวด รถจักรยานยนต์ลูกหลานสองคนคือ คาวาซากิและ ฮาร์เลย์. ในเวลาเดียวกันหมวดหมู่เรือไม่มีลูกหลาน ฉันหวังว่าคุณจะเข้าใจวิธีเชื่อมโยงหมวดหมู่

ต่อไปเราจะย้ายจากคำไปสู่การปฏิบัติ มาสร้างตารางหมวดหมู่กันเถอะ

สร้างตารางหากไม่มี `หมวดหมู่` (`id` int(10) ที่ไม่ได้ลงชื่อ NOT NULL AUTO_INCREMENT, `title` varchar(255) ไม่เป็นโมฆะ, `parent` int(10) ที่ไม่ได้ลงชื่อ NOT NULL, คีย์หลัก (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- การถ่ายโอนข้อมูลตาราง `หมวดหมู่` -- แทรกลงใน `หมวดหมู่` (`id`, `title`, `parent`) ค่า (1, "รถยนต์", 0), (2, "รถจักรยานยนต์", 0), (3, Mazda, 1), (4, Honda, 1), (5, Kawasaki, 2), (6, Harley, 2), (7, Mazda 3, 3), (8, "Mazda 6", 3), (9 , "ซีดาน", 7), (10, "Hatchback", 7), (11, "เรือ", 0), (12, "Liftback", 8), (13, "Crossover", 8), (14, "สีขาว", 13), (15, "สีแดง", 13), (16, "สีดำ", 13), (17, "สีเขียว", 13), (18, Mazda CX, 3), (19, Mazda MX, 3);

อัลกอริทึมของการทำงานประกอบด้วยสิ่งต่อไปนี้:

การสร้างการเชื่อมต่อฐานข้อมูล

แบบสอบถาม ("ชื่อชุด"utf8""); /* * นี่เป็นวิธีเชิงวัตถุ "เป็นทางการ" ในการทำเช่นนี้ * อย่างไรก็ตาม $connect_error ไม่ทำงานจนกว่า PHP 5.2.9 และ 5.3.0 */ if ($mysqli->connect_error) ( die("Connection Failed (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * หากคุณต้องการแน่ใจว่ามันเข้ากันได้กับเวอร์ชั่นก่อน 5.2.9 * จะดีกว่าถ้าใช้โค้ดแบบนี้ */ if (mysqli_connect_error()) ( die("การเชื่อมต่อล้มเหลว (" . mys qli_connect_errno() . ") " . mysqli_connect_error()); )

การเขียนฟังก์ชันเพื่อรับข้อมูลจากตารางหมวดหมู่

//รับเมนูอาร์เรย์ของเราจากฐานข้อมูลเป็นฟังก์ชันอาร์เรย์ getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //สร้างอาร์เรย์โดยคีย์อาร์เรย์คือ ID เมนู $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; )

เราได้อาร์เรย์แบบนี้ โดยที่คีย์อาร์เรย์คือรหัสหมวดหมู่

ฟังก์ชัน Array Tree โดย Tommy Lacroix

//ฟังก์ชันสร้างแผนผังจากอาร์เรย์จากฟังก์ชัน Tommy Lacroix getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //หากไม่มีไฟล์แนบ if (!$node["parent"])( $tree[$id] = &$node; )else( //หากมีลูก ให้วนซ้ำอาร์เรย์ $dataset[$node["parent"]]["childs"][$id] = &$node ; ) ) ส่งคืน $tree; )

รับอาร์เรย์ในรูปแบบของต้นไม้

สคริปต์ทั้งหมด

แบบสอบถาม ("ชื่อชุด"utf8""); /* * นี่เป็นวิธีเชิงวัตถุ "เป็นทางการ" ในการทำเช่นนี้ * อย่างไรก็ตาม $connect_error ไม่ทำงานจนกว่า PHP 5.2.9 และ 5.3.0 */ if ($mysqli->connect_error) ( die("Connection Failed (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * หากคุณต้องการแน่ใจว่ามันเข้ากันได้กับเวอร์ชั่นก่อน 5.2.9 * จะดีกว่าถ้าใช้โค้ดแบบนี้ */ if (mysqli_connect_error()) ( die("การเชื่อมต่อล้มเหลว (" . mys qli_connect_errno() . ") " . mysqli_connect_error()); ) //รับเมนูอาร์เรย์จากฐานข้อมูลเป็นฟังก์ชันอาร์เรย์ getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //สร้างอาร์เรย์โดยคีย์อาร์เรย์คือ ID เมนู $cat = array(); while($row = $res->fetch_assoc( ))( $cat[$row["id"]] = $row; ) return $cat; ) //Tommy Lacroix array tree building function function getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //หากไม่มีไฟล์แนบ if (!$node["parent"])( $tree[$id] = &$node; )else( //หากมีลูก ให้ทำซ้ำผ่านอาร์เรย์ $dataset[$node[ "parent"]]["childs"][$id] = &$node; ) ) return $tree; ) // รับอาร์เรย์ที่เตรียมไว้พร้อมข้อมูล $cat = getCat($mysqli); //สร้างเมนูต้นไม้ $tree = getTree($cat); // เทมเพลตสำหรับแสดงเมนูเป็นฟังก์ชันต้นไม้ tplMenu($category)( $menu = "
  • ".$category["title"].""; if(isset($category["childs"]))( $menu .= "
      ".showCat($category["children"]) ."
    " ; ) $menu .="
  • "; return $menu; ) /** * Read our template recursively **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) return $string; ) // รับมาร์กอัพ HTML $cat_menu = showCat($tree); //Display echo "
      ".$cat_menu"
    "; ?>

    ผลของการทำงาน

    เมนูหลายระดับใน PHP + MySQL สำหรับผู้ดูแลระบบ

    หากคุณต้องการใช้เมนูนี้ในแผงการดูแลระบบของไซต์ของคุณ คุณต้องเขียนฟังก์ชันสองสามอย่างใหม่ tplเมนู(), โชว์แคท().

    ".$หมวดหมู่["ชื่อ"]."" ; )else( $เมนู = " "; ) if(isset($category["childs"]))( $i = 1; for($j = 0; $j< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

    ผลของการทำงาน

    เลือกรถยนต์ → Mazda →→ Mazda 3 →→→ Sedan →→→ Hatchback →→ Mazda 6 →→→ Liftback →→→ ครอสโอเวอร์ →→→→ สีขาว →→→→ สีแดง →→→→ สีดำ →→→→ สีเขียว →→ Mazda CX →→ Mazda MX → รถจักรยานยนต์ฮอนด้า → Kawasaki → Harley Boats

    ในบทความบล็อกก่อนหน้านี้ ฉันได้เขียนเกี่ยวกับนวัตกรรมที่น่าสนใจใน wordpress เวอร์ชันล่าสุด ซึ่งเป็นกลไกพิเศษสำหรับการสร้างและจัดการ . ตอนนี้ผู้ใช้ทั่วไปสามารถสร้างเมนูที่มีความซับซ้อนต่าง ๆ ได้สะดวกและง่ายขึ้นซึ่งอาจประกอบด้วยหน้าบล็อกหรือหมวดหมู่ แต่ยังมีลิงก์ไปยัง URL ใด ๆ ในการแสดงเมนูในเทมเพลตจะใช้ฟังก์ชัน wp_nav_menu พิเศษ - ฉันจะบอกคุณเกี่ยวกับเรื่องนี้ในวันนี้

    หากไม่มีส่วนเมนูใน wordpress admin ก็เปิดใช้งานได้โดยเพิ่มโค้ดพิเศษในไฟล์ functions.php

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

    ใช้พารามิเตอร์ต่อไปนี้ที่นี่:

    เมนู $- ตัวระบุที่เลือกสำหรับเมนู - ID, slug หรือชื่อเมนู

    $คอนเทนเนอร์- เมนู UL เริ่มต้นคือ "ห่อ" ในคอนเทนเนอร์ DIV โดยใช้การตั้งค่านี้

    $container_class- ระบุคลาสของคอนเทนเนอร์ โดยค่าดีฟอลต์คือ menu-(menu slug)-container นั่นคือในกรณีของเรา ตัวอย่างเช่น จะมีคลาส menu-first-container

    $container_id- คุณสามารถเพิ่ม ID ลงในคอนเทนเนอร์ ซึ่งไม่ได้ระบุโดยค่าเริ่มต้น

    $เมนู_คลาสเป็นคลาสสำหรับรายการเมนู UL ค่าของมันคือเมนู

    $menu_id- ID สำหรับองค์ประกอบ ul เริ่มต้นที่เมนู - (กระสุน)

    $เสียงสะท้อน- หากคุณไม่ต้องการแสดงเมนูแต่คืนค่าของฟังก์ชัน ให้ใช้ค่า 0 สำหรับการตั้งค่านี้

    $fallback_cb- หากไม่มีเมนู ฟังก์ชัน wp_page_menu จะถูกเรียกใช้

    $ก่อน- กำหนดข้อความที่แสดงก่อนลิงค์ A

    $link_before— แสดงวลีก่อนข้อความลิงก์ ไม่ได้ตั้งค่า

    $link_after- แสดงหลังข้อความลิงก์ ว่างเปล่าเช่นกัน

    $ ความลึก- ตั้งค่าจำนวนของระดับลำดับชั้นสำหรับการแสดงเมนู ค่าเริ่มต้นของ 0 จะแสดงเมนูทั้งหมด

    $วอล์กเกอร์- "วัตถุวอล์คเกอร์" ของผู้ใช้ที่เข้าใจยากบางประเภทอาจต้องการนักพัฒนาขั้นสูงกว่านี้

    $theme_location- ตำแหน่งของธีมที่จะใช้เมนูจะต้องเปิดใช้งานผ่าน register_nav_menu() เพื่อให้ผู้ใช้เลือกได้ นอกจากนี้ยังมีการตั้งค่าบางอย่างที่ไม่ชัดเจนเมื่อทำงานกับวิดเจ็ต

    ตัวอย่างการใช้ฟังก์ชัน wp_nav_menu

    รหัสที่ง่ายที่สุดที่กำหนดใน codex:

    การลบคอนเทนเนอร์ DIV ออกจากเมนู

    "")); ?>

    โดยหลักการแล้ว การสร้างและจัดการเมนู wordpress 3.0 นั้นไม่มีอะไรซับซ้อน นักพัฒนาได้ทำให้ขั้นตอนการทำงานง่ายขึ้นอย่างมากและขยายขีดความสามารถขององค์ประกอบการนำทางนี้ โซลูชันนี้มักใช้ในงานเทมเพลตจำนวนมาก เช่น เมื่อสร้างสำหรับเวอร์ชันมือถือและเดสก์ท็อป อีกไม่นานฉันจะเพิ่มตัวอย่างเล็ก ๆ น้อย ๆ ในหัวข้อ

    ป.ล. อารักขา. น่าสนใจและมีประโยชน์สำหรับเว็บมาสเตอร์ Blog on SEO ซึ่งคุณจะพบคำตอบสำหรับคำถามของคุณเกี่ยวกับ seo
    บริษัท Aweb มีชื่อเสียงมาอย่างยาวนานและเป็นที่ยอมรับในด้านการโปรโมตเว็บไซต์ การเพิ่มประสิทธิภาพ และการโปรโมตเครื่องมือค้นหาบนอินเทอร์เน็ต

    แสดงเมนูแบบกำหนดเองที่สร้างในแผงควบคุม: ลักษณะที่ปรากฏ > เมนู

    เมนูการนำทางที่จะแสดง (อาจมีหลายรายการ) ระบุไว้ในพารามิเตอร์ theme_location

    หากไม่ได้ระบุพารามิเตอร์ theme_location เมนูสำหรับแสดงผลจะถูกเลือกตามลำดับต่อไปนี้:

      เมนูที่ตรงกับ ID, slug หรือคำอธิบายที่ส่งผ่านในพารามิเตอร์ "menu" และหากมีอย่างน้อยหนึ่งลิงก์ (หนึ่งองค์ประกอบ) ในเมนูนี้

      มิฉะนั้นเมนูแรกจะไม่ว่างเปล่า

      หรือแสดงค่าที่ส่งกลับโดยฟังก์ชันที่ระบุในพารามิเตอร์ "fallback_cb" (โดยค่าเริ่มต้น ฟังก์ชัน wp_page_menu จะระบุไว้ที่นั่น)

    1. ถ้าไม่มีอะไรตรงกัน ฟังก์ชันจะไม่แสดงผลอะไรเลย

    เพื่อให้ธีมรองรับเมนู คุณต้องเปิดใช้คุณสมบัตินี้ด้วย:
    add_theme_support("เมนู");

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

    ตัวกรองการเปลี่ยนแปลงรายการเมนู

    • add_filter("wp_nav_menu_args", "my_wp_nav_menu_args"); ฟังก์ชัน my_wp_nav_menu_args($args = "")( $args["container"] = false; return $args; )

      #4.1. เรามาลบคอนเทนเนอร์เพียงรายการเดียวเมนูที่แสดง

      "" ]); ?>

      # 5 นำกระดาษห่อ ul ออก

      ตัวอย่างนี้จะลบ ul wrapper ออกจากเมนู:

      "%3$s" ]); ?>

      # 6 เพิ่มคำที่ด้านบนของเมนู

      ตัวอย่างนี้แสดงวิธีการเพิ่มคำที่ด้านบนสุดของรายการเมนู โดยเป็นรายการเมนูเดียวกันแต่ไม่ใช่ลิงก์ มาเพิ่มคำว่า "รายการ" ที่ส่วนต้นของเมนู และระบุแอตทริบิวต์ id สำหรับแท็ก li ที่สร้างขึ้นด้วย:

      "หลัก", "items_wrap" => "

      • รายการ:
      • %3$s
      " ]); ?>

      #7 เพิ่มคลาส CSS ในทุกเมนู

      การใช้ hook เราสามารถเพิ่มคลาส CSS ของเราเองได้หากตรงตามเงื่อนไขที่เราต้องการ

      เพิ่มคลาส CSS หากเป็นโพสต์และชื่อรายการเมนูคือ "บล็อก":

      Add_filter("nav_menu_css_class", "พิเศษ_nav_class", 10, 2); ฟังก์ชัน special_nav_class($classes, $item)( if(is_single() && $item->title == "Blog"){ $classes = "special-class"; } return $classes; } !}

      # 8 ใช้ฟังก์ชันของคุณเพื่อสร้างเมนู

      ก่อนอื่น คุณต้องระบุอาร์กิวเมนต์ "walker" => new Your_Walker_Function

      Your_Walker_Function เป็นคลาสใหม่ของเราที่สร้างเมนู เพื่อไม่ให้สร้างวงล้อขึ้นมาใหม่ สามารถคัดลอกจากต้นฉบับได้ ดูที่คลาส Walker_Nav_Menu เราคัดลอกรหัสชั้นเรียนและแก้ไขตามความจำเป็น

      นี่คือตัวอย่างที่เพิ่มความลึกของเมนูและคลาส CSS คู่/คี่ให้กับรายการเมนู (ทั้ง ul และ li):

      // คลาสการสร้างเมนูที่กำหนดเอง: คลาส magomra_walker_nav_menu ขยาย Walker_Nav_Menu ( // เพิ่มคลาสให้กับฟังก์ชันเมนูย่อย ul start_lvl(&$output, $ความลึก) ( // คลาสขึ้นอยู่กับความลึก $indent = ($ความลึก > 0 ? str_repeat("\t", $ความลึก) : ""); // โค้ดเยื้อง $display_ความลึก = ($ความลึก + 1); // เพราะมันนับเมนูย่อยแรกเป็น 0 $คลาส es = array("เมนูย่อย", ($display_ความลึก % 2 ? "เมนู-คี่" : "เมนู-คู่"), ($display_ความลึก >=2 ? "เมนูย่อยย่อย" : ""), "เมนูความลึก-" . $display_html); $class_names = implode(" ", $classes); // build html $output .= "\n" . $indent "

        " . "\n"; ) // เพิ่มคลาสหลัก/ย่อยให้กับ li"s และลิงก์ฟังก์ชัน start_el(&$output, $item, $ความลึก, $args) ( global $wp_query; $indent = ($ความลึก > 0 ? str_repeat("\t", $ความลึก) : ""); // โค้ดเยื้อง // คลาสขึ้นอยู่กับความลึก $ความลึก_classes = อาร์เรย์(($ความลึก == 0 ? "เมนูหลักรายการ" : "ย่อย- เมนูรายการ"), ($ความลึก >=2 ? "sub-sub-menu-item" : ""), ($ความลึก % 2 ? "เมนูรายการ-คี่" : "เมนูรายการ-คู่"), "เมนูรายการความลึก-" . $ความลึก); $ความลึก_class_names = esc_attr(implode(" ", $ความลึก_คลาส)); // ผ่านคลาส $classes = ว่าง($item->คลาส) ?ar ray() : (อาร์เรย์) $item->classes; $class_names = esc_attr(implode(" ", apply_filters("nav_menu_css_class", array_filter($classes), $item))); // build html $output .= $indent "
      • ) คืนสินค้า $; ) ฟังก์ชัน __nav_hasSub($item_id, $items)( foreach($items as $item)( if($item->menu_item_parent && $item->menu_item_parent == $item_id) return true; ) return false; )

        #11 การเพิ่มคลาสให้กับรายการเมนูแต่ละรายการ

        จากเวอร์ชัน 4.1

        มีตะขอพิเศษสำหรับสิ่งนี้: nav_menu_css_class และตอนนี้สามารถเพิ่มหรือลบชั้นเรียนได้ ตัวอย่างเช่น ลองเพิ่มคลาส my__class ให้กับรายการเมนูทั้งหมด:

        Add_filter("nav_menu_css_class", "add_my_class_to_nav_menu", 10, 2); ฟังก์ชัน add_my_class_to_nav_menu($classes, $item)( /* $classes มี Array( => menu-item => menu-item-type-post_type => menu-item-object-page => menu-item-284) */ $classes = "my__class"; return $classes; )

        อัพเป็นเวอร์ชั่น 4.1.

        คลาสสำหรับรายการเมนูถูกเพิ่มโดยฟังก์ชัน _wp_menu_item_classes_by_context(&$menu_items); . แต่น่าเสียดายที่ไม่มีตัวกรองเพื่อเพิ่มชั้นเรียนของคุณ ดังนั้นลองใช้ไม้ยันรักแร้ str_replace() :

        // รับแทนการแสดงเมนู $menu = wp_nav_menu(array("echo" => 0,)); // เพิ่มคลาส my__class ให้กับรายการทั้งหมด $menu = str_replace("class="menu-item", "class="menu-item my__class", $menu); // แสดง echo $menu;

        # 12 แสดงเมนูถ้ามีอยู่เท่านั้น

        ตามค่าเริ่มต้น หากไม่มีเมนู หน้าเว็บไซต์จะแสดงแทน แต่ถ้าคุณต้องการแสดงเมนูเมื่อสร้างในแผงการดูแลระบบเท่านั้น ให้ระบุพารามิเตอร์ fallback_cb เป็น "__return_empty_string" :

        wp_nav_menu(อาร์เรย์("theme_location" => "เมนูหลัก", "fallback_cb" => "__return_empty_string"));

        # 13 แสดงเฉพาะรายการย่อยของเมนู

        สมมติว่ามีระดับแรกและแต่ละองค์ประกอบของระดับแรกมีเมนูย่อยของตัวเอง เราจำเป็นต้องแสดงเมนูย่อยดังกล่าวสำหรับรายการที่มีคลาส menu-item-135:

        ## ตัด LIs ทั้งหมดของเมนูย่อยที่ต้องการออกและแสดงในบล็อค UL ของเรา $menu = wp_nav_menu(array("theme_location" => "header_menu", "container" => "", "echo" => 0,)); $regex_part = preg_quote("เมนูรายการ-135"); // แสดงเมนูย่อยของรายการ "gotovye-resheniya" preg_match("~". $regex_part ".*sub-menu[^>]+>(.*?)

      ~s", $menu, $mm); if(!empty($mm)) echo "";

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

      คลาส CSS สำหรับรายการเมนู

      คลาส CSS ต่อไปนี้ถูกเพิ่มไปยังรายการเมนู (แยกตามเงื่อนไขที่ผู้ใช้เปิดอยู่):

      สำหรับองค์ประกอบทั้งหมดในทุกหน้า

        .รายการเมนู- ไปยังรายการเมนูทั้งหมด

        .menu-item-object-(วัตถุ)- สำหรับองค์ประกอบทั้งหมดโดยที่ (วัตถุ) ถูกแทนที่ด้วยชื่อของประเภทโพสต์หรืออนุกรมวิธาน:
        .menu-item-object-category (สำหรับหมวดหมู่)
        .menu-item-object-tag (สำหรับแท็ก)
        .menu-item-object-page (สำหรับเพจถาวร)
        .menu-item-object-(กำหนดเอง)

      • .menu-item-type-(ประเภท)- สำหรับรายการเมนูทั้งหมด โดยที่ (ประเภท) จะถูกแทนที่ด้วยประเภทลิงก์ (โพสต์หรืออนุกรมวิธาน) จัดกลุ่มลิงก์ทุกประเภท:
        .menu-item-type-post_type (หน้าถาวร ประเภทโพสต์ที่กำหนดเอง)
        .menu-item-type-taxonomy (หมวดหมู่ ป้ายกำกับ หรืออนุกรมวิธานที่กำหนดเอง)

      สำหรับองค์ประกอบของหน้าปัจจุบัน

      • .current เมนูรายการ- หากลิงค์ในเมนูตรงกับที่อยู่ของเพจที่กำลังดู หน้าปัจจุบัน.

      สำหรับองค์ประกอบหลักของเพจที่กำลังดู

      • .current-menu-parent
      • .current-(วัตถุ)-บรรพบุรุษ
      • .current-(ชนิด)-บรรพบุรุษ

      สำหรับองค์ประกอบที่เกี่ยวข้องกับหน้าที่กำลังดูอยู่

      • .current เมนูบรรพบุรุษ
      • .current-(วัตถุ)-บรรพบุรุษ
      • .current-(ชนิด)-บรรพบุรุษ

      สำหรับองค์ประกอบที่เกี่ยวข้องกับหน้าหลักของไซต์

      • .menu-item-home

      ความเข้ากันได้กับฟังก์ชัน wp_page_menu()

      • .page_item
      • .page-item-$ID
      • .current_page_item
      • .current_page_parent
      • .current_page_ancestor

      $item วัตถุ

      พารามิเตอร์ $item

      ตัวอย่างมักใช้รายการเมนู $item พารามิเตอร์เกือบทั้งหมดขององค์ประกอบนี้แสดงอยู่ด้านล่าง:

      สนาม คำอธิบาย
      รหัส รหัสรายการเมนู
      menu_item_parent ID ของรายการเมนูพาเรนต์
      ชั้นเรียน อาร์เรย์ของคลาสองค์ประกอบเมนู
      post_date เพิ่มวันที่
      post_modified วันที่แก้ไขล่าสุด
      post_author ID ของผู้ใช้ที่เพิ่มรายการเมนูนี้
      ชื่อ ชื่อรายการเมนู
      URL ลิงค์รายการเมนู
      attr_title แอตทริบิวต์ชื่อเรื่องของลิงค์
      xfn แอตทริบิวต์ลิงก์ rel
      เป้า แอตทริบิวต์เป้าหมายของลิงก์
      ปัจจุบัน เป็น 1 ถ้านี่คือองค์ประกอบปัจจุบัน
      current_item_ancestor 1 ถ้าองค์ประกอบปัจจุบันเป็นองค์ประกอบที่ซ้อนกัน
      current_item_parent 1 ถ้าองค์ประกอบปัจจุบันเป็นองค์ประกอบหลัก
      menu_order หมายเลขซีเรียลในเมนู
      object_id ID วัตถุเมนู บันทึกเงื่อนไข ฯลฯ
      พิมพ์ ประเภทวัตถุเมนู (ภาษี รายการ)
      วัตถุ ชื่อภาษี ประเภทโพสต์: หน้า หมวดหมู่ post_tag ...
      type_label ชื่อประเภทที่แปลเป็นภาษาท้องถิ่น: หมวดหมู่, หน้า
      post_parent รหัสผู้ปกครอง
      post_title ชื่อกระทู้
      post_name ค่ายเพลง
      ตัวอย่าง $item
      WP_Post Object ( => 10 => 5 => 2019-02-11 13:33:39 => 2019-02-11 13:33:39 => => ใหม่ => => เผยแพร่ => ปิด => ปิด => => ใหม่ => => => 2019-02-11 23:10:19 => 2019-02-11 23:10:19 น. m-object-custom => => => =>)

      ตัวอย่างของการใช้พารามิเตอร์วอล์คเกอร์

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

      หากคุณต้องการสร้างเมนูสำหรับเค้าโครงที่ไม่ได้มาตรฐาน บางครั้ง การสร้างวัตถุนี้ใหม่อาจง่ายกว่าการสร้างเค้าโครงใหม่

      ตัวอย่างของวัตถุวอล์คเกอร์ ลองใช้คลาส Walker_Nav_Menu() ซึ่งใช้เป็นค่าเริ่มต้น ในนั้นเราสนใจวิธีเดียวเท่านั้น start_el() เขาเป็นผู้รับผิดชอบ HTML ของแต่ละองค์ประกอบ ตามกฎแล้วการเปลี่ยนแปลงเพียงอย่างเดียวก็เพียงพอแล้ว ในการทำเช่นนี้ คุณต้องสร้างคลาสของคุณเองที่จะขยายคลาส Walker_Nav_Menu และระบุในพารามิเตอร์วอล์คเกอร์เมื่อเรียกเมนู

      ลองดูตัวอย่าง รหัสของเมธอด start_el() ถูกนำมาใช้โดยไม่มีการเปลี่ยนแปลง เราใช้เป็นแม่แบบ:

      คลาส My_Walker_Nav_Menu ขยาย Walker_Nav_Menu ( /** * เริ่มเอาต์พุตองค์ประกอบ * * @since 3.0.0 * @since 4.4.0 มีการเพิ่มตัวกรอง (@see "nav_menu_item_args") * * @see Walker::start_el() * * @param string $output ผ่านโดยการอ้างอิง ใช้เพื่อผนวกเนื้อหาเพิ่มเติม * @param WP_Post $item เมนู วัตถุข้อมูลรายการ * @param int $ความลึก ความลึกของรายการเมนูใช้สำหรับการขยาย * @param stdClass $args วัตถุของอาร์กิวเมนต์ wp_nav_menu() ->item_spacing) ( $t = ""; $n = ""; ) อื่น ( $t = "\t"; $n = "\n"; ) $indent = ($ความลึก) ? str_repeat($t, $ความลึก) : ""; $classes = ว่าง( $item->classes) ? array() : (อาร์เรย์) $item->classes; $classes = "menu-item-" . $item->ID ; $args = apply_filters("nav_menu_item_args", $args, $item, $ความลึก); $class_names = join(" ", apply_filters("nav_menu_css_class", array_filter($classes ), $item, $args, $ความลึก)); $class_names = $class_names ? " class="" .esc_attr($class_names) ." """ : ""; $id = apply_filters("nav_menu_item_id", "menu-item-" $item->ID, $item, $args, $ความลึก); $id = $id ? " id="" . esc_attr($id) ." """ : ""; // สร้างโค้ด HTML สำหรับรายการเมนู $output .= $indent " "; $atts = array(); $atts["title"] = !empty($item->attr_title) ? $item->attr_title: ""; $atts["target"] = !empty($item->target) ? $item->target: ""; $atts["rel"] = !empty($item->xfn) ? $item->xfn: ""; $atts[ " href"] = !empty($item->url) ?$item->url: ""; $atts = apply_filters("nav_menu_link_attributes", $atts, $item, $args, $ความลึก); $attributes = ""; foreach ($atts as $attr => $value) ( ​​if (!empty($value))) ( $value = ("href" === $attr ) ? esc_url ($value) : esc_attr($value); $attributes .= " " . $attr . "="" . $value . """; ) ) $title = apply_filters("the_title", $item->title, $item->ID); $title = apply_filters("nav_menu_item_title", $title, $item, $args, $ความลึก); $item_output = $args-> ก่อน;$item_output .=" "; $item_output .= $args->link_before . $title . $args->link_after; $item_output .=""; $item_output .= $args->after; $output .= apply_filters("walker_nav_menu_start_el", $item_output, $item, $ความลึก, $args); ) )

      ตอนนี้เมื่อเรียกเมนูเราจะระบุวอล์คเกอร์ของเรา:

      Wp_nav_menu(array("theme_location" => "head_menu", "walker" => ใหม่ My_Walker_Nav_Menu(),));

      เสร็จสิ้น ตอนนี้แต่ละรายการเมนูจะถูกสร้างขึ้นตามรูปแบบ HTML ที่เราต้องการ

      เมนู BEM พร้อมตัวกรอง

      เค้าโครงจะถูกสร้างขึ้นตามวิธีการของ BEM:

      ไฟล์ index.phpหรืออื่นเพื่อแสดงเมนู

      "เมนูส่วนหัว", ]);

      ไฟล์ functions.php

      "พื้นที่ด้านบน", "footer-menu" => "พื้นที่ด้านล่าง", ]); )); // เปลี่ยนตัวเลือกเมนูหลัก add_filter("wp_nav_menu_args", "filter_wp_menu_args"); function filter_wp_menu_args($args) ( if ($args["theme_location"] === "header-menu") ( $args["container"] = false; $args["items_wrap"] = ""; $args["menu_class"] = "menu menu--main menu-horizontal"; ) return $args; ) // เปลี่ยนแอตทริบิวต์ id ของ li แท็ก add_filter( "nav_menu_item_id", "filter_menu_item_css_id", 10, 4); function filter_menu_item_css_id($menu_id, $item, $args, $ความลึก) ( return $args->theme_location === "header-menu" ? "" : $menu_id; ) // เปลี่ยนแอตทริบิวต์คลาสของแท็ก li add_filter("nav_menu_css_class", "filter_nav_menu_css_classes", 10, 4); ฟังก์ชัน filter_nav_menu_css_classes($classes, $item, $args, $ความลึก) ( if ($args->theme_location === "header-menu") ( $classes = [ "menu-node", "menu-node--main_lvl_" . ($ความลึก + 1) ]; if ($item->current) ( $classes = "menu-node--active"; ) ) คืนค่า $ คลาส; ) // เปลี่ยนคลาสของ ul ที่ซ้อนกัน add_filter("nav_menu_submenu_css_class", "filter_nav_menu_submenu_css_class", 10, 3); ฟังก์ชัน filter_nav_menu_submenu_css_class($classes, $args, $ความลึก) ( if ($args->theme_location === "header-menu") ( $classes = [ "menu", "menu--dropdown", "menu--vertical" ]; ) return $classes; ) // เพิ่มคลาสให้กับลิงค์ add_filter("nav_menu_link_attributes", "filter_ nav_ menu_link_attributes", 10, 4); function filter_nav_menu_link_attributes($atts, $item, $args, $ความลึก) ( if ($args->theme_location === "header-menu") ( $atts["class"] = "menu-link"; if ($item->current) ( $atts["class"] .= " menu-link--active"; ) ) return $atts; )

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

      รหัส เมนูการนำทาง wp : wp-includes/nav-menu-template.php WP 5.2.2

      "", "คอนเทนเนอร์" => "div", "container_class" => "", "container_id" => "", "menu_class" => "เมนู", "menu_id" => "", "echo" => จริง, "fallback_cb" => "wp_page_menu", "before" => "", "หลัง" => "", "link_before" => "", "link_after" => "", "รายการ _ ห่อ" => "", "item_spacing" => "รักษา", "ความลึก" => 0, "คนเดิน" => "", "theme_location" => "",); $args = wp_parse_args($args, $ค่าเริ่มต้น); if (! in_array($args["item_spacing"], array("preserve", "discard"), true)) ( // invalid value, fall back to default. $args["item_spacing"] = $defaults["item_spacing"]; ) /** * กรองอาร์กิวเมนต์ที่ใช้แสดงเมนูการนำทาง * * @since 3.0.0 * * @see wp_nav_menu() * * @param array $args อาร์เรย์ของ wp_nav_menu() อาร์กิวเมนต์ */ $args = apply_filters("wp_nav_menu_args", $args); $args = (วัตถุ) $args; /** * กรองว่าจะลัดวงจรเอาต์พุต wp_nav_menu() หรือไม่ * * การส่งคืนค่าที่ไม่ใช่ค่าว่างไปยังตัวกรองจะทำให้วงจร * wp_nav_menu() สั้นลง โดยสะท้อนค่านั้นหาก $args->echo เป็นจริง หากไม่เป็นเช่นนั้น * จะส่งคืนค่านั้น * * @ตั้งแต่ 3.9.0 * * @see wp_nav_menu() * * @param string|null $output เมนู Nav ส่งออกไปที่ลัดวงจรด้วย ค่าว่างเริ่มต้น * @param stdClass $args วัตถุที่มีอาร์กิวเมนต์ wp_nav_menu() */ $nav_menu = apply_filters("pre_wp_nav_menu", null, $args); if (null !== $nav_menu) ( if ($args->echo) ( echo $nav_menu; return; ) return $nav_menu; ) // รับเมนู nav ตามเมนูที่ขอ $menu = wp_get_nav_menu_object($args->menu); // รับเมนู nav ตาม theme_location if (! $menu && $args->theme_location && ($locations = get_nav_menu_locations()) && isset($locations[ $args->theme_location ])) ( $menu = wp_get_nav_menu_object($locations[ $args->theme_location ]); ) // รับเมนูก่อนที่มีรายการถ้าเรายัง ไม่พบเมนู if (! $menu && ! $args->theme_location) ( $menus = wp_get_nav_menus(); foreach ($menus as $menu_maybe) ( if ($menu_items = wp_get_nav_menu_items($menu_maybe->term_id, array("update_post_term_cache" => false))) ( $menu = $menu_may be; break; ) ) ) if (empty($args->menu)) ( $args->menu = $menu; ) // ถ้ามีเมนูอยู่ รับ items.if ($menu && ! is_wp_error($menu) && ! isset($menu_items)) ( $menu_items = wp_get_nav_menu_items($menu->term_id, array("update_ post_term_cache" => false)); ) /* * หากไม่พบเมนู: * - ถอยกลับ (หากมีการระบุ) หรือประกันตัว * * หากไม่พบรายการเมนู: * - ถอยกลับ แต่ถ้าไม่ได้ระบุตำแหน่งของธีมเท่านั้น * - มิฉะนั้นให้ประกันตัว */ if ((! $menu || is_wp_error($menu) || (isset($menu_items) && blank($menu_items) && ! $args->theme_location)) && isset($args->fallback_cb) && $args->fallback_cb && is_callable($args->fallback_cb)) ( return call_user_func($ args->fall back_cb, (อาร์เรย์) $args); ) if (! $menu || is_wp_error($menu)) ( return false; ) $nav_menu = $items = ""; $show_container = เท็จ; if ($args->container) ( /** * กรองรายการแท็ก HTML ที่ถูกต้องสำหรับใช้เป็นคอนเทนเนอร์เมนู * * @since 3.0.0 * * @param array $tags แท็ก HTML ที่ยอมรับได้สำหรับใช้เป็นคอนเทนเนอร์เมนู * ค่าดีฟอลต์คืออาร์เรย์ที่มี "div" และ "nav" */ $allowed_tags = apply_filters("wp_nav_menu_container_allowedtags", array("div", "nav")); if (is_string($args->container) && in_array($args->container, $allowed_tags)) ( $show_container = true; $class = $args->container_class ? " class="" . esc_attr($args->container_class) . """ : " class="menu-" . $menu->slug "-คอนเทนเนอร์""; $id = $args->container_id ? " id="" . esc_attr($args->container_id) . """ : ""; $nav_menu .="<" . $args->คอนเทนเนอร์. รหัส $ $คลาส ">"; ) ) // ตั้งค่าตัวแปร $menu_item _wp_menu_item_classes_by_context($menu_items); $sorted_menu_items = $menu_items_with_children = อาร์เรย์(); foreach ((array) $menu_items as $menu_item) ( $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; if ($menu_item->menu_item_parent) ( $menu_items_with_children[ $menu_item->menu_item_parent ] = true; ) ) // เพิ่มเมนูรายการที่มีเด็ก คลาสที่เกี่ยวข้อง if ($menu_items_with_children) ( foreach ($sorted_menu_items as &$menu_item) ( if (isset($menu_items_with_children[ $menu_item->ID ])) ( $menu_item->classes = "menu-item-has-children"; ) ) unset($menu_items, $menu_item); /** * กรองรายการที่จัดเรียงของวัตถุรายการเมนูก่อนสร้าง HTML ของเมนู * * @since 3.1.0 * * @param array $sorted_menu_items รายการเมนู จัดเรียงตามลำดับเมนูของรายการเมนูแต่ละรายการ * @param stdClass $args วัตถุที่มีอาร์กิวเมนต์ wp_nav_menu() */ $sorted_menu_items = apply_filters("wp_nav_menu_objects", $sorted_menu_items, $args); $items .= walk_nav_menu_tree($sorted_menu_items, $args->ความลึก, $args); unset($sorted_menu_items); // คุณสมบัติ if (!empty($args->menu_id)) ( $wrap_id = $args->menu_id; ) else ( $wrap_id = "menu-" . $menu->slug; while (in_array($wrap_id, $menu_id_slugs)) ( if (preg_match("#-(\d+)$#", $wrap_id, $matches)) ( $ wrap_id = preg _replace("#-(\d+)$#", "-" . ++$ตรงกัน, $wrap_id); ) อื่น ( $wrap_id = $wrap_id . "-1"; ) ) ) $menu_id_slugs = $wrap_id; $wrap_class = $args->menu_class ? $args->เมนู_คลาส: ""; /** * กรองเนื้อหารายการ HTML สำหรับเมนูการนำทาง * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items เนื้อหารายการ HTML สำหรับรายการเมนู * @param stdClass $args วัตถุที่มีอาร์กิวเมนต์ wp_nav_menu() */ $items = apply_filters("wp_nav_menu_items", $items, $args); /** * กรองเนื้อหารายการ HTML สำหรับเมนูการนำทางเฉพาะ * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items เนื้อหารายการ HTML สำหรับรายการเมนู * @param stdClass $args วัตถุที่มีอาร์กิวเมนต์ wp_nav_menu() */ $items = apply_filters("wp_nav_menu_($menu->slug)_items", $items, $args); // อย่าพิมพ์มาร์กอัปใดๆ หากไม่มีรายการ ณ จุดนี้ if (empty($items)) ( return false; ) $nav_menu .= sprintf($args->items_wrap, esc_attr($wrap_id), esc_attr($wrap_class), $items); unset($items); if ($show_container) ( $nav_menu .= "คอนเทนเนอร์. ">"; ) /** * กรองเนื้อหา HTML สำหรับเมนูนำทาง * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $nav_menu เนื้อหา HTML สำหรับเมนูนำทาง * @param stdClass $args วัตถุที่มีอาร์กิวเมนต์ wp_nav_menu() */ $nav_menu = apply_filters("wp_nav_menu", $nav_menu, $args); ถ้า ($args->echo) ( echo $nav_menu; ) อื่น ( กลับ $nav_menu; ) )

    ในบทความนี้ฉันจะแสดงวิธีการสร้าง เมนูหลายระดับใน PHP และ MySQL. แน่นอน คุณมีตัวเลือกมากมายในการสร้างมันขึ้นมา แต่การตัดสินจากจำนวนคำถามของคุณในหัวข้อนี้ คุณต้องมีตัวอย่าง และฉันจะนำเสนอในบทความนี้ ฉันทราบทันทีว่าบทความนี้เหมาะสมสำหรับผู้ที่รู้เท่านั้น พี.เอช.พีและสามารถทำงานร่วมกับ มายเอสคิวแอล. ทุกคนต้องผ่านสิ่งนี้ก่อนหรืออ่านหนังสือบางเล่ม PHP และ MySQL.

    ก่อนอื่นมาสร้างตารางในฐานข้อมูลด้วยฟิลด์ต่อไปนี้:

    • รหัส- ตัวระบุที่ไม่ซ้ำกัน
    • ชื่อ- ลิงก์สมอในเมนู
    • ลิงค์- ที่อยู่ที่รายการเมนูจะนำไปสู่
    • parent_id- รหัสผู้ปกครอง หากไม่มีรายการพาเรนต์ รายการนั้นจะเป็น NULL (หรือคุณสามารถใส่ 0 อีกตัวก็ได้)

    เราหาตารางได้แล้ว ถึงเวลาแล้ว รหัส php.ini. เต็ม รหัส PHPให้ไว้ด้านล่าง:

    $mysqli = new mysqli("localhost", "root", "", "db"); // เชื่อมต่อกับฐานข้อมูล
    $result_set = $mysqli->query("เลือก * จาก `เมนู`"); // เลือกระเบียนทั้งหมดจากตารางด้วยเมนู
    $รายการ = อาร์เรย์ (); // อาร์เรย์สำหรับรายการเมนู
    ในขณะที่ (($row = $result_set->fetch_assoc()) != false) $items[$row["id"]] = $row; // เติมอาร์เรย์ด้วยการเลือกจากฐานข้อมูล
    $children = อาร์เรย์(); // อาร์เรย์สำหรับจับคู่องค์ประกอบลูกกับพาเรนต์
    foreach ($item เป็น $item) (
    ถ้า ($item["parent_id"]) $childrens[$item["id"]] = $item["parent_id"]; // กรอกอาร์เรย์
    }
    ฟังก์ชัน printItem($item, $items, $children) (
    /* แสดงรายการเมนู */
    เสียงสะท้อน "

  • ";
    echo "".$item["title"]."";
    $ul = เท็จ; // มีการแสดงองค์ประกอบย่อยหรือไม่
    ในขณะที่ (จริง)(
    /* ลูปไม่สิ้นสุดที่เราค้นหาองค์ประกอบย่อยทั้งหมด */
    $key = array_search($item["id"], $children); // มองหาองค์ประกอบลูก
    ถ้า (!$key) (
    /* ไม่พบองค์ประกอบย่อย */
    ถ้า ($ul) echo ""; // หากมีการแสดงองค์ประกอบย่อย ให้ปิดรายการ
    หยุดพัก; // ออกจากลูป
    }
    unset($children[$key]); // ลบองค์ประกอบที่พบ (เพื่อไม่ให้แสดงอีก)
    ถ้า (!$ul) (
    เสียงสะท้อน "
      "; // เริ่มรายการภายในหากยังไม่มีลูก
      $ul = จริง; //ตั้งธง
      }
      echo printItem($items[$key], $items, $children); // แสดงผลองค์ประกอบลูกทั้งหมดแบบวนซ้ำ
      }
      เสียงสะท้อน "";
      }
      ?>

      รหัสนี้ทำงานได้อย่างสมบูรณ์ อย่างไรก็ตาม คุณควรเข้าใจว่าไม่มีใครเขียนแบบนี้ (โดยเฉพาะ เอาต์พุตผ่าน เสียงสะท้อน แท็ก HTML). และงานของคุณคือใช้อัลกอริทึมจากรหัสนี้ แต่ไม่ใช่ตัวรหัสเอง จากนั้นเชื่อมต่ออัลกอริทึมนี้กับเครื่องยนต์ของคุณ ฉันพยายามแสดงความคิดเห็นรหัสผลลัพธ์อย่างระมัดระวัง เมนูหลายระดับใน PHP และ MySQLแต่แน่นอนว่ามันไม่โปร่งใสที่สุดและต้องการความรู้เบื้องต้นที่ค่อนข้างดี หากคุณยังไม่ทราบ PHP และ MySQLก่อนอื่นฉันขอแนะนำให้ทำสิ่งนี้

      เรียกใช้ไฟล์ที่ดาวน์โหลดโดยดับเบิลคลิก (คุณต้องมีเครื่องเสมือน)

      3. ไม่เปิดเผยชื่อเมื่อตรวจสอบไซต์สำหรับการฉีด SQL

      การตั้งค่า Tor และ Privoxy ใน Kali Linux

      [ส่วนที่อยู่ระหว่างการพัฒนา]

      การตั้งค่า Tor และ Privoxy บน Windows

      [ส่วนที่อยู่ระหว่างการพัฒนา]

      การตั้งค่าพร็อกซีการฉีด jSQL

      [ส่วนที่อยู่ระหว่างการพัฒนา]

      4. ตรวจสอบไซต์สำหรับการฉีด SQL ด้วย jSQL Injection

      การทำงานกับโปรแกรมนั้นง่ายมาก เพียงป้อนที่อยู่ไซต์แล้วกด ENTER

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

      นอกจากนี้ เราได้แสดงฐานข้อมูลที่มีอยู่แล้ว

      คุณสามารถดูเนื้อหาของแต่ละตาราง:

      โดยปกติแล้ว ส่วนที่น่าสนใจที่สุดของตารางคือข้อมูลประจำตัวของผู้ดูแลระบบ

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

      5. ค้นหาผู้ดูแลระบบด้วย jSQL Injection

      โดยไปที่แท็บถัดไป เราพบกับรายการที่อยู่ที่เป็นไปได้ที่นี่ คุณสามารถเลือกหนึ่งหน้าขึ้นไปเพื่อตรวจสอบ:

      ความสะดวกคือไม่ต้องใช้โปรแกรมอื่น

      น่าเสียดายที่มีโปรแกรมเมอร์ที่ไม่ใส่ใจมากนักที่เก็บรหัสผ่านเป็นข้อความธรรมดา บ่อยครั้งในสตริงรหัสผ่านที่เราเห็นบางอย่างเช่น

      8743b52063cd84097a65d1633f5c74f5

      นี่คือแฮช คุณสามารถถอดรหัสได้ด้วยกำลังเดรัจฉาน และ… jSQL Injection มีเดรัจฉานบังคับในตัว

      6. แฮชบังคับเดรัจฉานด้วย jSQL Injection

      ความสะดวกสบายที่ไม่ต้องสงสัยคือคุณไม่จำเป็นต้องค้นหาโปรแกรมอื่น มีการรองรับแฮชยอดนิยมมากมาย

      นี่ไม่ใช่ตัวเลือกที่ดีที่สุด เพื่อที่จะเป็นกูรูในการถอดรหัสแฮช ขอแนะนำให้ใช้หนังสือ "" ในภาษารัสเซีย

      แต่แน่นอนว่าเมื่อไม่มีโปรแกรมอื่นอยู่ในมือหรือไม่มีเวลาศึกษา jSQL Injection ที่มีฟังก์ชัน brute-force ในตัวจะมีประโยชน์

      มีการตั้งค่า: คุณสามารถตั้งค่าอักขระที่จะรวมอยู่ในรหัสผ่าน ช่วงความยาวของรหัสผ่าน

      7. การทำงานของไฟล์หลังจากการตรวจจับการฉีด SQL

      นอกเหนือจากการดำเนินการกับฐานข้อมูล - การอ่านและแก้ไข หากตรวจพบการฉีด SQL การดำเนินการไฟล์ต่อไปนี้สามารถทำได้:

      • อ่านไฟล์บนเซิร์ฟเวอร์
      • อัปโหลดไฟล์ใหม่ไปยังเซิร์ฟเวอร์
      • อัปโหลดเชลล์ไปยังเซิร์ฟเวอร์

      และทั้งหมดนี้นำไปใช้ใน jSQL Injection!

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

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

      หมายเหตุที่สำคัญมากอีกประการหนึ่ง - เราจำเป็นต้องทราบเส้นทางที่แน่นอนไปยังไฟล์ที่เราจะใช้งาน - มิฉะนั้นจะไม่มีอะไรทำงาน

      ดูภาพหน้าจอต่อไปนี้:

      ความพยายามใด ๆ ที่จะดำเนินการกับไฟล์จะได้รับคำตอบโดย: ไม่มีสิทธิ์ FILE(ไม่มีสิทธิ์ไฟล์). และไม่สามารถทำได้ที่นี่

      หากคุณมีข้อผิดพลาดอื่นแทน:

      ปัญหาในการเขียนลงใน [ชื่อไดเรกทอรี]

      ซึ่งหมายความว่าคุณระบุเส้นทางที่แน่นอนที่คุณต้องการเขียนไฟล์ไม่ถูกต้อง

      เพื่อที่จะถือว่าเส้นทางที่แน่นอน อย่างน้อยหนึ่งคนต้องรู้ว่าระบบปฏิบัติการที่เซิร์ฟเวอร์กำลังทำงานอยู่ เมื่อต้องการทำเช่นนี้ ให้เปลี่ยนไปที่แท็บเครือข่าย

      รายการดังกล่าว (string Win64) ให้เหตุผลแก่เราว่าเรากำลังติดต่อกับระบบปฏิบัติการ Windows:

      Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Connection: Keep-Alive Method: HTTP/1.1 200 OK Content-Length: 353 Date: Fri, 11 Dec 2015 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; ชุดอักขระ = UTF-8

      ที่นี่เรามี Unix (*BSD, Linux):

      Transfer-Encoding: chunked Date: Fri, 11 Dec 2015 11:57:02 GMT Method: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Connection: keep-alive Content-Type: text/html X-Powered-By: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

      และที่นี่เรามี CentOS:

      วิธีการ: HTTP/1.1 200 OK หมดอายุ: พฤ. 19 พ.ย. 2524 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; เส้นทาง=/ การเชื่อมต่อ: Keep-alive X-Cache-Lookup: MISS from t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS from t1.hoster.ru Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-c ache วันที่: วันศุกร์ที่ 11 ธันวาคม 2015 เวลา 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; ชุดอักขระ = WINDOWS-1251

      บน Windows โฟลเดอร์ไซต์ทั่วไปคือ C:\เซิร์ฟเวอร์\ข้อมูล\htdocs\. แต่ในความเป็นจริง ถ้ามีคน "คิด" ที่จะสร้างเซิร์ฟเวอร์บน Windows เป็นไปได้มากว่าบุคคลนี้ไม่เคยได้ยินเกี่ยวกับสิทธิพิเศษ ดังนั้นคุณควรเริ่มลองโดยตรงจากไดเร็กทอรี C: / Windows /:

      อย่างที่คุณเห็น ทุกอย่างเป็นไปอย่างสมบูรณ์แบบในครั้งแรก

      แต่เชลล์การฉีด jSQL ทำให้ฉันสงสัย หากคุณมีสิทธิ์ในไฟล์ คุณอาจอัปโหลดบางสิ่งด้วยเว็บอินเตอร์เฟส

      8. ไซต์ตรวจสอบจำนวนมากสำหรับการฉีด SQL

      และแม้แต่ jSQL Injection ก็มีคุณสมบัตินี้ ทุกอย่างง่ายมาก - อัปโหลดรายการไซต์ (สามารถนำเข้าจากไฟล์) เลือกไซต์ที่คุณต้องการตรวจสอบและคลิกปุ่มที่เหมาะสมเพื่อเริ่มการดำเนินการ

      เอาต์พุตโดย jSQL Injection

      jSQL Injection เป็นเครื่องมือที่ดีและมีประสิทธิภาพสำหรับการค้นหาและใช้การฉีด SQL ที่พบในไซต์ ข้อดีที่ไม่อาจปฏิเสธได้: ใช้งานง่าย ฟังก์ชันที่เกี่ยวข้องในตัว jSQL Injection สามารถเป็นเพื่อนที่ดีที่สุดสำหรับผู้เริ่มต้นเมื่อวิเคราะห์เว็บไซต์

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

      จัดตั้งตัวอย่างและ ใบรับรอง. ส่วนลดพิเศษสำหรับทุกคณะและหลักสูตร!