XSS javascript,漏洞检查
XSS javascript, exploit check
我目前正在处理一个页面,我需要用户输入几个变量,这些变量在提交后会显示在整个页面上。
问题是,它需要是 100% 安全的代码,虽然我可以使用 PDO/mysql 等 javascript 不是我很流利的东西。
目前,我有以下内容:
<script language="JavaScript">
function showInput() {
document.getElementById('var1').innerText =
document.getElementById("user_var1").value;
document.getElementById('var2').innerText =
document.getElementById("user_var2").value;
}
</script>
与 html
<form>
your variable 1 is = <input type="text" name="message" id="user_var1"><br />
your variable 2 is = <input type="text" name="message" id="user_var2"><br />
</form>
<input type="submit" onclick="showInput();">
<p>var1 = <span id='var1'></span></p>
<p>var2 = <span id='var2'></span></p>
据我所知,使用“.innerText”应该会停止使用任何 html 等,我已经用
进行了测试
<script>alert(document.cookie);</script>
这导致上面的内容按原样打印(不是 运行)。
例如
your variable 1 is = <script>alert(document.cookie);</script>
您还有什么建议可以确保它是安全的(XSS 或其他方式)吗?唯一需要输入的字符是 / 和 A-Z 0-9
提前致谢:)
编辑
澄清一下,唯一的代码是上面的代码,该页面没有从数据库等中提取数据(您在上面看到的几乎是完整的 php 页面,只是缺少 html 头 body 标签等)。
根据您在上面所做的,您不会有 XSS。 innerText
将进行适当的转义。
让您的网站 100% 安全是一项艰巨的任务。我要查看的一些内容是 运行 在提交表单时根据需要在 HTTPS with HSTS to prevent a network level adversary tampering with the site, parameterizing your SQL queries, adding CSRF 令牌上设置您的网站。
特别是关于 XSS,人们获得 XSS 的最常见方式之一是因为他们执行不安全的 DOM 操作。如果您担心安全性,我强烈建议您在操作 "virtual DOM" 时将您的 JS 移植到 React,这允许 React 执行上下文敏感的转义。它还减轻了开发人员必须进行适当转义的负担。
一个快速的安全胜利是将 CSP policy 添加到您的站点并将 script-src
指令设置为 self
。 CSP 政策建立了特定内容可以 运行 在您网站上的环境。因此,例如,如果您将 script-src
设置为 self
(意味着您的 JS 加载到 <script>
标记的 src
属性中,指向与 HTML 被提供,而不是在页面上内联)如果有人执行 XSS,它(很可能*)不会 运行.
这些只是您可以使用的不同安全解决方案的一些示例,以及深入安全实践的简要介绍。很高兴您认真对待安全问题!
*在某些情况下(例如,如果您动态生成脚本)他们的代码可能 运行.
这里没有漏洞(请在投票前阅读)。
Just to clarify, the only code is what is above, the page is not
pulling data from a database etc (what you see above is virtually the
full php page, just missing the html head body tags etc).
因此,除当前用户外,其他任何人都不能填充以下两个字段:
<input type="text" name="message" id="user_var1">
<input type="text" name="message" id="user_var2">
因为不存在填充这两个字段的代码。
代码填充的两个DOM元素如下:
<span id='var1'></span>
<span id='var2'></span>
执行此操作的代码是
document.getElementById('var1').innerText =
document.getElementById("user_var1").value;
document.getElementById('var2').innerText =
document.getElementById("user_var2").value;
它使用的是非标准 innerText
rather than textContent
,但是 innerText
将设置文本内容而不是 HTML 内容,从而阻止浏览器呈现任何标签或脚本。
然而,即使它设置了 innerHTML
属性,用户所能做的就是攻击自己(就像他们在浏览器中打开开发者工具一样)。
但是,为了正确的功能行为和互联网标准,我会使用 textContent
而不是 innerText
或 innerHTML
。
注意
<script>alert(document.cookie);</script>
无论如何都行不通,必须
<svg onload="alert(document.cookie)" />
或类似的。 HTML5 指定不应执行通过 innerHTML 插入的 <script>
标记。
我目前正在处理一个页面,我需要用户输入几个变量,这些变量在提交后会显示在整个页面上。
问题是,它需要是 100% 安全的代码,虽然我可以使用 PDO/mysql 等 javascript 不是我很流利的东西。
目前,我有以下内容:
<script language="JavaScript">
function showInput() {
document.getElementById('var1').innerText =
document.getElementById("user_var1").value;
document.getElementById('var2').innerText =
document.getElementById("user_var2").value;
}
</script>
与 html
<form>
your variable 1 is = <input type="text" name="message" id="user_var1"><br />
your variable 2 is = <input type="text" name="message" id="user_var2"><br />
</form>
<input type="submit" onclick="showInput();">
<p>var1 = <span id='var1'></span></p>
<p>var2 = <span id='var2'></span></p>
据我所知,使用“.innerText”应该会停止使用任何 html 等,我已经用
进行了测试<script>alert(document.cookie);</script>
这导致上面的内容按原样打印(不是 运行)。
例如
your variable 1 is = <script>alert(document.cookie);</script>
您还有什么建议可以确保它是安全的(XSS 或其他方式)吗?唯一需要输入的字符是 / 和 A-Z 0-9
提前致谢:)
编辑
澄清一下,唯一的代码是上面的代码,该页面没有从数据库等中提取数据(您在上面看到的几乎是完整的 php 页面,只是缺少 html 头 body 标签等)。
根据您在上面所做的,您不会有 XSS。 innerText
将进行适当的转义。
让您的网站 100% 安全是一项艰巨的任务。我要查看的一些内容是 运行 在提交表单时根据需要在 HTTPS with HSTS to prevent a network level adversary tampering with the site, parameterizing your SQL queries, adding CSRF 令牌上设置您的网站。
特别是关于 XSS,人们获得 XSS 的最常见方式之一是因为他们执行不安全的 DOM 操作。如果您担心安全性,我强烈建议您在操作 "virtual DOM" 时将您的 JS 移植到 React,这允许 React 执行上下文敏感的转义。它还减轻了开发人员必须进行适当转义的负担。
一个快速的安全胜利是将 CSP policy 添加到您的站点并将 script-src
指令设置为 self
。 CSP 政策建立了特定内容可以 运行 在您网站上的环境。因此,例如,如果您将 script-src
设置为 self
(意味着您的 JS 加载到 <script>
标记的 src
属性中,指向与 HTML 被提供,而不是在页面上内联)如果有人执行 XSS,它(很可能*)不会 运行.
这些只是您可以使用的不同安全解决方案的一些示例,以及深入安全实践的简要介绍。很高兴您认真对待安全问题!
*在某些情况下(例如,如果您动态生成脚本)他们的代码可能 运行.
这里没有漏洞(请在投票前阅读)。
Just to clarify, the only code is what is above, the page is not pulling data from a database etc (what you see above is virtually the full php page, just missing the html head body tags etc).
因此,除当前用户外,其他任何人都不能填充以下两个字段:
<input type="text" name="message" id="user_var1">
<input type="text" name="message" id="user_var2">
因为不存在填充这两个字段的代码。
代码填充的两个DOM元素如下:
<span id='var1'></span>
<span id='var2'></span>
执行此操作的代码是
document.getElementById('var1').innerText =
document.getElementById("user_var1").value;
document.getElementById('var2').innerText =
document.getElementById("user_var2").value;
它使用的是非标准 innerText
rather than textContent
,但是 innerText
将设置文本内容而不是 HTML 内容,从而阻止浏览器呈现任何标签或脚本。
然而,即使它设置了 innerHTML
属性,用户所能做的就是攻击自己(就像他们在浏览器中打开开发者工具一样)。
但是,为了正确的功能行为和互联网标准,我会使用 textContent
而不是 innerText
或 innerHTML
。
注意
<script>alert(document.cookie);</script>
无论如何都行不通,必须
<svg onload="alert(document.cookie)" />
或类似的。 HTML5 指定不应执行通过 innerHTML 插入的 <script>
标记。