L'aggiunta di dati da un modulo a un URL con encodeURIComponent disinfetta in modo sicuro l'input dell'utente?

2

Nella mia app Web, desidero inviare una richiesta AJAX interdominio a un altro sito. Voglio prendere il testo che l'utente inserisce in un modulo e aggiungere quel testo alla stringa di query nell'URL a cui invio la richiesta, quindi esco dal testo dell'utente usando encodeURIComponent() prima, in questo modo:

function sendAJAXRequext(textThatUserEntered) {
  const hopefullyThisStringIsSafe = encodeURIComponent(textThatUserEntered);
  const xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://www.example.com/api?query=${hopefullyThisStringIsSafe}');
  // snip...
  xhr.send();
}

Sta usando encodeURIComponent() abbastanza bene da garantire che non ci siano modi per iniettare qualcosa di malvagio nell'URL che richiedo, o c'è qualcosa di aggiuntivo che devo fare per disinfettare textThatUserEntered ?

    
posta Kevin 06.01.2017 - 22:50
fonte

2 risposte

3

Sì, encodeURIComponent() è il modo corretto per riempire in sicurezza un parametro di query con dati non fidati.

The encodeURIComponent() function encodes a URI component. This function encodes special characters. In addition, it encodes the following characters: , / ? : @ & = + $ #

(da w3schools)

is there something additional I need to do to sanitize textThatUserEntered?

No, se lo usi solo per codificare un valore del parametro di query come nell'esempio, non devi prendere ulteriori misure. Un utente malintenzionato non ha modo di introdurre un nuovo parametro o modificare l'URL in modo da creare direttamente una vulnerabilità XSS o simile.

Ma ciò non significa in alcun modo che il parametro sia sicuro per l'elaborazione sul sito di destinazione. Significa semplicemente che è sicuro per lo script requesting . Il parametro potrebbe comunque attivare una vulnerabilità di iniezione sul server di destinazione.

Si noti inoltre che alcuni caratteri sono esclusi dall'escaping ( !'()* ). Ecco perché Mozilla propone una funzione wrapper che sfugge anche a questi caratteri anche se non rappresentano alcuna minaccia immediata in quanto non hanno un significato assegnato nella sintassi della query:

function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}
    
risposta data 06.01.2017 - 23:06
fonte
-1

Come raccomandazione aggiuntiva, JavaScript viene interpretato sul lato client, quindi può essere modificato per un utente esperto e bypassare i metodi di codifica, anche se qualcuno sa come inviare una richiesta alla tua applicazione, quindi può compilare una richiesta con parametri non criticati , quindi è necessario implementare le stesse convalide o metodi di codifica sul lato server. JavaScript e AJAX sono utili per migliorare le prestazioni di un'applicazione, ma la sicurezza che offrono non è sufficiente, le misure di sicurezza devono sempre essere sul lato server.

Spero che questa informazione ti aiuti.

    
risposta data 07.01.2017 - 18:50
fonte

Leggi altre domande sui tag