คุณจะทำอย่างไรเมื่อลูกค้าต้องการแก้ไข Rich Text บนเว็บไซต์ของพวกเขา


18

ดังที่เราทุกคนรู้แล้วว่าการโจมตี XSS นั้นอันตรายและง่ายต่อการดึงออกมา กรอบงานที่หลากหลายทำให้ง่ายต่อการเข้ารหัส HTML เช่นเดียวกับ ASP.NET MVC

<%= Html.Encode("string"); %>

แต่จะเกิดอะไรขึ้นเมื่อลูกค้าของคุณต้องการให้พวกเขาสามารถอัปโหลดเนื้อหาของพวกเขาได้โดยตรงจากเอกสาร Microsoft Word

นี่คือสถานการณ์: ผู้คนสามารถคัดลอกและวางเนื้อหาจาก Microsoft word ลงในโปรแกรมแก้ไขแบบ WYSIWYG (ในกรณีนี้คือtinyMCE ) จากนั้นข้อมูลจะถูกโพสต์ไปยังหน้าเว็บ

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

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

วิธีการทางความคิดเพียงอย่างเดียวที่ฉันรู้ว่าตรงตามข้อกำหนดเหล่านี้คือการอนุญาตแท็ก HTML และอนุญาตให้ผ่านได้ มีวิธีอื่นอีกไหม? หากไม่เป็นวิธีที่ปลอดภัยในการปล่อยให้ผู้ใช้เก็บข้อมูลลงในฐานข้อมูลในรูปแบบใด แต่แสดงเฉพาะการเข้ารหัสที่ถูกต้องและแยกแท็กที่ไม่ถูกต้อง

คำถามที่เกี่ยวข้อง

การป้องกัน Cross Script Scripting (XSS)


มีความสุขที่นี่เป็นคำถามหนึ่งที่คล้ายกัน though- stackoverflow.com/questions/445177/...
RichardOD

ตกลง มันคล้ายกัน แต่เป็นคำถามที่ทำให้เกิดความสับสน (คำถามยากที่จะหา) และมันไม่ได้ถามเฉพาะว่ามีวิธีอื่นหรือไม่ หากมีอีกวิธีหนึ่งในการแสดง HTML โดยไม่ต้องขึ้นบัญชีขาวฉันก็รู้อยู่แล้ว หากมี ASP.NET MVC View Engine ที่ดูแลสิ่งนี้ก็เป็นสิ่งที่ควรรู้เช่นกัน
George Stocker

ในหมายเหตุที่ไม่เกี่ยวข้องกับความปลอดภัยแท็กการกรองอาจมีประโยชน์จากมุมมองส่วนต่อประสานผู้ใช้ มันง่ายมากที่จะพิมพ์ตัวยึดมุมโดยไม่ตั้งใจและลืมที่จะหลบหนี เนื่องจากเรากำลังพูดถึงผู้ใช้ที่กำลังคัดลอกจาก Word เป็นความคิดที่ดีที่จะจับสิ่งที่ดูเหมือนแท็กที่ไม่ดีและเข้ารหัสให้เหมาะสม (เช่น & amp; lt;) เพื่อให้สิ่งต่าง ๆ ใช้งานได้

เกี่ยวกับประเด็นที่ 4: คุณเดิมพันว่ามันยังมีปัญหาอยู่! แฮ็คส่วนใหญ่เป็นงานที่อยู่ภายในทั้งหมด สำหรับบรรณาธิการที่เฉพาะเจาะจงฉันโชคดีที่ใช้FreeTextBoxแต่ฉันไม่สามารถพูดได้ว่ามันตรงกับความต้องการของคุณมากเพียงใดโดยเฉพาะ MVC
Joel Coehoorn

1
@gnat ขอบคุณ; แก้ไข ดูเหมือนว่าคำถามของฉันได้รับความสนใจจากพันธมิตรบางประเภท สาม downvote อย่างรวดเร็วและการป้องกันและแก้ไขคำขอของคุณ
George Stocker

คำตอบ:


8

วิธีที่ง่ายที่สุด (สำหรับคุณเป็นนักพัฒนา) น่าจะเป็นในการดำเนินการหนึ่งในหลาย ๆ รูปแบบของMarkdownเช่นMarkdown.NETหรือดียิ่งขึ้น imho () ซึ่งเป็นWMD บรรณาธิการ

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


ผมเชื่อว่า StackOverflow ใช้โปรแกรมแก้ไขที่กำหนดเองโดยไม่ต้องใช้ไวยากรณ์ WMD
จอน

1
StackOverflow ใช้ WMD แน่นอน blog.stackoverflow.com/2008/05/... stackoverflow.com/questions/98852/...

คุณหมายถึงอะไรโดยไวยากรณ์ WMD? เท่าที่ฉันสามารถบอกได้ไวยากรณ์ WMD ทั้งหมดทำงานได้ และผมก็ยังไม่พบอะไรที่ไม่ทำงาน ...

2
ปัญหาในการใช้ Markdown คือ markdown อนุญาตให้ใช้ HTML ได้เอง ดังนั้นโดยตัวมันเองมันไม่ได้เป็นทางออก
George Stocker

7

การขึ้นบัญชีขาวเป็นวิธีที่ดีที่สุดในการป้องกันการโจมตี XSS เมื่ออนุญาตให้ผู้ใช้ป้อน HTML ไม่ว่าโดยตรงหรือใช้ Rich Text Editor

เกี่ยวกับคำถามอื่น ๆ ของคุณ:

มีโปรแกรมแก้ไขแบบ WYSIWYG ที่รวมความสามารถในรายการที่อนุญาตในทันทีหรือไม่

ฉันไม่คิดว่ามันจะทำงานได้ คุณต้องมีรหัสฝั่งเซิร์ฟเวอร์สำหรับสิ่งนี้และ RTE จะทำงานบนไคลเอนต์

TinyMCE กรองแท็กถ้าคุณต้องการ แต่จะเกิดขึ้นในเบราว์เซอร์คุณจึงไม่สามารถไว้ใจได้ ดูextended_valid_elements TinyMCE (Moxie) นอกจากนี้ยังแสดงให้เห็นการยกเว้นให้ดูที่นี่

ฉันควรกังวลเกี่ยวกับเรื่องนี้หรือไม่เพราะจะเป็น 'การโพสต์ส่วนตัว' เท่านั้น

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

เป็นวิธีที่ดีที่สุดในการให้พวกเขาเก็บไว้ในฐานข้อมูลในรูปแบบใด แต่แสดงเฉพาะการเข้ารหัสและถอดแท็กที่ไม่ดีอย่างถูกต้องหรือไม่

นั่นคือวิธีที่ฉันชอบ ฉันไม่ชอบที่จะเปลี่ยนการป้อนข้อมูลของผู้ใช้ก่อนที่จะแทรกลงในฐานข้อมูลด้วยเหตุผลต่างๆ


-1

ฉันกำลังทำสิ่งเดียวกัน ฉันใช้ TinyMCE และอนุญาตให้วางเอกสาร Word เฉพาะบางคนที่ดูแลเว็บไซต์สามารถทำได้ผ่านพื้นที่ผู้ดูแลระบบ สิ่งนี้ได้รับการรับรองโดย ASP.Net Membership ฉันทำ HTML.Encode ง่าย ๆ เมื่อมันถูกส่งไปยังเว็บไซต์สาธารณะ

คุณสามารถใช้รหัสด้านล่างหากคุณต้องการก่อนที่จะได้รับการใส่ลงในฐานข้อมูล แต่ไม่แน่ใจว่าสิ่งที่กระทบกับมันจะให้คุณ คุณอาจต้องไปกับบัญชีขาวของคุณ

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }

หากพวกเขาเก็บข้อความเช่น <script> alert ("hey") </script> และคุณใช้ Html.Encode (<script> alert ("hey") </script>) มันจะพิมพ์ลงในหน้าที่ไม่เรียกใช้ แจ้งเตือน
จอน

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

1
ฉันเดาว่าเป็นเพราะวิธีการที่ซอฟต์แวร์ของคุณกำลังทำอยู่นั้นเป็นการใช้งานที่ไร้เดียงสามาก มีกลเม็ดทุกประเภทที่จะนำไปสู่การปฏิบัติของคุณ
George Stocker

4
บัญชีขาวเป็นแนวคิดที่ดี แต่วิธีการของคุณไม่แน่นอน Regex ไม่ใช่วิธีที่เชื่อถือได้ในการตรวจจับแท็กในข้อความเนื่องจาก HTML สามารถทำให้สับสนได้ ดีกว่าการใช้ห้องสมุดเช่น HTML Agility Pack
ริน

-1

ทางเลือกหนึ่งอาจเป็นHTML Edit Control สำหรับ. NET (ซึ่งฉันเขียน)

เป็นตัวแก้ไข HTML แบบ WYSIWYM สำหรับ. NET ซึ่งรองรับเฉพาะชุดย่อยขององค์ประกอบ HTMLยกเว้น<script>องค์ประกอบ: ดังนั้นจึงทำหน้าที่เป็นรายการที่อนุญาต

หากเป็นการใช้ภายใน (เช่นไซต์อินทราเน็ต) การควบคุมนั้นสามารถฝังลงในเว็บเพจได้

ฉันไม่ได้รวมการสนับสนุนสำหรับการวางจาก Word แต่ฉันมีส่วนประกอบที่เป็นขั้นตอนในทิศทางนั้น: ตัวแปลง Doc เป็น HTML ; ดังนั้นฉันจึงมีแบบเอกสารสำเร็จรูปที่คุณสามารถใช้ใน ASP.NET เพื่อแปลงเอกสารเป็น HTML แสดง HTML ในโปรแกรมแก้ไข ฯลฯ


-2

IMHO ของฉันยังคงไว้วางใจผู้ใช้ของคุณจนกว่าคุณจะเป็นสาธารณะ

ไม่มีวิธีที่เชื่อถือได้เพื่อตอบสนองความต้องการของคุณ ตัวอย่างเช่นโปรแกรมแก้ไขแบบ WYSIWYG ใด ๆ ไม่สามารถป้องกันรูปแบบการแทรกภาพด้วย URL (แทร็กการใช้งานทางอ้อม, เนื้อหาผิดกฎหมาย) หรือข้อความ (ข้อความผิดกฎหมาย, ข้อความที่สะกดผิด, ข้อความผิดพลาด)

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

หากคุณไม่ไว้วางใจให้ใช้มาร์กอัปแบบพิเศษ (เช่น Markdown)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.