การเขียนสคริปต์ข้ามแอป
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
หมวดหมู่ OWASP: MASVS-CODE: คุณภาพโค้ด
ภาพรวม
WebView เป็นคอมโพเนนต์เบราว์เซอร์ที่ฝังอยู่ในแอปพลิเคชัน Android ที่
อำนวยความสะดวกในการแสดงเนื้อหาเว็บภายในแอป แสดงผล HTML, CSS และ
JavaScript ภายในอินเทอร์เฟซผู้ใช้ของแอป
Cross-App Scripting โดยทั่วไปเกี่ยวข้องกับการเรียกใช้โค้ดที่เป็นอันตรายในบริบทของแอปพลิเคชันที่เป็นเหยื่อ เพื่อให้เป็นไปตามจุดประสงค์ของเอกสารนี้
เนื้อหาจะถูกจํากัดเฉพาะ
การแทรกที่เป็นอันตราย
โค้ด JavaScript ลงใน WebView ที่มีช่องโหว่
เมื่อแอปยอมรับ JavaScript ที่เป็นอันตรายใน WebView โดยไม่มีการตรวจสอบหรือการทำให้ปลอดภัยที่เพียงพอ แอปพลิเคชันจะมีช่องโหว่ในการเขียนสคริปต์ข้ามแอป
ผลกระทบ
ช่องโหว่ในการเขียนสคริปต์ข้ามแอปอาจถูกนำไปใช้ประโยชน์เมื่อถูกควบคุมโดยผู้โจมตี
ระบบจะส่งเนื้อหา JavaScript ไปยัง WebView ของแอปที่มีช่องโหว่โดยไม่
ผ่านการตรวจสอบความถูกต้องหรือสะอาดแล้ว ด้วยเหตุนี้ โค้ด JavaScript ที่ผู้โจมตีระบุจึงจะทำงานในบริบทของ WebView ของแอปพลิเคชันเหยื่อ จากนั้นโค้ด JavaScript ที่เป็นอันตรายจะใช้สิทธิ์เดียวกันกับของแอปที่เป็นเหยื่อได้ ซึ่งอาจนำไปสู่การขโมยข้อมูลผู้ใช้ที่มีความละเอียดอ่อนและการลักลอบใช้บัญชี
การลดปัญหา
ปิดใช้ JavaScript
หากแอปพลิเคชันของคุณไม่ต้องใช้ JavaScript การปิดใช้จะทำให้มั่นใจได้ว่า
จะไม่เป็นภัยคุกคาม:
Kotlin
// Get the WebView Object
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings
// Disable JavaScript
webSettings.javaScriptEnabled = false
Java
// Get the WebView Object
WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
// Disable JavaScript for the WebView
webSettings.setJavaScriptEnabled(false);
หากแอปพลิเคชันของคุณต้องใช้ JavaScript โปรดตรวจสอบว่าคุณเป็นเจ้าของหรือเป็นผู้ควบคุม
JavaScript ที่ส่งไปยัง WebView หลีกเลี่ยงการอนุญาตให้ WebView ดำเนินการโดยไม่มีกฎเกณฑ์
JavaScript ดูคำแนะนำในส่วนถัดไป
ตรวจสอบว่ามีการโหลดเฉพาะเนื้อหาที่คาดไว้ลงใน WebView
เมื่อใช้วิธีการ เช่น shouldOverrideUrlLoading()
, loadUrl()
หรือ
evaluateJavascript()
,
ตรวจสอบว่า URL ที่ส่งไป
เลือกไว้ ดังที่กล่าวไว้ก่อนหน้านี้ JavaScript ที่ส่งไปยัง WebView ควรมาจากโดเมนที่คาดไว้เท่านั้น ดังนั้นจึงต้องตรวจสอบสิ่งที่โหลด
โปรดดูคําแนะนําและตัวอย่างที่เป็นประโยชน์ในเอกสารประกอบการตรวจสอบอินพุตของ OWASP และรายการตรวจสอบความปลอดภัยของ Android สําหรับ WebView
ตั้งค่าการเข้าถึงไฟล์ที่ปลอดภัยสำหรับ WebView
การตรวจสอบว่าไฟล์เข้าถึงไม่ได้จะช่วยป้องกันไม่ให้ JavaScript เรียกใช้ภายใน WebView ได้โดยพลการ คุณควรพิจารณา WebSettings
ต่อไปนี้เมื่อต้องการรักษาความปลอดภัยการเข้าถึงไฟล์
- ปิดใช้การเข้าถึงไฟล์ โดยค่าเริ่มต้น
setAllowFileAccess
จะตั้งค่าเป็น True
ใน API ระดับ 29 และต่ำกว่า ซึ่งจะอนุญาตให้เข้าถึงไฟล์ในเครื่องได้ ใน API ระดับ 30
และสูงกว่า ค่าเริ่มต้นคือ False
เพื่อป้องกันไม่ให้สิทธิ์การเข้าถึงไฟล์
ตั้งค่า setAllowFileAccess
เป็น False
อย่างชัดเจน
ปิดการเข้าถึงเนื้อหา การตั้งค่าเริ่มต้นของ setAllowContentAccess
คือ
True
การเข้าถึง URL ของเนื้อหาช่วยให้ WebView โหลดเนื้อหาจากผู้ให้บริการเนื้อหาที่ติดตั้งในระบบได้ หากแอปไม่จำเป็นต้องเข้าถึงเนื้อหา
ตั้งค่า setAllowContentAccess
เป็น False
เพื่อป้องกันการใช้งานในทางที่ผิดที่อาจเกิดขึ้นในกรณี
การโจมตีด้วยการเขียนสคริปต์ข้ามแอป
kotlin
kotlin
webView.settings.javaScriptEnabled = false
webView.settings.domStorageEnabled = true
webView.settings.allowFileAccess = false
webView.settings.allowContentAccess = false
java
java
webView.getSettings().setJavaScriptEnabled(false);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAllowFileAccess(false);
webView.getSettings().setAllowContentAccess(false);
เปิดใช้ Google Safe Browsing
เปิดใช้ Google Safe Browsing ใน AndroidManifest.xml
เพื่อสแกน URL ที่ส่งไปยัง WebView เพื่อหาโดเมนที่เป็นฟิชชิงหรือเป็นอันตราย
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
แหล่งข้อมูล
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-26 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-07-26 UTC"],[],[],null,["# Cross-app scripting\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-CODE: Code Quality](https://mas.owasp.org/MASVS/10-MASVS-CODE)\n\nOverview\n--------\n\nA WebView is an embedded browser component in Android applications that\nfacilitates the display of web content within an app. It renders HTML, CSS, and\nJavaScript within the app's user interface.\n\nCross-App Scripting is broadly associated with the execution of malicious code\nin the context of a victim application. For the purposes of this documentation,\nthe subject will be constrained specifically to the injection of malicious\nJavaScript code into a vulnerable WebView.\n\nWhen an app accepts malicious JavaScript into a WebView without sufficient\nvalidation or sanitization, the application is vulnerable to cross-app\nScripting.\n\nImpact\n------\n\nCross-app scripting vulnerabilities can be exploited when attacker-controlled\nJavaScript content is passed to the vulnerable app's WebView without being\nvalidated or sanitized. As a result, the JavaScript code provided by the\nattacker is executed in the context of the victim application's WebView. The\nmalicious JavaScript code can then use the same permissions as the victim app's,\nwhich may lead to theft of sensitive user data, and account hijacking.\n\nMitigations\n-----------\n\n### Disable JavaScript\n\nIf your application does not require JavaScript, disabling it will ensure it\ndoes not become a threat: \n\n### Kotlin\n\n // Get the WebView Object\n val webView = findViewById\u003cWebView\u003e(R.id.webView)\n val webSettings = webView.settings\n\n // Disable JavaScript\n webSettings.javaScriptEnabled = false\n\n### Java\n\n // Get the WebView Object\n WebView webView = (WebView) findViewById(R.id.webView);\n WebSettings webSettings = webView.getSettings();\n\n // Disable JavaScript for the WebView\n webSettings.setJavaScriptEnabled(false);\n\nIf your application does require JavaScript, ensure that you own or control any\nJavaScript passed to WebView. Avoid allowing WebView to execute arbitrary\nJavaScript, see the guidance in the next section.\n\n### Ensure only expected content is loaded into WebView\n\nWhen using methods like [`shouldOverrideUrlLoading()`](/reference/android/webkit/WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView,%20android.webkit.WebResourceRequest)), [`loadUrl()`](/reference/android/webkit/WebView#loadUrl(java.lang.String)), or\n[`evaluateJavascript()`](/reference/android/webkit/WebView#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback%3Cjava.lang.String%3E))`,` make sure that any URLs passed to them are\nchecked. As stated earlier, any JavaScript passed to the WebView should only\ncome from expected domains, so it is important to verify what is being loaded.\n\nCheck OWASP's input validation [documentation](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html) and this Android\nsecurity [checklist](https://blog.oversecured.com/Android-security-checklist-webview/) for WebViews for good advice and examples.\n\n### Set secure file access settings for WebView\n\nEnsuring that files are not accessible can prevent arbitrary JavaScript from\nbeing executed within WebViews.The following [`WebSettings`](/reference/android/webkit/WebSettings) should be\nconsidered when securing file access:\n\n- Disable file access. By default, [`setAllowFileAccess`](/reference/android/webkit/WebSettings#setAllowFileAccess(boolean)) is set to `True` in API level 29 and lower which will permit access to local files. In API level 30 and higher the default is `False`. To ensure file access is not permitted, explicitly set `setAllowFileAccess` to `False`\n- Disable content access. The default setting of [`setAllowContentAccess`](/reference/android/webkit/WebSettings#setAllowContentAccess(boolean)) is\n `True`. Content URL access allows WebView to load content from a content\n provider installed in the system. If your app does not require content access,\n set `setAllowContentAccess` to `False` to prevent potential misuse in case of a\n cross-app scripting attack.\n\n- kotlin\n `kotlin\n webView.settings.javaScriptEnabled = false\n webView.settings.domStorageEnabled = true\n webView.settings.allowFileAccess = false\n webView.settings.allowContentAccess = false`\n\n- java\n `java\n webView.getSettings().setJavaScriptEnabled(false);\n webView.getSettings().setDomStorageEnabled(true);\n webView.getSettings().setAllowFileAccess(false);\n webView.getSettings().setAllowContentAccess(false);`\n\n### Enable Safe Browsing\n\nEnable Safe Browsing in [`AndroidManifest.xml`](/guide/topics/manifest/manifest-intro) to scan URLs passed to\nWebView for phishing or malicious domains.: \n\n \u003cmeta-data android:name=\"android.webkit.WebView.EnableSafeBrowsing\"\n android:value=\"true\" /\u003e\n\nResources\n---------\n\n- [Safe Browsing documentation](/privacy-and-security/safetynet/safebrowsing)\n- [WebView developer reference](/reference/android/webkit/WebView)\n- [WebSettings for WebView developer reference](/reference/android/webkit/WebSettings)\n- [setAllowFileAccess developer documentation](/reference/android/webkit/WebSettings#setAllowFileAccess(boolean))\n- [setAllowContentAccess developer reference](/reference/android/webkit/WebSettings#setAllowContentAccess(boolean))"]]