Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Como faço pra proteger os sites que faço de inserção de códigos maliciosos?
Atualmente eu uso o seguinte nas minhas paginas
<?if (!$_GET[pagina]){$_GET[pagina] = inicial?><?}?><?include("$_GET[pagina].php");?>
Como aplico esse codigo...
<?php//cabeçalho do site$page = $_GET['page'];//para ter certeza que $page é alfanumérico.if(eregi("^[a-z0-9-_.]+$", $page, $regs)) { $dir = "includes/"; //pode ser branco $ext = ".php"; //.php, .html, .txt, whatever if(file_exists($dir . $page . $ext)) { include($dir . $page . $ext); //ou outro tipo de extensão se não for necessariamente um arquivo .php } else { echo '404 - Not Found'; //ou algo similar }} else { echo 'Naughty Naughty, very Naughty.'; /rodapé do site}?>
no lugar do anterior?
O Fabyo postou uma função a um tempo atrás que é muito boa para remover caracteres indesejados.Procure por ela aqui no forum em laboratório de scripts.
Tem como alguém invadir uma tabela mysql atraves do codigo PHP?Se tiver, como impedir?
se seu sistema não estiver protegido contra sql injection, dependendo das permissões do usuário, acho que ele pode até deletar o bd.
e como prtejo contra sql injection?
Olá Andre Summers, tudo bem?
Bom cara, é o seguinte, hoje, você sempre estará susceptível quando for utilizar páginas dinâmicas. Mesmo que todo o seu site esteja com o código-fonte impecável, você ainda corre risco de ser invadido não através do seu site, mas de outro site armazenado em seu servidor. Através desse outro site, eles injetam um código PHP (PHP Injection), fazem upload de arquivos maliciosos e abrem portas do servidor que possibilitam a invasão (backdoors).
Resumindo: Você "sempre" estará susceptível a ter seu site "hackeado" (defaceado seria o termo mais correto) por alguém que não tem nada pra fazer e fica por aí procurando sites para "defacear" (estragar, descaracterizar a estrutura de uma aplicação/site da WEB). Diríamos que tais pessoas são meros "lammers" (e não hackers), que nem precisam saber muito de PHP, SQL ou Java Script, mas que deixam de estar aprendendo Física, Matemática, ou de jogar Futebol para ficar apurrinhando a vida de outras pessoas.
Bom, creio que aqui no imasters não será o local mais apropriado para você tirar as suas dúvidas, pois já existe muito conteúdo sobre segurança em PHP, tanto em relação a práticas como XSS, PHP Injection e/ou SQL Injection, e também fóruns muitos específicos para tal assunto. Existem ainda diversas vídeo-aulas que você podem ser baixadas e que mostram, passo-a-passo, onde residem as vulnerabilidades de uma página dinâmica. Elas ensinam ainda até mesmo invadir um site, quais programas são necessários e quais procedimentos você deve seguir. No entanto, sugiro você utilizar essas informações apenas para aprender sobre segurança, ok?
Bom, vamos ao que interessa. Sua primeira pergunta foi:
Como faço pra proteger os sites que faço de inserção de códigos maliciosos?
1 - Faça sites apenas em HTML (sei que não é tão legal, mas ajuda);
2 - Não coloque formulários, ou campos de textos em seu site (sei também que não é legal, mas ajuda a previnir contra XSS, que é em Java Script);
Bem, como os itens 1 e 2 dificilmente serão seguidos por programadores PHP, vamos então nos ater à segurança aplicada a essa linguagem:
Protegendo contra PHP Injection:
3 - Não utilize comandos de inserções em seu código, como 'include', 'include_once', 'require', 'require_once', pois o PHP Injection é "injetado" justamente através desses includes que os "lammerzinhos" descobrem em seu sistema.
4 - Se for utilizar as funções de inserções descritas no item anterior (3), procure sempre validar qualquer valor que poderia recebido através delas (por exemplo, um include que recebe um valor passado por GET, como por exemplo: www.seusite.com.br/index.php?pag=downloads.php). Veja que no lugar de downloads.php o "lammer" poderia colocar um site com código-fonte malicioso (que eles chamam de "cmd", ou seja, um arquivo php (ou até mesmo gif, acredita?!) com várias funções como uploads, criar diretórios, remover arquivos, etc.)
5 - Evite, portanto, ficar passando informações via GET (vide item 4), pois os "lammerzinhos" descobrem o que você está pretendendo passar e podem usar isso contra você, caso seu código esteja vulnerável.
6 - Se for utilizar o método GET, procure SEMPRE, SEMPRE, SEMPRE validar tudo o que poderia ser recebido como parâmetro. Se o arquivo a ser incluído estiver em outro servidor (é muito raro, mas pode acontecer), faça um if verificando se o endereço é o que realmente você quer que seja. Você pode também criar um array que lista todas as páginas que poderiam estar sendo passadas via GET, e criar uma função que faria o seguinte:
Se o valor que está sendo passado existe no array, então incluir esse valor, por exemplo:
<?php//Valor recebido do GET;$valor = "index.php";//Lista de todos os valores que poderiam ser recebidos via GET:$permissoes[0]="index.php";$permissoes[1]="downloads.php";$permissoes[2]="imagens.php";$incluir = "0"; // 0:não, 1:sim,for ($i=0; $i<count($permissoes); $i++){ if($valor==$permissoes[$i]){ //Altera o valor da variável $incluir; $incluir++; }}if($incluir!=0){ //include($valor); echo "include(".$valor.")";}else{ echo "Mensagem de erro!";}?>7 - Se o arquivo que está sendo incluído está no seu servidor, coloque o valor recebido antes de "../" (se for utilizar a pasta pai) ou "./" (se o arquivo estiver na pasta atual ou em uma de suas descendentes).
Para isso, basta alterar o último bloco do if do código anterior para:
if($incluir!=0){ //include($valor); include("./".$valor);}else{ echo "Mensagem de erro!";}Bom, isso são algumas coisas que você poderá usar para evitar PHP Injection.
Vamos passar para a segunda pergunta?
Sua segunda pergunta foi: e como protejo contra sql injection?
Bom, o SQL é injetado onde é possível injetá-lo, ou seja, em áreas do site onde os comandos SQL são utilizados. Exemplo: Dados vindos de formulários ou, mais uma vez, do famoso GET.
Bem, não vou ater muito ao SQL Injection pois existe um artigo formidável para isso:
http://www.totalsecurity.com.br/article.php?sid=732
Obs: Está demorando um pouco para carregar...
Para saber mais sobre XSS, PHP Injection, SQL Injection, você poderá acessar o link:
http://www.forum-invasao.com.br/novo/viewforum.php?f=20
Nesse link eles ensinam tudo que você precisa saber sobre "defaces". A minha intenção aqui é divulgar segurança. Se vocês leitores desejarem utilizar as informações do link para o mal, a responsabilidade é suas, não minha, pois não posso mudar o caráter de ninguém....
Vale ressaltar que, tudo que você fizer, eles sempre terão o seu IP gravado! Por isso, não tente fazer nada para prejudicar outras pessoas pois, com certeza, você responderá depois por isso!!! Quem avisa amigo é!
Dica: Aí vai um programa excelente, que informa com bastante se seu site é vulnerável a ataques ou não:
Acunetix Web Vulnerability Scanner
No mais, abraços e muita segurança a todos!
>
Atualmente eu uso o seguinte nas minhas paginas
<?if (!$_GET[pagina]){$_GET[pagina] = inicial?><?}?><?include("$_GET[pagina].php");?>
Como aplico esse codigo...
//para ter certeza que $page é alfanumérico.
if(eregi("^[a-z0-9-_.]+$", $page, $regs)) {
$dir = "includes/"; //pode ser branco
$ext = ".php"; //.php, .html, .txt, whatever
if(file_exists($dir . $page . $ext)) {
include($dir . $page . $ext); //ou outro tipo de extensão se não for necessariamente um arquivo .php
} else {
echo '404 - Not Found'; //ou algo similar
}
} else {
echo 'Naughty Naughty, very Naughty.'; /rodapé do site
}
?> linenums:0'><?php//cabeçalho do site$page = $_GET['page'];//para ter certeza que $page é alfanumérico.if(eregi("^[a-z0-9-_.]+$", $page, $regs)) { $dir = "includes/"; //pode ser branco $ext = ".php"; //.php, .html, .txt, whatever if(file_exists($dir . $page . $ext)) { include($dir . $page . $ext); //ou outro tipo de extensão se não for necessariamente um arquivo .php } else { echo '404 - Not Found'; //ou algo similar }} else { echo 'Naughty Naughty, very Naughty.'; /rodapé do site}?>
no lugar do anterior?
Cara,
O site da minha empresa foi invadido essa semana , e gostaria de saber como aplica esse código que foi postado para proteger.(Injetaram arquivos)
Sei que tenho que validar todas as paginas, mas como?
No meu site existe uma index.php que renderiza dentro da div conteudo a pagina quem-somos automatico.
A index possui o seguinte codigo php.
<?
session_start();
$img = $cont;
if($cont == '' || !file_exists($cont . ".php") ) $cont = "quem-somos";
$cont .= ".php";
?>
Dentro dela tem uma div que possui uma função include , para incluir a variavel cont - para incluir outras paginas
<div id="box2">
<? include ($cont); ?>
</div>
Quando preciso chamar outras paginas uso index.php?cont=qualquercoisa
Eu utilizo essa função feita pelo Fabyo:
# $nome = anti_injection($_POST["nome"]);
# $senha = anti_injection($_POST["senha"]);
#
Isso já foi bem discutido aí no forum. Se você pesquisar, achará muita coisa sobre.
Aqui tem algumas referências sobre:
http://www.htmlstaff.org/ver.php?id=1356
http://www.htmlstaff.org/ver.php?id=1357
http://www.htmlstaff.org/ver.php?id=1678
http://www.htmlstaff.org/ver.php?id=2831
http://www.htmlstaff.org/ver.php?id=6350