บทนำ
ความปลอดภัยของผู้ใช้และข้อมูลส่วนบุคคลของพวกเขาในขณะที่ใช้เว็บแอปพลิเคชันเป็นสิ่งสำคัญยิ่ง แม้ว่าหลักการชี้นำนี้จะได้รับการยอมรับตั้งแต่ช่วงเริ่มต้นของการพัฒนาเว็บ แต่ผู้ไม่หวังดีมักพบช่องโหว่ในแอปพลิเคชัน และอาจหาประโยชน์จากผู้ใช้ของคุณ
การโจมตีแบบ "มาตรฐาน" จำนวนมากเป็นที่รู้จักและได้รับการบันทึกไว้ และการป้องกันจากการโจมตีเหล่านี้ก็ไม่ยาก เพื่อปลดภาระให้กับนักพัฒนาจากการใช้แนวทางปฏิบัติด้านความปลอดภัย เฟรมเวิร์ก เช่น Spring Boot ได้แยกมาตรการความปลอดภัยต่างๆ ออก และอนุญาตให้คุณใช้ตัวกรองความปลอดภัยในแอปพลิเคชันของคุณเพื่อป้องกันการโจมตีที่รู้จักกันดี
ในคำแนะนำสั้น ๆ นี้ เราจะมาดูกันว่า Cross-Site Scripting (XSS) คืออะไร มีคนทำการโจมตีบนแอปพลิเคชันของคุณเองได้อย่างไร และคุณจะป้องกันมันได้อย่างง่ายดายด้วย Spring Boot อย่างไร
Cross-Site Scripting (XSS) คืออะไร?
Cross-Site Scripting เป็นช่องโหว่ที่เป็นที่รู้จักและแพร่หลาย ซึ่งผู้ไม่หวังดีจะแทรกสคริปต์ลงในเว็บแอปพลิเคชัน
โดยทั่วไป นโยบายต้นทางเดียวกันจะใช้กับเว็บแอปพลิเคชัน ซึ่งจำกัดสคริปต์ในหน้าเว็บให้เข้าถึงข้อมูลจากแหล่งที่มาหากแหล่งที่มาไม่ตรงกัน ภายใต้นโยบายต้นกำเนิดเดียวกัน – หากหน้าจาก เว็บไซต์ที่เชื่อถือได้ อาจเข้าถึงข้อมูลที่เชื่อมต่อกับผู้ใช้ (เช่น คุกกี้ เป็นต้น) หน้าอื่นๆ จากต้นทางเดียวกันก็สามารถทำได้เช่นกัน การควบคุมการเข้าถึงรูปแบบนี้ดูเหมือนจะเพียงพอที่จะปกป้องความสมบูรณ์ของข้อมูลบนเว็บแอปพลิเคชันในขณะนั้น
Cross-Site Scripting หลีกเลี่ยงนโยบายที่มาเดียวกันโดยการฉีดสคริปต์ที่เป็นอันตรายลงในหน้าเว็บไซต์ที่เชื่อถือได้ เนื่องจากสคริปต์ถูกเรียกใช้จากเว็บไซต์ที่เชื่อถือได้ จึงทำงานเป็นสคริปต์ที่เชื่อถือได้ ไม่มีวิธีที่ชัดเจนในการแยกความแตกต่างระหว่างสคริปต์ที่ประสงค์ร้ายและสคริปต์ที่ไม่ประสงค์ร้าย ดังนั้นการเรียกใช้โค้ดโดยอำเภอใจจึงเป็นไปได้ด้วย Cross-Site Scripting มีตั้งแต่การแทรกการแจ้งเตือนที่น่ารำคาญ ไปจนถึงการโจมตีทางวิศวกรรมสังคม การรวบรวมข้อมูลผู้ใช้อย่างเงียบๆ หรือการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าฟิชชิ่งที่ดูเหมือนเป็นส่วนหนึ่งของเว็บไซต์ที่เชื่อถือได้
หลาย เว็บไซต์มีความอ่อนไหวต่อการโจมตีแบบ Cross-Site Scripting และยังคงเป็นการโจมตีทั่วไปในปัจจุบัน ถึงแม้ว่าการใช้ประโยชน์ประเภทนี้จะเป็นที่รู้จักมาตั้งแต่ยุค 90
การป้องกัน XSS ใน Spring Boot Application ด้วย Content-Security Policy (CSP)
Spring Boot ให้ความสำคัญกับความปลอดภัยเป็นอย่างมาก และโมดูลความปลอดภัยของ Spring นำแนวปฏิบัติด้านความปลอดภัยที่ยืดหยุ่นและทรงพลังมาใช้ ซึ่งช่วยให้นักพัฒนาลดความกังวลในเรื่องความปลอดภัย ซึ่งบ่อยครั้งมักต้องการความเข้าใจในระดับต่ำเกี่ยวกับหลักการของวิธีแลกเปลี่ยนข้อความในเว็บ แอปพลิเคชัน.
โดยค่าเริ่มต้น Spring Boot ใช้ส่วนหัวความปลอดภัยหลายส่วน:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-XSS-Protection รวมอยู่ด้วยโดยค่าเริ่มต้น! ส่วนหัวความปลอดภัยนี้พยายามที่จะ ตรวจจับ XSS พยายามและบล็อกพวกเขา นี่ไม่ใช่กระบวนการป้องกันการล้มเหลว และเบราว์เซอร์มีการใช้งานตัวตรวจจับที่แตกต่างกัน เบราว์เซอร์บางตัว เช่น Chrome มีแม้กระทั่ง ลบ XSS Auditor ของพวกเขาออก. นอกจากนี้ การตรวจจับอัตโนมัติยังทำงานสำหรับ สะท้อนการโจมตี XSSในขณะที่การโจมตีประเภทอื่นก็มีอยู่เช่นกัน
ทางเลือกที่ทันสมัยกว่าสำหรับ X-XSS-Protection คือ นโยบายการรักษาความปลอดภัยของเนื้อหา (CSP) ซึ่งส่วนใหญ่เกี่ยวข้องกับนโยบายที่สามารถโหลดทรัพยากร ต้นทาง และปลายทางใด ในปี 2022 CSP เป็นมาตรการป้องกันที่ดีที่สุดสำหรับ XSS, Clickjacking และการโจมตีประเภทอื่นๆ ไม่ใช่ทุกเบราว์เซอร์ที่ใช้ CSP ซึ่งเป็นสาเหตุที่ไม่รวมอยู่ในส่วนหัวความปลอดภัยตามค่าเริ่มต้น
หมายเหตุ แม้จะมี CSP อยู่แล้ว ก็ยังเป็นแนวทางปฏิบัติที่ดีที่สุดในการตรวจสอบเสมอ ใด ป้อนข้อมูลของผู้ใช้และตรวจสอบให้แน่ใจว่าการประมวลผลโดยใช้ระบบของคุณปลอดภัย เพื่อป้องกันการฉีดโค้ด
ใน Spring Boot – ในการกำหนดค่ามาตรการรักษาความปลอดภัยเว็บแบบกำหนดเอง โดยปกติคุณจะขยาย WebSecurityConfigurerAdapter
คลาส และแทนที่ configure()
วิธี:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.contentSecurityPolicy("csp-directives");
}
}
ในกรณีที่คำสั่งนโยบายการรักษาความปลอดภัยของเนื้อหา (ระบุเป็น a ;
-แยกสตริง) ขึ้นอยู่กับกรณีการใช้งานของคุณและแหล่งที่คุณต้องการเชื่อถือ:
Content-Security Policy: directive1; directive2; directive3; ... directiveN;
ตัวอย่างเช่น เว็บแอปพลิเคชันสามารถแสดงรายการเว็บไซต์ที่เชื่อถือได้ซึ่งสคริปต์สามารถโหลดได้:
script-src https://trusted.com;
หรือคุณสามารถข้ามการเชื่อถือเว็บไซต์บุคคลที่สาม:
script-src self;
ในทำนองเดียวกัน แอปพลิเคชันสามารถเชื่อถือปลั๊กอินได้:
object-src https://trusted.com
มีคำสั่งมากมายที่คุณสามารถจัดหาได้ รวมถึง:
default-src
– ทางเลือกเริ่มต้นchild-src
– แหล่งที่มาของ Web Worker ที่ถูกต้องframe-src
– แหล่งที่ถูกต้องสำหรับและ
s
img-src
– แหล่งที่มาที่ถูกต้องสำหรับรูปภาพmedia-src
– แหล่งที่ถูกต้องสำหรับ,
และ
แท็ก
script-src
– แหล่งที่มาของสคริปต์ที่ถูกต้อง (ช่วยป้องกัน XSS)style-src
– แหล่งที่ถูกต้องสำหรับองค์ประกอบ
base-uri
– จำกัดทรัพยากรที่เข้าถึงได้จากธาตุ
frame-ancestors
– ผู้ปกครองที่ถูกต้องของ,
,
, ฯลฯ องค์ประกอบ
- เป็นต้น
ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!
ตัวอย่างเช่น นี่คือชุดคำสั่งนโยบายที่ปลอดภัย:
script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
report-uri https://csp.example.com;
มาเพิ่มสิ่งเหล่านี้ในแอปพลิเคชัน Spring Boot ของเรา:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.contentSecurityPolicy("script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:; object-src 'none'; base-uri 'none'; require-trusted-types-for 'script'; report-uri https://csp.example.com;");
}
}
คุณสามารถใช้ CSP-ผู้ประเมิน เพื่อประเมินว่าคำสั่ง CSP ของคุณถูกต้องหรือไม่ และ ปลอดภัยและจะชี้ให้เห็นว่าคำสั่งใดที่สามารถใช้ประโยชน์ได้ง่าย นี่คือคำสั่ง CSP ที่อนุญาตให้ใช้ Google APIs:
default-src 'self';
object-src 'none';
frame-src 'self' data:;
script-src 'self' 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' https://storage.googleapis.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
font-src 'self' data:;
base-uri 'self'
สรุป
ในคู่มือฉบับย่อนี้ เราได้ศึกษาว่า Cross-Site Scripting (XSS) คืออะไรและทำงานอย่างไรในระดับองค์รวม จากนั้น เราได้สำรวจมาตรการป้องกัน XSS บางอย่างที่สามารถนำไปใช้กับ Spring Boot ได้อย่างง่ายดาย เพื่อทำให้แอปพลิเคชันของคุณปลอดภัย และตั้งค่า นโยบายการรักษาความปลอดภัยของเนื้อหา (คสพ.).
สุดท้าย เราได้สำรวจคำสั่ง CSP และดูนโยบายความปลอดภัยที่แตกต่างกันสองสามข้อ