En mi juego, cambié la lista de jugadores de lienzo a html, por lo que apareció una vulnerabilidad de que cualquier jugador puede darse un nombre en el que puede insertar código js, por ejemplo, <script>alert(1);</script> que funcionará para todos los jugadores cuando el jugador aparezca en la lista de jugadores. La pregunta es, ¿cómo hacer que html no funcione y todo lo que ingrese el jugador se muestre como texto? La pre en html no me ayudó :(
El código para agregar un jugador a la lista de jugadores:
const drawLeaderboard = function() { if (!settings.showLeaderboard || !leaderboard.items) return wjQuery('#leaderboard').css('display', 'none'); else wjQuery('#leaderboard').css('display', 'block'); let text, vip = false, isMe = false; const texts = { all: '', emoji: '' }; for (let i = 0; i < leaderboard.items.length; i++) { if (leaderboard.type == 'text') text = leaderboard.items[i]; else text = leaderboard.items[i].name, isMe = leaderboard.items[i].me, vip = leaderboard.items[i].vip; texts.all += `<div class="item"${isMe ? 'style="color: #faa;"' : ''}>${text.trim()}</div>`; texts.emoji += `<div class="item">${vip ? '👑' : ''}</div>`; } wjQuery('#leaderboard > .content > .items').html(texts.all); wjQuery('#leaderboard > .content > .emoji').html(texts.emoji); }Ya hay buenas respuestas sobre esto, por ejemplo, este ;
Robé la respuesta para ahorrarte un clic ;-)
Hay respuestas adicionales en este hilo que también pueden resultarle interesantes.
var entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/', '`': '`', '=': '=' }; function escapeHtml (string) { return String(string).replace(/[&<>"'`=\/]/g, function (s) { return entityMap[s]; }); }Simplemente podría reemplazar todas las etiquetas con una cadena vacía. Mira este ejemplo:
const regex = /<\/?[a-zA-Z]+>/g; const input = document.querySelector('input'); const newValue = input.value.replaceAll(regex, ''); console.log(newValue); <input type="text" value="My name is ... <script>alert('Trying to hack...');</script>">Este es un ejemplo de secuencias de comandos entre sitios. podemos evitarlo codificando entidades HTML usando expresiones regulares.
var encodedStr = $('#inputText').replace(/[\u00A0-\u9999<>\&]/g, function(i) { return '&#'+i.charCodeAt(0)+';'; });esta cadena codificada si se muestra en html es la misma que los caracteres pero no se evaluaría como javascript