javascript - 如何使用 JavaScript 防止 textarea 元素上的跨站请求伪造 (CSRF)?
问题描述
我在这里和其他地方找到了很多关于防止 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))
})
如您所见,我尝试过使用forinnerText
以及innerHTML
fortextarea
但都没有奏效。我也尝试过同样的事情,innerContent
但这只是导致错误日志。
注意:这是一个CodePen,前三行被删除。
解决方案
这不是您要防止的跨站请求伪造 ( CSRF ),而是跨站脚本 ( XSS )。
CSRF:将表单的 HTML 代码保存在另一台服务器上,然后POST
从其他地方发送请求。CSRF Tokens 是通常的解决方案。它们是在服务器端创建和验证的。
XSS:不阻止或过滤 HTML 标签会导致攻击者添加带有恶意代码的脚本标签。JavaScript 可以帮助清理无辜用户,但应对措施也必须在服务器端完成。
您希望过滤掉 HTML 标记。您正在使用 JavaScript。
可以使用浏览器的开发工具在浏览器中轻松编辑 JavaScript。攻击者只需添加一个断点,return;
在调用之前添加为您的清理函数的第一行,并完全否定您的努力。您可以在 JavaScript 中添加一些卫生措施,以抵消浏览器的一些计算能力,但似乎这是您唯一的策略。
无论如何,您都必须在服务器端过滤 HTML 标记。
现在我们已经解决了这个问题......
您也可以更改 textarea 的值.value
:如何使用 JavaScript 更改 textarea 的内容。
推荐阅读
- javascript - 如何让 CSS 的背景色覆盖整个浏览器窗口?
- arrays - 如何在 FluentD 中拆分 AWS CloudTrail JSON
- php - PHP 部署到 Linux 和 Windows
- php - 事件日历 - 更改列表视图的标题
- .net - 为什么我的 JWT 令牌/断言从 Einstein OAuth 服务收到“无效令牌”响应?
- encoding - 无法从两个不同的来源获得相同的 base 64 模数
- c++ - 单击 QTableWidget 中的 QComboBox
- c# - TransformBlock 中 InputQueue 的每个元素
每当读取记录时被覆盖 - angularfire - 使用角火的谷歌身份验证
- python - 从 URL 获取到所有 Flask 路由的变量