การปฏิเสธ ‐ ของ ‐ ข้อกังวลเกี่ยวกับการบริการ
ข้อกังวลที่พบบ่อยที่สุดกับ regexes คือการปฏิเสธการโจมตีบริการผ่านรูปแบบทางพยาธิวิทยาที่ไปชี้แจง - หรือแม้แต่ทวีคูณสุดยอด! - และดูเหมือนว่าจะใช้เวลาตลอดไปเพื่อแก้ปัญหา สิ่งเหล่านี้อาจปรากฏเฉพาะกับข้อมูลที่ป้อนโดยเฉพาะ แต่อย่างใดอย่างหนึ่งสามารถสร้างข้อมูลที่มันไม่สำคัญ
สิ่งเหล่านี้จะขึ้นอยู่กับว่าคอมไพเลอร์ regex ที่คุณใช้นั้นฉลาดแค่ไหนเพราะสิ่งเหล่านี้สามารถตรวจพบได้ในระหว่างการรวบรวม คอมไพเลอร์ Regex ที่ใช้การเรียกซ้ำมักจะมีตัวนับซ้ำในตัวสำหรับการตรวจสอบความก้าวหน้า
กระดาษที่ยอดเยี่ยมของ Russ Cox ในการจับคู่นิพจน์ปกติทำได้ง่ายและรวดเร็ว (แต่ช้าใน Java, Perl, PHP, Python, Ruby, ... )พูดถึงวิธีที่ NFAs ที่ทันสมัยที่สุดซึ่งทั้งหมดดูเหมือนว่าจะได้มาจากรหัสของ Henry Spencer ประสบกับการเสื่อมประสิทธิภาพอย่างรุนแรง แต่ที่ NFA สไตล์ Thompson ไม่มีปัญหาดังกล่าว
หากคุณยอมรับเฉพาะรูปแบบที่สามารถแก้ไขได้โดย DFAs คุณสามารถรวบรวมได้เช่นนี้และพวกเขาจะทำงานได้เร็วขึ้นอาจเร็วกว่ามาก อย่างไรก็ตามต้องใช้เวลาในการทำเช่นนี้ กระดาษคอคส์กล่าวถึงวิธีการนี้และปัญหาของผู้ดูแล ทุกอย่างลงมาเพื่อการแลกเปลี่ยนเวลาแบบคลาสสิก
ด้วย DFA คุณจะใช้เวลาในการสร้างมันมากขึ้น (และจัดสรรสถานะมากขึ้น) ในขณะที่ NFA นั้นคุณใช้เวลาในการดำเนินการมากขึ้นเนื่องจากอาจมีหลายสถานะในเวลาเดียวกันและการย้อนรอยสามารถกินอาหารกลางวัน - และ CPU ของคุณ
ปฏิเสธ ‐ ของ ‐ บริการโซลูชั่น
อาจเป็นวิธีที่เหมาะสมที่สุดในการกล่าวถึงรูปแบบเหล่านี้ซึ่งอยู่บนจุดจบของการแข่งขันที่สูญเสียความร้อนของเอกภพคือการห่อพวกมันด้วยเครื่องจับเวลาที่ให้เวลาสูงสุดในการดำเนินการ โดยทั่วไปแล้วสิ่งนี้จะมากน้อยกว่าการหมดเวลาเริ่มต้นที่เซิร์ฟเวอร์ HTTP ส่วนใหญ่มีให้
มีหลายวิธีที่จะใช้สิ่งเหล่านี้ตั้งแต่รูปแบบเรียบง่ายalarm(N)
ที่ระดับ C ไปจนถึงtry {}
บล็อกข้อยกเว้นประเภทสัญญาณเตือนภัยที่จับได้ทุกวิธีที่จะวางไข่เธรดใหม่ที่สร้างขึ้นเป็นพิเศษด้วยข้อ จำกัด ด้านเวลาในตัว
รหัสคำบรรยายภาพ
ในภาษา regex ที่ยอมรับไฮไลต์รหัสกลไกบางอย่างสำหรับการอนุญาตหรือไม่อนุญาตเหล่านี้จากสตริงที่คุณกำลังจะรวบรวมควรจะให้ แม้ว่าคำบรรยายภาพรหัสเป็นเพียงรหัสในภาษาที่คุณใช้คุณควร จำกัด พวกเขา; พวกเขาไม่จำเป็นต้องสามารถเรียกรหัสภายนอกแม้ว่าจะทำได้คุณก็มีปัญหาที่ใหญ่กว่ามาก
ตัวอย่างเช่นใน Perl หนึ่งไม่สามารถมีคำบรรยายภาพรหัสใน regexes สร้างขึ้นจากการแก้ไขสตริง (เช่นนี้จะเป็นเพราะพวกเขาจะรวบรวมในช่วงเวลาทำงาน) เว้นแต่ว่า pragma ศัพท์ขอบเขตพิเศษuse re "eval";
ในการใช้งานในขอบเขตปัจจุบัน
ด้วยวิธีนี้ไม่มีใครสามารถแอบเข้าไปในรหัสไฮไลต์เพื่อเรียกใช้โปรแกรมระบบrm -rf *
เช่น เนื่องจากรหัสเสริมความปลอดภัยนั้นไวต่อความปลอดภัย Perl จึงปิดใช้งานพวกเขาตามค่าเริ่มต้นในสตริงที่สอดแทรกทั้งหมดและคุณต้องออกจากทางของคุณเพื่อเปิดใช้งานอีกครั้ง
ผู้ใช้ ‐ กำหนด \ P {roperties}
เช่น - มีประเด็นที่ละเอียดอ่อนการรักษาความปลอดภัยอีกหนึ่งที่เกี่ยวข้องกับคุณสมบัติ Unicode สไตล์ยังคง\pM
, \p{Pd}
, \p{Pattern_Syntax}
หรือ\p{Script=Greek}
- ที่อาจมีอยู่ในคอมไพเลอร์ regex บางอย่างที่สนับสนุนว่าสัญกรณ์
ปัญหาคือในบางสิ่งเหล่านี้ชุดของคุณสมบัติที่เป็นไปได้นั้นสามารถขยายได้โดยผู้ใช้ นั่นหมายความว่าคุณสามารถมีคุณสมบัติแบบกำหนดเองที่มีไฮไลต์รหัสจริงฟังก์ชั่นที่มีชื่อใน namepace โดยเฉพาะอย่างยิ่งบางอย่างเช่นหรือ\p{GoodChars}
\p{Class::Good_Characters}
ภาษาของคุณจัดการกับสิ่งเหล่านั้นได้อย่างไรควรดู
sandboxing
ใน Perl ช่องแซนด์บ็อกซ์ผ่านSafe
โมดูลจะให้การควบคุมการมองเห็นเนมสเปซ ภาษาอื่น ๆ เสนอเทคโนโลยี sandbox ที่คล้ายกัน หากอุปกรณ์ดังกล่าวพร้อมใช้งานคุณอาจต้องการตรวจสอบอุปกรณ์เหล่านี้เนื่องจากอุปกรณ์ดังกล่าวได้รับการออกแบบมาโดยเฉพาะสำหรับการเรียกใช้โค้ดที่ไม่น่าเชื่อถือแบบ จำกัด