Hola,
Node.js por sí solo no proporciona ninguna protección contra estos ataques.
XSS –
——-
Un servidor de eco http.no desnudo node.js que utiliza el módulo predeterminado ‘http’ es completamente vulnerable a XSS.
Por ejemplo, enviando la solicitud:
http: // localhost: 8000 / xx? a = alert (‘XSS’) </ script > al servidor:
- ¿Puedo crear aplicaciones web con Bootstrap y Ruby on Rails? Si es así, ¿por qué las personas usan frameworks Javascript?
- Para las nuevas empresas de Internet, ¿ya no es una opción hacer una aplicación web?
- ¿Cómo debe diseñar su aplicación web React?
- Entonces, estoy usando AJAX para hacer algo dentro de mi función, pero ¿cómo podría evitar que otros vean cuáles son las variables y dónde están publicando?
- ¿Cómo diseñan las grandes empresas backend para aplicaciones web?
var http = require (‘http’);
http.createServer (función (req, res) {
res.end (req.url);
}). escuchar (8000);
aparecerá la alerta XSS.
Sin embargo, la mayoría de los servidores web utilizan algún tipo de motor de plantillas para generar la pantalla, como JADE.
Cada motor de plantilla emplea diferentes protecciones contra XSS.
Tomemos a JADE como ejemplo.
Por defecto, JADE usa el siguiente código para convertir caracteres potencialmente maliciosos a su equivalente HTML:
exportaciones.escape = función de escape (html) {
resultado var = cadena (html)
.replace (/ & / g, ‘& amp;’)
.replace (/ </ g, '& lt;')
.replace (/> / g, ‘& gt;’)
.replace (/ “/ g, ‘& quot;’);
if (result === ” + html) return html;
de lo contrario devolver resultado;
};
Un punto interesante a notar es que un solo apóstrofe no está codificado en & apos; Probablemente esté bien, ya que los apóstrofes se convierten en comillas dobles durante un paso anterior
Siempre que use Jade de acuerdo con las reglas, probablemente esté bien con XSS, pero aún necesita saber en qué casos JADE no escapa automáticamente de los personajes por usted.
Un par de ejemplos en los que puedo pensar son el operador de atributo! = Como en:
div (escapado = “")
div (sin escapes! = "")
y el operador & atributos (puede encontrar más información sobre estos aquí: Jade - Motor de plantillas)
Obviamente, si escribe su código de manera irresponsable (como: script # {title}) , su código será vulnerable.
Otros motores de plantillas probablemente funcionan de manera similar, pero debe asegurarse de conocer los diversos escenarios protegidos por el motor seleccionado.
Inyección SQL
Este es complicado por dos razones principales:
1. Para el paquete “SQL”: algunos paquetes NPM que tienen una sintaxis similar a las declaraciones preparadas en realidad están construyendo una declaración SQL completa detrás de escena mientras escapan a los caracteres sospechosos. Esto es malo tanto en términos de rendimiento, ya que la base de datos tiene que compilar un nuevo plan de ejecución para cada solicitud, y en términos de seguridad, ya que las listas negras, en muchos casos, pueden ser eludidas.
Debe verificar de cerca su paquete de elección y ver cómo maneja las declaraciones preparadas detrás de escena.
2. Para los paquetes “NoSQL”: los datos enviados a la base de datos pueden ser un JSON en lugar de una cadena, por lo que aunque el siguiente código parece perfectamente correcto:
app.post ('/', function (req, res) {
db.users.find ({nombre de usuario: req.body.username,
contraseña: req.body.password},
function (err, users) {// TODO: maneja el resto}); });
En realidad, se puede omitir fácilmente enviando un JSON, en lugar de enviar cadenas como nombre de usuario y contraseña, lo que comprobaría si hay una entidad cuyo nombre de usuario es mayor que VACÍO y su contraseña es mayor que VACÍO.
Esta declaración siempre es cierta y permitirá el inicio de sesión, sin conocer credenciales válidas.
{"nombre de usuario": {"$ gt": ""}, "contraseña": {"$ gt": ""}}
Puede encontrar más sobre eso aquí: escáner de aplicaciones web, seguridad y más
Espero que esto ayude,
Maty Siman
https://www.checkmarx.com/resources/