Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
E ai pessoal, estou com um problema no qual meu código de paginas dinâmicas está vulnerável a Cross Site Scripting - XSS, queria saber se sabem alguma solução?
<?php
$tipo = "pag";
$nome_normal = "pag";
$pagina_local = "library/principal.php";
if(file_exists("library/$_GET[$tipo].php")){
include "library/$_GET[$tipo].php";
}else if($_GET[x] == "$nome_normal" || !$_GET[$tipo]){
include "$pagina_local";
}else{ }
?>Pelo código que você postou não há vulnerabilidade à XSS, mas o que o dincold disse acima é verdadeiro. Dentro das páginas que estão sendo incluídas no seu código, você deve buscar pelas saídas que são originadas direta ou indiretamente pelo usuário (get, post, banco de dados, etc.) e utilizar funções para limpá-las.
A respeito do código que você postou, ele está muito mal formatado e pode estar vulnerável à LFI. Se não fosse a função file_exists, também poderia estar à RFI. A boa notícia é que é fácil resolver isso.
Seu code, com comentários:
<?php
$tipo = "pag";
$nome_normal = "pag";
$pagina_local = "library/principal.php";
if(file_exists("library/$_GET[$tipo].php")){
//$_GET[$tipo] precisa ser tratada antes de ser utilizada para incluir algum arquivo
include "library/$_GET[$tipo].php";
//x é uma contante? Provavelmente não, então deveria estrar entre aspas
//A propósito, procure nomear melhor suas variáveis. Procure por: Clean Code
}else if($_GET[x] == "$nome_normal" || !$_GET[$tipo]){
include "$pagina_local";//aqui não precisamos de espas, pois é uma variável isolada
}else{ }//esse else não é necessário
?>
Seu code um pouco melhorado:
<?php
$tipo = "pag";
$nome_normal = "pag";
$pagina_local = "library/principal.php";
//ex: "../../../../etc/passwd%00" ou "../admin/editar-noticia" são tratados, ficando:
//"etcpasswd00", no primeiro exemplo, e "admineditar-noticia" no segundo
$arquivo = preg_replace( '/[^A-Za-z0-9_-]/', '', $_GET[ $tipo ] );
if(file_exists("library/{$arquivo}.php")){
include "library/{$arquivo}.php";
//não sei o objetivo desse if, então não vou me aprofundar.
//mas acredito que a comparação ideal aqui seja === e não ==
//Pesquise a respeito
}else if($_GET['x'] == $nome_normal || !$_GET[$tipo]){
include $pagina_local;
}
?>
Espero que tenha ajudado. Boa sorte e bons estudos. ;)
Tenta escapar suas saídas com htmlspecialchars() ou htmlentitios.