Qual è il modo corretto di sfuggire ai dati non validi dal link in javascript contro xss

2

Qual è il modo giusto per sfuggire ai dati non validi la var " $actuallinkk " all'interno di questo script java

<a href="javascript:reportUser(\''.$actuallinkk.'&act=inviteadmin\')">Invite Consultant to this conversation</a>

questo è quello che ho fatto sotto, non so se è la cosa giusta per affrontare l'attacco xss.

function noHTML($input, $encoding = 'UTF-8')
{
    return htmlentities($input, ENT_QUOTES | ENT_HTML5, $encoding);
}




$actuallinkk = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

 echo'<script>
function reportUser(repUrl) {
  if (confirm("Are you sure you want to invite Consultant to this chat?")) {
   document.location = repUrl;
  }
}
</script>

';
echo'
<li><a href="javascript:reportUser(\''.noHTML($actuallinkk).'&act=inviteadmin\')">Invite Consultant to this conversation</a>
</li><br/>';


if($_GET["act"]=='inviteadmin'){}

    
posta General Omosco 02.02.2017 - 17:17
fonte

4 risposte

1

No, questo non è l'approccio corretto e al momento sei vulnerabile a XSS tramite questo payload:

http://example.com/yourscript.php/');alert('1

Attacco

Come visto sopra, un attacco imposterà $actuallinkk in:

1');alert('1

Quale risulta in:

<a href="javascript:reportUser('1&apos;&rpar;&semi;alert&lpar;&apos;1&act=inviteadmin')">

Ora sembra abbastanza buono, ma non lo è. Poiché l'input è all'interno di un contesto di attributo HTML, il parser HTML lo esaminerà e le assegnerà di dereferenziazione. Passerà quindi il risultato all'interprete JavaScript, a questo punto il codice sarà simile a questo:

reportUser('123');alert('1&act=inviteadmin')

Questo verrà eseguito, incluso il carico utile iniettato.

di difesa

L'esempio sopra mostra perché è importante prendere in considerazione il contesto quando si difende contro XSS.

All'interno di un contesto JavaScript, non vuoi codificare in HTML, ma sfuggire invece a tutti i caratteri speciali con i loro valori esadecimali (vedi OWASP ).

    
risposta data 03.02.2017 - 11:37
fonte
0

Questo è quello che volevo fare prima, ma lo splash [a-zA-Z0-9.?=&_: ( / proprio questo lo fa non funzionare) ] dentro fa sì che prg_match non funzioni. Come posso implementare lo splash

$rawactuallink = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";


if (preg_match("/^[a-zA-Z0-9.?=&_:/]*$/", $rawactuallink)) {
$actuallinkk = $rawactuallink;
}
else
{
$actuallinkk = "";
}
    
risposta data 03.02.2017 - 13:09
fonte
0

Questo è quello che ho finalmente fatto

 $rawactuallink = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

if (preg_match("/^[a-zA-Z0-9.#?=&_:\/]*$/", $rawactuallink)) {
$actuallink = $rawactuallink;
}
else
{
$actuallink = "https://www..com/err";
}

Spero che abbia senso usare questo

    
risposta data 03.02.2017 - 16:09
fonte
0

Fai le cose passo dopo passo:

Costruisci il tuo link su PHP, quindi fai $actuallinkk .'&act=inviteadmin'

Quindi inserisci questo link in un contesto javascript, quindi json_encode con 'javascript:reportUser(' . json_encode($actuallinkk .'&act=inviteadmin') . ')'

Quindi metti questa stringa Javascript in un contesto HTML, quindi htmlentities con <a href="<?php echo htmlentities('javascript:reportUser(' . json_encode($actuallinkk .'&act=inviteadmin') . ')', ENT_HTML, 'utf-8'); ?>">Invite Consultant to this conversation</a>

Infine, non dovresti affidarti a GET per fare qualcosa come "Invitare qualcuno" (a meno che questo link non recuperi la pagina per fare l'invito). L'invito stesso dovrebbe essere fatto da POST (quindi in <form> ).

Nota che non dovresti fare affidamento su REQUEST_URI come hai fatto, dal momento che potrebbe non contenere alcuna stringa di query (come https://duckduckgo.com , risulterebbe in un link come https://duckduckgo.com&act=inviteadmin che potrebbe anche non risolversi come corretto ospite). Probabilmente sai su quale pagina stai lavorando, quindi usalo direttamente (come /mypath/mypage.php?myparam=myvalue ).

    
risposta data 03.02.2017 - 18:33
fonte

Leggi altre domande sui tag