Cobri todas as bases com segurança ao ecoar uma variável de servidor para a página?
Pergunta
Com formas que sempre usei
<form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
Para fazer meus formulários se submeterem a si mesmos.
eu uso striptags()
Caso alguém se links para:
http://www.mysite.com/page-with-form.php?bla="><script src="http://www.nasty.com/super-nasty.js"></script><a href="#
Eu cobri todas as bases, para proteger dos ataques XSS, ou devo usar uma abordagem mais permite, digamos um regex que permite apenas caracteres alfanuméricos, a barra para a frente, o ponto de interrogação, o sinal igual a sinal, parênteses etc?
Obrigada!
Solução
Usar htmlspecialchars
ao invés de strip_tags
.
Outras dicas
Se você deseja fazer referência ao mesmo esquema/host/caminho, uma ação simples = "?" Schould é suficiente. De acordo com http://tools.ietf.org/html/rfc3986#section-4.2
relative-ref = relative-part [ "?" query ] [ "#" fragment ] relative-part = "//" authority path-abempty / path-absolute / path-noscheme / path-empty
É um URI relativo valido.
Peça a um formulário que envie a si mesmo enviando -o para isso:
$_SERVER["PHP_SELF"]
Essa variável global produzirá a página atual. A menos que haja uma razão pela qual você precise de toda a sequência de consultas junto com ela?
EDITAR
Desde como apontado por Volkerk nos comentários, mesmo PHP_SELF
é vulnerável, você pode escrever sua própria variável com base no PHP_SELF
e explodir o restante do URI que você sabe que não faz parte da sua página. Algo assim:
$file_ext = '.php'; //knowing what file extension your URI is
$page_on = $_SERVER["PHP_SELF"]; //grab this page, with all that junk
$page_huh = explode($file_ext, $page_on); //blow it apart based on file ext
$page_on = $page_huh[0].$file_ext; //attach the leg back onto the URI
echo $page_on;
Se seu striptags()
tiras apenas tags (caracteres entre "<" e ">", incluindo os colchetes do ângulo), alguém ainda pode injetar JavaScript:
http://www.mysite.com/page-with-form.php?bla=" onsubmit="return function(){ /*nasty code here*/ }()" style="
A lista de permissões melhores todos os meta-caracteres possíveis em HTML, JavaScript e CSS (por exemplo, suportes de ângulo, parênteses, aparelhos, semi-corons, cotação dupla, cotação única, etc.).
Se você deseja que um formulário se submeta, deixe a ação vazia, por exemplo
<form action="" method="POST">
...
</form>