tl/dr:您是否有反射型 XSS 漏洞取决于您用于附加数据的确切方法。因此,您应该专门检查您选择的方法以确保它是安全的。现代 javascript 框架通常会自动为您处理这些事情,但 jQuery 不会,因此对细节的关注至关重要。
您不必特别担心站点 1 和站点 2 之间的交互。原因是站点 2 无论如何都需要以所有正常方式安全(使用准备好的查询等)。恶意用户不会使用站点 1 来攻击站点 2(在这种情况下),因为如果他们愿意,他们可以直接攻击站点 2。
所以这里的主要问题是站点 1 是否易受攻击。需要明确的是,担心的是反射 XSS 攻击的可能性(这是 ExecutionByFork 在他们的回答中提到的)。举一个简单的例子,如果用户访问这个 URL 会发生什么:
http://mysite.com?p="><script>alert(1)</script>
如果您将p参数添加到所有其他链接的方式隐含地将其内容视为 HTML,那么您最终将在页面中注入一个实际的标签,在经典的反射 XSS 攻击script中执行攻击者 javascript 。
所以问题是:您p是以一种可能将数据视为 HTML(创建漏洞)的方式附加参数,还是以安全的方式附加它?该问题的答案归结为您用于附加数据的特定方法。让我举两个例子:
非常安全:.prop()
使用 jQuery.prop方法是安全的,因为它依赖于设置相应 DOM 节点的属性。通过这样做,没有机会逃避属性上下文。从本质上讲,您发送到该.prop方法的任何内容都只会被视为字符串,没有执行的机会。所以像这样的代码可以免受反射型 XSS 攻击:
var link = $('a').first();
old_href = link.prop('href');
link.prop('href', old_href + '?p=' + injected_data))
但是,如果用户完全控制了最终结果,这将是不安全的href(例如,如果您没有附加,而是仅根据用户输入设置 href)。在这种情况下,用户可以切换链接以执行 javascript,如下所示:
http://mysite.com?p=javascript:alert(1)
这将导致如下代码的漏洞:
link.prop('href', injected_data))
只要您将数据附加到已经存在的东西上,这是不可能的。但是,如果 href 标记之前是空的,您最终可能会遇到漏洞(尽管它只会在用户单击链接时触发:不仅仅是通过加载页面)。
当然,即使这样也不能保证安全性,因为潜在的恶意数据隐藏在您的应用程序中会导致问题。您可能会忘记hrefnow 包含用户数据,如果其他一些 javascripthref从链接中抓取并尝试对其进行处理,则可能会造成麻烦。另外,请记住,当有人单击链接时,此恶意数据将被传递到站点 2,因此站点 2 需要适当地保护自己(无论如何之前都是如此,所以这并不是您不知道的任何事情)。
不安全:.replaceWith()
但是,许多其他 javascript 方法将允许您的字符串被视为 HTML,这将导致反射 XSS。事实上,可能有比安全方法更危险的方法,因此您可能应该验证您使用的任何方法实际上是安全的。不过,举个例子,.replaceWith()将把你的字符串评估为 HTML。所以这样的事情会很危险:
link = $('a').first();
old_href = link.prop('href');
link.replaceWith('<a href="' + old_href + '?p=' + injected_data + '">click here</a>');