Segurança de Aplicativos Web
com PHP
Conferencia 11
MSc. Yoenis Pantoja Zaldívar
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,
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).
Opções de configuração do PHP.
Segurança de Bancos de Dados.
Reporte de Erros.
Cookies.
Tratamento de Sesões
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.
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.
“Alcançar um sistema
seguro es práticamente
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
<>
// 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
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.
São importantes os reportes?
São peligrosos?
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.
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.
“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
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 deejecuçã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
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
<>
// 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
<>
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
Segurança em Bancos de Dados
tb_estudante
numero turmatb_nota
id nota disciplina 1 1…ntb_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
.
É 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.
<>
<>
// 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’";
// …
// No procesamento com PHP …
$sql = “SELECT * FROM tb_usuario WHERE nombre=‘pepe’ OR 1 = 1 --’ AND clave=‘d41d8cd98f00b204e9800998ecf8427e’”; // …
Inyeção SQL
pepe‘OR 1 = 1pepe’ 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);
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
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)
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.
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."; }
<>
// inicio.php
session_start();
if (! isset($_SESSION["autenticado"])) { header (“Location: autenticacion.php"); }
if(isset($_POST["btn_salir"])){
session_unset();
header ("Location: autenticacion.php"); }
<>
// 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: SesionesConfiguração de PHP Banco de Dados Reporte de erros Cookies Sesões