类型: 安全缺陷

    依靠HTML、XML或其他类型编码验证用户输入可能导致浏览器执行恶意代码。
    在以下情况下会出现Corss-Site Scripting(XSS)漏洞
    1.数据通过一个不可信赖的数据源进入Web应用程序。在组件间通信XSS的情况下,不可信赖的数据是从驻留在其他组件所接收的数据。在Android应用中,指运行在同一设备中的应用程序。对于Reflected XSS,不可信赖的源通常为Web请求,而对于Persisted(或Stored) XSS,该源通常为数据库或者其他后端存储数据。
    2.未检验包含在动态内容中的数据,便将其传送给了Web用户。
    传送到Web浏览器的恶意内容通常采用JavaScript代码片段的形式,但也可能会包含一些HTML、Flash或者其他任意一种可以被浏览器执行的代码,基于XSS的攻击手段多样,但通常它们都会包含传输给攻击者的私人数据(如Cookie或者其他会话信息)。在攻击者的控制下,指引被攻击者进入二义的网络内容,或者利用易受攻击的站点,对用户的机器进行其他恶意操作。
    例1:下面的JSP代码片段可从HTTP请求中读取人员的name,并通过标签将其显示给用户。

    1. <c:out value="${para.name}"/>
    2. <c:out/>

    标签设置escapeXml=”true”时,可以避免一部分跨站脚本攻击。但是如果name里有包含恶意代码,那么Web浏览器就会像显示HTTP响应那样执行该代码,应用程序将受到XSS攻击。

    例2:以下代码在Android WebView中启用了JavaScript(默认情况下,JavaScript为禁用状态),并根据从Android Intent接收到的值加载页面。

    1. WebView webview = (WebView) findViewById(R.id.webview);
    2. webview.getSettings().setJavaScriptEnabled(true);
    3. String url = this.getIntent().getExtras().getString(""url"");
    4. webview.loadUrl(url);

    如果url的值以javascript:开头,则接下来的JavaScript代码将在WebView中的Web页面上下文内部执行。如例1所示,如果应用程序之外的数据源将危险数据存储在一个数据库或其他数据存储器中,随后这些危险数据可能被当作可信赖的数据回写到应用程序中,并存储在动态内容中。