如何使用 JavaScript 防止 textarea 元素上的跨站请求伪造 (CSRF)?
How to prevent Cross Site Request Forgery (CSRF) on textarea element with JavaScript?
我在这里和其他地方找到了很多关于防止 CSRF 的答案。
我设法将它们从 jQuery 转换为 ES6。遗憾的是,它只适用于 input
,但不适用于 textarea
元素。
/* Prevent click-jacking with invisible iframes */
if (top.location !== window.location)
top.location = window.location;
/* Prevent HTML tags in inputs and textareas */
const sanitizationRegex = /<(|\/|[^>\/bi]|\/[^>bi]|[^\/>][^>]+|\/[^>][^>]+)>/g
const inputs = [...document.querySelectorAll('input')]
const textareas = [...document.querySelectorAll('textarea')]
const sanitizeInput = function(element) {
element.value = element.value.replaceAll(sanitizationRegex, '')
}
const sanitizeTextarea = function(element) {
element.innerText = element.innerText.replaceAll(sanitizationRegex, '')
element.innerHTML = element.innerHTML.replaceAll(sanitizationRegex, '')
};
inputs.forEach(element => {
element.addEventListener('keyup', () => sanitizeInput(element))
element.addEventListener('change', () => sanitizeInput(element))
});
textareas.forEach(element => {
element.addEventListener('keyup', () => sanitizeTextarea(element))
element.addEventListener('change', () => sanitizeTextarea(element))
})
如您所见,我尝试使用 innerText
以及 innerHTML
作为 textarea
,但均无效。我也用 innerContent
尝试过同样的事情,但这只会导致错误日志。
注意:这里是 CodePen,删除了前三行。
这不是跨站请求伪造(CSRF) you are trying to prevent, it is Cross Site Scripting (XSS)。
CSRF:将表单的 HTML 代码保存在另一台服务器上,并从其他地方发送 POST
请求。 CSRF 令牌是通常的解决方案。它们是在服务器端创建和验证的。
XSS:不阻止或过滤HTML标签会导致攻击者添加带有恶意代码的脚本标签。 JavaScript 可以帮助净化无辜用户,但也必须在服务器端采取对策。
您希望过滤掉 HTML 个标签。您正在使用 JavaScript.
JavaScript 可以使用浏览器的开发工具在浏览器中轻松编辑。攻击者只需添加一个断点,在您的卫生功能被调用之前添加 return;
作为第一行,就可以完全抵消您的努力。
您可以将 一些 卫生设施放入 JavaScript 只是为了抵消浏览器的一些计算能力,但似乎这是您唯一的策略。
无论如何,您都必须在服务器端过滤 HTML 个标签。
现在我们已经解决了这个问题...
您还可以使用 .value
更改文本区域的值:How to change the Content of a textarea with JavaScript.
我在这里和其他地方找到了很多关于防止 CSRF 的答案。
我设法将它们从 jQuery 转换为 ES6。遗憾的是,它只适用于 input
,但不适用于 textarea
元素。
/* Prevent click-jacking with invisible iframes */
if (top.location !== window.location)
top.location = window.location;
/* Prevent HTML tags in inputs and textareas */
const sanitizationRegex = /<(|\/|[^>\/bi]|\/[^>bi]|[^\/>][^>]+|\/[^>][^>]+)>/g
const inputs = [...document.querySelectorAll('input')]
const textareas = [...document.querySelectorAll('textarea')]
const sanitizeInput = function(element) {
element.value = element.value.replaceAll(sanitizationRegex, '')
}
const sanitizeTextarea = function(element) {
element.innerText = element.innerText.replaceAll(sanitizationRegex, '')
element.innerHTML = element.innerHTML.replaceAll(sanitizationRegex, '')
};
inputs.forEach(element => {
element.addEventListener('keyup', () => sanitizeInput(element))
element.addEventListener('change', () => sanitizeInput(element))
});
textareas.forEach(element => {
element.addEventListener('keyup', () => sanitizeTextarea(element))
element.addEventListener('change', () => sanitizeTextarea(element))
})
如您所见,我尝试使用 innerText
以及 innerHTML
作为 textarea
,但均无效。我也用 innerContent
尝试过同样的事情,但这只会导致错误日志。
注意:这里是 CodePen,删除了前三行。
这不是跨站请求伪造(CSRF) you are trying to prevent, it is Cross Site Scripting (XSS)。
CSRF:将表单的 HTML 代码保存在另一台服务器上,并从其他地方发送 POST
请求。 CSRF 令牌是通常的解决方案。它们是在服务器端创建和验证的。
XSS:不阻止或过滤HTML标签会导致攻击者添加带有恶意代码的脚本标签。 JavaScript 可以帮助净化无辜用户,但也必须在服务器端采取对策。
您希望过滤掉 HTML 个标签。您正在使用 JavaScript.
JavaScript 可以使用浏览器的开发工具在浏览器中轻松编辑。攻击者只需添加一个断点,在您的卫生功能被调用之前添加 return;
作为第一行,就可以完全抵消您的努力。
您可以将 一些 卫生设施放入 JavaScript 只是为了抵消浏览器的一些计算能力,但似乎这是您唯一的策略。
无论如何,您都必须在服务器端过滤 HTML 个标签。
现在我们已经解决了这个问题...
您还可以使用 .value
更改文本区域的值:How to change the Content of a textarea with JavaScript.