View
4
Download
0
Category
Preview:
Citation preview
Segurança de Aplicativos Web
com PHP
Conferencia 11
MSc. Yoenis Pantoja Zaldívar
Programação Web
10 conselhos de segurança
1. Evitar os links suspeitos.
2. Não aceder aos websites de duvidosa
reputação.
3. Actualizar o SO e aplicativos com os últimos
patches de segurança.
4. Descarregar aplicativos desde websites
oficiais.
5. Utilizar tecnologias de segurança (ex. antivirus,
firewall e antispam).
10 conselhos de segurança
6. Evitar a entrada de dados pessoales em
formularios duvidosos.
7. Ter cautela com os resultados devolvidos por
pesquisas na web.
8. Evitar a ejecução de arquivos duvidosos.
9. Aceitar só contactos conhecidos (clientes de
mensajería, redes sociais).
10. Utilizar senhas fortes.
Opções de configuração do PHP.
Segurança de Bancos de Dados.
Reporte de Erros.
Cookies.
Tratamento de Sesões
Resumo
Caracterizar os mecanismos de
segurança para as distintas ameaças que
podam surgir, aproveitando as funções e
potencial que fornece o PHP para fazer
um aplicativo mais confiável e seguro.
Objectivo
PHP 5 Power Programming. Cap. 7. Disponible
no website da disciplina: https://progwebisutic.files.wordpress.com/2016/07/php-
5-power-programming.pdf
PHP DOCUMENTATION GROUP. PHP Manual.
Bibliografía
“Alcançar um sistema
seguro es práticamente
imposível”
Uso de register_globals
Directiva para a definição automática de as
variáveis externas.
Como alternativa deben-se utilizar as
variáveis superglobales tais como $_GET,
$_POST, $_REQUEST, $_SESSION
<>// autenticacion.php
if ($password == “my_password”) {
$authorized = 1;
}
if ($authorized == 1) {
// Ações importantes
}
// PROBLEMA DE SEGURIDADE com a direção
// http://localhost/autentificacion.php?authorized=1
Exemplo (parte 1 de 2)
<>// autenticacion.php
// SOLUÇÃO 1
$authorized = 0; // Inicializar a variável
if ($password == “my_password”) {
$authorized = 1;
}
if ($authorized == 1) {
// Ações importantes
}
// SOLUÇÃO 2
// Estabelecer valor register_globals=Off no arquivo de
configuração de PHP
Exemplo (parte 2 de 2)
Definir as variáveis antes de usarlas.
Usar matrizes superglobales.
Não usar nomes típicos para as variáveis,
porque aumenta a posibilidade de que um
invasor poda descobrir como modificar
seus valores.
Bõas práticas
Erros en PHP
Erros en PHP
Erros en PHP
São importantes os reportes?
São peligrosos?
Erros en PHP
Mecanismo útil para o desenvolvedor
(causa, arquivo, linha de um erro).
Debe-se limitar e/ou personalizar para
um meio de produção, porque pode
revelar informação sensível do sistema
tornando-o vulnerável aos ataques.
Reporte de erros
Introdução de dados inapropriados.
Verificação dos tipos de erros devolvidos e
seus contextos.
Obter informação do servidor para
determinar possívels fraquezas.
Tática de ataques
“With this directive set to off, errors that occur during the execution of scripts will no longer be
displayed as a part of the script output, and thus,
will no longer be exposed to remote users. With some errors, the error message content may
expose information about your script, web server, or database server that may be exploitable for
hacking. Production sites should have this
directive set to off”
display_errors
Directiva display_errors
Directiva display_errors
php.ini
Alguns níveles de reporte
E_ERROR E_WARNING E_PARSE
Erros fatais de
ejecução
Avisos de ejecução
E_NOTICE
Erros de compilação
Notificações de
ejecução (ex. variáveis
sem inicializar)
E_ALL
Todos os erros e avisos
(excepto E_STRICT)
para más información
VER MANUAL?
Nívels de reporte: phi.ini
Nívels de reporte: phi.ini
Common Values:• E_ALL (Show all errors, warnings and notices including coding
standards.)
• E_ALL & ~E_NOTICE (Show all errors, except for notices)
• E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for
notices and coding standards warnings.)
• E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_C
ORE_ERROR (Show only errors)
• Default Value: E_ALL & ~E_STRICT & ~E_DEPRECATED
• Development Value: E_ALL
• Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT
<>// Deshabilitar todo reporte de erros
error_reporting(0);
// Reportar todos os erros excepto E_NOTICE
// Este é o valor predeterminado no php.ini
error_reporting(E_ALL ^ E_NOTICE);
/////////////// No php.ini /////////////////////////////////////////////////////
// Deshabilitar todo reporte de erros
display_errors = Off
// Reportar todos os erros excepto E_NOTICE
error_reporting = E_ALL & ~E_NOTICE
Exemplo: Reporte de erros
<>function divide($x) {
if ($x==0) {
throw new Exception('División por cero.');
}
else return 1/$x;
}
try {
echo divide(5) . "\n";
echo divide(0) . "\n";
} catch (Exception $e) {
echo 'Excepção capturada: ', $e->getMessage(), "\n";
}
// Continuar a ejecução
Exemplo: Trabalho com erros
Segurança em Bancos de Dados
tb_estudante
numero turma
tb_nota
id nota disciplina
1
1…n
tb_profesor
numero disciplina turma
1
1…n
Tem modifica
Qué acontece se ambos conectam-se ao Banco de
Dados com os mesmos permisos sobre a tabela
tb_nota?
Os aplicativos não deven ser ligados ao
banco de dados com o usuario
correspondente à seu proprietário (root).
Podem-se criar diferentes usuarios do BD
para cada rol de seu aplicativo com
dereitos limitados.
Asegurar as conexões: encriptar.
Segurança em Bancos de Dados
É uma técnica na qual um atacante cria ou
muda comandos SQL existentes para
mostrar dados ocultos, sobrescrever
dados críticos, ou executar comandos do
sistema peligrosos na máquina donde
está o banco de dados.
Inyeção de SQL
<><>// Código XHTML
<form method="login.php" action="POST">
Usuario: <input type="text" name=“txt_usuario" />
Senha: <input type="password" name=“psw_senha" />
<input type="submit" value=“Aceder" />
</form>
// No procesamento com PHP
$u = $_POST[‘txt_usuario’];
$c = md5($_POST[‘psw_senha’]);
$sql = "SELECT * tb_usuario WHERE usuario=‘$u’ AND clave= ‘$c’";
// …
Exemplo
// No procesamento com PHP …
$sql = “SELECT * FROM tb_usuario WHERE nombre=‘pepe’ OR 1 = 1 --’ AND
clave=‘d41d8cd98f00b204e9800998ecf8427e’”;
// …
Inyeção SQL
pepe‘OR 1 = 1 --
pepe’ OR 1 = 1 --
<>$sql = sprintf("INSERT INTO tb_usuario (nombre,
clave) VALUES ('%s', '%s');",
pg_escape_string($u), md5($c));
$resultado = pg_query($con, $sql);
// para obtener el usuario
$sql = sprintf("SELECT * FROM tb_usuario
WHERE nombre='%s' AND clave='%s';",
pg_escape_string($u), md5($c));
$resultado = pg_query($con, $sql);
Exemplo: Encriptar valores
Filtrado dos dados de entrada.
Validação dos tipos de dados: is_numeric(),
ctype_digit() , is_string()
Uso de aspas simples nos dados.
Não ligarse aos SGBD como superusuario.
Proteção vs. ataques SQL
¿Cómo lograr esta
funcionalidad?
Cookies
setcookie() $_COOKIE
Array asociativo de variávels
pasadas ao script actual
através de Cookies HTTP
para más información
VER MANUAL?
Define uma cookie para ser
enviada junto com as demais
cabeceras de HTTP
<>setcookie(“autenticado", “yes”);
// hasta que o navegador seja fechado
setcookie(“autenticado", “yes”, 0);
// 30 días
setcookie(“autenticado", “yes”, time() + 60*60*24*30);
// Em outro arquivo…
echo $_COOKIE[“autenticado”];
// yes
Exemplo
São parte da cabecera HTTP, por tanto a
função setcookie() debe invocarse antes de
cualquer saída ao navegador.
Não serão visíveis hasta a seguinte carga de
uma página na que deben estar disponíveis.
Têm que ser eliminadas com os mesmos
parámetros com os que são criadas
(subtraindo o tempo)
Importante: sobre as cookies
Permitem criar uma sesão por cada
usuario ligado.
Verificar em cada página do aplicativo qué
usuario está ligado.
Mostrar o conteúdo da página em
dependença dos permisos que tenha cada
usuario.
Sesões
Sesiones
session_start() session_unset()
$_SESSION
Libera todas as variáveis de
sesão
para más información
VER MANUAL?
Array asociativo que contém
variáveis de sesão disponíveis
Iniciar uma nova sesão
unset($var)
Destrói uma variável
especificada
<>// autenticacion.php
$usuario = $_POST["txt_nome_usuario"];
$senha = $_POST["psw_senha"];
if ($usuario == "docencia" && $senha == "docencia") {
session_start();
$_SESSION["autenticado"] = $usuario;
header ("Location: inicio.php");
} else {
echo "El usuario o la clave no son válidos.";
}
Exemplo 1: Sesões (parte 1 de 2)
<>// inicio.php
session_start();
if (! isset($_SESSION["autenticado"])) {
header (“Location: autenticacion.php");
}
if(isset($_POST["btn_salir"])){
session_unset();
header ("Location: autenticacion.php");
}
Exemplo 1: Sesões (parte 2 de 2)
<>// inicio.php
session_start();
$rol = $_SESSION['rol_usuario'];
switch($rol) {
case ‘editor’:
header("Location:../Modulos/Editor/editor.php");
break;
case ‘administrador’:
header("Location:../Modulos/Admin/admin.php");
break;
default:
header("Location:../inicio.php");
}
Ejemplo 2: Sesiones
Configuração
de PHP
Banco de
Dados
Reporte de
errosCookies
Sesões
SEGURANÇA
Tarefa
• Implementar um pequeno exemplo que
aplique qualquer dos mecanismos para a
segurança aprendidos na conferencia.
Enviar por correo antes de segunda feira.
Segurança de Aplicativos Web
com PHP
Conferencia 11
MSc. Yoenis Pantoja Zaldívar
Programação Web
Recommended