Estou anotando algumas dicas para aumentar a segurança em aplicações php (linguagem a qual programo).
Abaixo irei colocar algumas dicas sobre o que tenho aprendido, mas infelizmente de maneira resumida, definida como parte 1:
-alertas de erro -> Desabilitado (coisas como error_reporting(E_ALL);) – isto só pode ocorrer em um sistema no momento de testing.
-register_globals -> Desabilitado
-permissão ->dar o mínimo de privilégios possível no sistema, a nível
de bd e etc.
-variáveis ->setar vazios antes de atribuir strings.
Ex:
<?php
$busca = ”;
if (isset($_GET[‘busca’]))
{
$busca = $_GET[‘busca’];
}
?>
– usar ssl para dados importantes, evitando exposição de dados.
– Forçar a segurança de maneira que não pese ao usuário,
se possível transparente. Ex: solicitar autenticação por medida de segurança para um transação importante de um cliente já autenticado no sistema.
– tomar sempre cuidado no ato de detecção de ataques, isso pode impedir a usabilidade do sistema.
– cuidados com interações em sistemas remotos (rss, apis remotas – web services).
– filtrar bem os dados (todos) que entram, para não operar com dados
maliciosos.
Filtrar dados é ler o que se entra por $ _GET e $ _POST e observar o que está malicioso e distinguir isto. (bem fácil de filtrar, ruim é identificar a origem)
Todas entradas têm de vir de uma fonte remota, se você não conhece as entradas, não pode se defender delas.
Entradas como $_SERVER exigem muito mais trabalho na hora da filtragem.
– A pior forma de filtrar é tentar manipular ao invés de tratar que o que é limpo é limpo e o que é sujo é sujo, do contrário, tentar manipular as informações poderá criar brechas.
Trecho que reforça a segurança quando um atacante tenta retroceder 1 diretório (ou mais):
<?php
$nomefile = $_POST[‘nomefile’];
while (strpos($_POST[‘nomefile’], ‘..’) !== FALSE)
{
$nomefile = str_replace(‘..’, ‘.’, $nomefile);
}
?>
Evidentemente, o basename() função pode substituir toda esta técnica e é uma maneira segura de atingir o objectivo pretendido. O ponto importante é que qualquer tentativa de corrigir Dados inválidos podem conter um erro e permitir a passagem de dados inválidos. Inspeção é uma alternativa muito mais seguro.
INSPECIONAR É MELHOR QUE CORRIGIR, quando se tenta corrigir geralmente se abre uma falha, o que é a real necessidade do atacante.
Se você consegue identificar com precisão e fidelidade a entrada dos dados você já fez quase tudo.
Após, o passo seguinte é criar um filtro fiel para distinguir dados ruins de dados bons.
sempre que for tratar dados o bom é criar um array vazio e atribuir dados a ele, que você realmente sabe que estão limpos.
<?php
$limpo = array( );
switch($_POST[‘cor’]) {
case ‘vermelho’:
case ‘verde’:
case ‘azul’:
$limpo[‘cor’] = $_POST[‘cor’];
break;
}
?>
Estamos garantindo mais segurança por que a cor só pode ser uma das três e nada mais, neste caso!
você pode querer afirmar que um usuário só pode conter caracteres alfanuméricos:
<? php
$limpo = array ();
if (ctype_alnum ($ _POST [ ‘user’]))
(
$limpo[ ‘user’] = $ _POST [ ‘user’];
)
?>
Procure sempre usar funções nativas do php para segurança, isto pode lhe prevenir de problemas como erro de lógica, resultando assim em uma
brecha de segurança (o que um atacante necessita).
Para ajudar na segurança nos devemos:
Identificar saída,
Escapar saída,
Distinção entre escapara e não escapar dados .
É importante para escapar apenas dados filtrados. Embora escapar sozinho pode evitar muitas das vulnerabilidades de segurança, não deve nunca ser considerado como um substituto para a filtragem de entrada. Dados maliciosos devem ser filtrados primeiro e depois escapados.
Filtrar as entradas com htmlentities é melhor que htmlspecialchars, mas ambas são boas para converter o que vem da web, um exemplo legal é este aqui:
<?php
$htm = array( );
$htm[‘user’] = htmlentities($limpo[‘user’], ENT_QUOTES, ‘UTF-8’);
echo “<p>Olá, {$htm[‘user’]}.</p>”; ?>
Isso garante a entrada de dados do user, e de tabela quebra a forma em que os dados vêm de maneira a traduzir caracteres “malucos” em html.
Devemos escapar todos os dados SIM, isto ajuda na segurança de sua aplicação.
htmlentities não converte caracteres alfanuméricos, mas previne que dados estranhos operem em interação do usuário com o sistema.
Outra política, voltando-se ao famoso e muito utilizado mysql é usar funções nativas para escapar entradas de dados para o banco de dados.
Usamos a função mysql_real_escape_string ().
Podemos usar também addslashes para ajudar na relação com o mysql, mas em última instância.
<?php $mysql = array( );
$mysql[‘username’] = mysql_real_escape_string($clean[‘username’]);
$sql = “SELECT * FROM profile WHERE username = ‘{$mysql[‘username’]}'”; $result = mysql_query($sql); ?>
Fonte -> http://phpsecurity.org/