primeiro programa em php orientado a objetos§ão a o.o. no php.pdf · ao%20curso%20de%20php.pdf...
TRANSCRIPT
PRIMEIRO PROGRAMA
EM PHP ORIENTADO A
OBJETOS
Leonardo Pimentel Ferreira
Higor Ernandes Ramos Silva
Veja o cronograma do curso:
http://www.petsi.facom.ufu.br/system/files/Bem%20Vindo%20ao%20Curso%20de%20PHP.pdf
Outros materiais: http://www.petsi.facom.ufu.br/node/1
PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Iniciando um projeto PHP no NetBeans
• Abra o NetBeans e crie um novo projeto, acessando
Arquivo → Novo Projeto → PHP → Aplicação PHP
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Iniciando um projeto PHP no NetBeans
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Página index.php
• Página index.php de um projeto recém-criado no
NetBeans.
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Hello World
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
MVC (Model-View-Controller)
• Models:
• Partes do software que realizam funções relacionadas ao
domínio
• Os modelos possuem dados e operações
• Views:
• Componentes que mostram os dados aos usuários
• Dados vêm de um ou mais modelos
• Controller:
• Componentes que recebem e enviam comandos
• Controllers podem alterar views e models
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
MVC (Model-View-Controller)
• O usuário manipula apenas controllers (botões,
scrollbars).
• Views e controllers podem ser adicionados,
removidos e alterados de forma independente do
model.
• Componentes da interface são quase totalmente
desacoplados dos componentes da aplicação.
• Alta flexibilidade e portabilidade.
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
MVC (Model-View-Controller)
Fonte: http://blog.stannard.net.au/blog/media/simple-mvc-framework/mvc.gif
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Criando a visão (formulário html)
• Crie um arquivo chamado login.html dentro do
diretório minicurso/visao/login
• O atributo action da tag form informa a página php que
receberá os dados do formulário
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Visualizando o resultado no Browser
• Resultado do formulário no navegador Mozilla Firefox.
1. Você pode ver o resultado no navegador digitando o caminho do arquivo login.html (figura abaixo e mais a direita)
2. Ou... Configurando no NetBeans clicando com o botão direito do
mouse no projeto e configurando conforme a figura a seguir.
Desta maneira ao clicar no botão executar a página será
aberta no browser padrão do sistema operacional. (figura abaixo
e mais a esquerda)
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Criando uma classe de modelo
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Criando o controle
• Por enquanto a nossa classe da camada controle está
bem simples.
• Vejam que ela já está se comunicando com o Modelo ao instanciar a classe Login e invocando métodos do objeto
instanciado.
• Controle O.O.
• Controle procedimental.
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Review...
• Até agora vimos:
• Classes;
• Objetos;
• Métodos(Construtor, GETTERs e SETTERs);
• Variáveis e atributos;
• Operador $this;
• Visibilidade private;
• Um pouco do MVC na prática;
• Criar formulário HTML;
• Capturar no PHP os dados enviados de um formulário HTML via
método POST;
• Daqui para frente iremos aprofundar mais em O.O.
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Método destrutor
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Propriedades (atributos ou campos)
• Visibilidade:
Métodos Atributos Visibilidade (contexto)
public function getNome(); //ou
function getNome(); public $nome;
Default para os métodos – Em qualquer contexto é possível
acessá-lo. Visibilidade fraca.
private function getNome(); private $nome; Apenas no contexto da classe é possível acessá-lo.
Visibilidade forte.
protected function getNome(); protected $nome; Apenas no contexto da classe e subclasses é possível
acessá-lo. Visibilidade média.
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exercício sobre propriedades
1. Na classe de modelo Login, altere a visibilidade do método setUsuario() para protected.
2. No método construtor da classe de controle cLogin adicione a declaração $login->setUsuario("usuario");
3. Execute o arquivo login.html no Browser.
4. Remova a declaração adicionada no item 2 e mude o método setUsuario() para public.
Baixar a revisão 2 do repositório:
https://minicurso-php-petsi-2013-2.googlecode.com/svn/trunk
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Atributos e métodos estáticos
• Crie um atributo estático chamado $nro_usuarios_online e atribua o valor 0 para ele.
• Em seguida, crie um método estático chamado alteraNroUsuarios().
• A cada vez que o método construtor for chamado, o método alteraNroUsuarios() incrementará em 1 o
número de usuários online.
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Atributos e métodos estáticos
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Passando parâmetros para métodos
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Definindo parâmetros default
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Herança
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Herança
• Para testar coloque os
trechos de código em
vermelho no arquivo de
controle do login: clogin
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Herança
• Houve algum erro? Do tipo • Fatal error: Call to undefined function setNroVezesAcessado()
in C:\xampp\htdocs\minicurso\login\modelo\mlogincomum.php on line 8
• Pense em como corrigir isso. Uma dica: this is the
problem.
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exercício sobre Herança:
• Crie uma classe Cheque (no arquivo cheque.php) que
possua um atributo valor, um construtor que receba como
parâmetro esse valor e dois métodos que você
implementará da maneira que quiser (CalcularJuros() e TipoCheque()). Em seguida,
crie uma classe ChequeEspecial (no arquivo
chequeepecial.php) que vai herdar da classe
Cheque.
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Polimorfismo
• Implemente na classe ChequeEspecial os próprios
métodos CalcularJuros()e TipoCheque() dela.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Polimorfismo
• Crie um terceiro arquivo para exemplificar o uso do polimorfismo.
<?php
require_once("cheque.php");
require_once("chequeespecial.php");
$Cheques[1] = new Cheque(380.00);
$Cheques[2] = new ChequeEspecial(600.00);
$Cheques[3] = new Cheque(230.00);
foreach ( $Cheques as $key => $Cheque )
{
echo "Cheque $key ( {$Cheque->TipoCheque()} )
com juros: R$ {$Cheque->CalcularJuros()} <br />";
}
?>
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Classes e métodos abstratos (Abstract)
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Classes e métodos abstratos (Abstract)
• Reflexo na classe filha LoginComum.
• Reflexo na classe de controle, ao instanciar uma classe abstrata
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exercício sobre Classes abstratas:
• Corrija os erros apresentados anteriormente.
• Crie uma classe chamada LoginAdmin, que herda da
classe Login.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Interface
• Para exemplificar o uso de interfaces, crie uma interface chamada ILogin, que contém o método
imprimir_dados(Login $l). l é um objeto da classe
Login.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Interface
• Feito isso, faça com que a classe abstrata Login
implemente a interface ILogin.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Interface
NOTA
- Interfaces podem definir constantes. Constantes são uma espécie de
variável e cujo o seu valor não é alterado durante a execução do
programa. Ex.:
- Classes abstratas e concretas podem implementar várias interfaces.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Interfaces podem “extender” outras
classes:
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exercício Interface:
• Crie uma interface no projeto que declara pelo menos um
método. Em seguida, mostre um exemplo de como
utilizá-la.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Clonagem de objetos
• Ex.: $copia_do_objeto = clone $objeto;
• Adicione as linhas a seguir na classe de controle
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Clonagem de objetos
• Resultado
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Clonagem de objetos
• Contornando o efeito indesejado do slide anterior. Implemente o método mágico __clone() na classe de
modelo LoginComum
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Comparação de objetos
• Existem duas maneiras de comparar objetos:
1. ($objeto1 == $objeto2) e (!=): verifica se dois
objetos são da mesma classe e possuem os mesmos
atributos e valores.
2. ($objeto1 === $objeto2) e (!==): verifica se
dois objetos são da mesma classe, possuem os
mesmos atributos e valores e representam a mesma
instância da classe.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Comparação de objetos
O resultado será para cada sequência de if e else:
• 1- (IF) Login Comum tem as mesmas propriedades da cópia de sua referência
• 2- (ELSE) Login Comum não tem as mesmas propriedades da cópia de seu clone
• 3- (IF) Login Comum é a mesma instância da cópia de sua referência
• 4- (ELSE) Login Comum não é a mesma instância do seu clone
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Importando o Script do Banco de dados
através do PHPMyAdmin • Baixe e extraia o arquivo BD-aula4.sql no site
http://www.petsi.facom.ufu.br/system/files/php-projeto-
inicio-aula-4-03-12.zip
• Certifique de que o Apache e o MySQL foram iniciados no
XAMPP
• Digite no browser: localhost/phpmyadmin
• Selecione o menu importar
• Importe o arquivo BD-aula4.sql
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Criando a interface para login DAO
Crie uma interface chamada ILoginComumDAO no arquivo dao/ilogindao.php
<?php
include_once '../modelo/mlogincomum.php';
//Qualquer DAO de BD que implemente esta interface terá que implementar as operações
interface ILoginComumDAO{
public function add(LoginComum $l);
public function atualiza(LoginComum $l);
public function remove($usuario);
public function busca($usuario);
}
?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Conectando PHP ao Banco de dados
através do PDO (PHP Data Objects)
• PDO é a interface para acessar banco de dados em PHP.
• Para usar funções do banco de dados via PDO é necessário o driver PDO específico do servidor do BD.
• Cada driver de BD implementa a interface PDO. Independente do BD que está sendo utilizado, serão usadas as mesmas funções para escrever queries.
• PDO funciona nativo a partir do PHP 5.1, e está disponível como um extensão para PHP 5.0;
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Conectando PHP ao MySQL • Sintaxe:
$bd = new PDO ($dsn, $username, $passwd, $options);
$dsn = prefixo DSN é composto por :
Host - servidor do banco de dados está.
Port - o núm. da porta onde o servidor do bd está escutando.
Dbname - o nome do banco de dados.
unix_socket - o socket Unix do MySQL.
$username = usuário do banco de dados
$passwd = senha do usuário do banco de dados
$options = array de opções
• Exemplo:
$bd = new PDO
("mysql:host=localhost;dbname=pdo;port=3306;unix_socket=/tmp/mysql.sock",
"pdo", "pdo", array(PDO::ATTR_PERSISTENT => true));
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Criando uma classe geral PDO <?php //Crie uma classe chamada MySQLPDO no arquivo dao/mysqlpdo.php
class MySQLPDO extends PDO {
const DB_HOST='localhost';
const DB_PORT='3306';
const DB_NAME='minicurso_php';
const DB_USER='root';
const DB_PASS='';
public function __construct($options=null){
try{
parent::__construct('mysql:host='.MySQLPDO::DB_HOST.';port='.MySQLPDO::DB_PORT.';dbname='.MyS
QLPDO::DB_NAME,
MySQLPDO::DB_USER, MySQLPDO::DB_PASS, $options);
} catch (PDOException $err){
echo $err->getMessage();
return null;
}
}
public function query($query){ //Consulta segura com Prepare Statement
$args = func_get_args();//transforma argumentos em vetor
array_shift($args); //array_shift() retira o primeiro elemento(query) do array de
//argumentos e o retorna
//Ex.: irá restar no array $args apenas $t1 que será passado em execute
$statm = parent::prepare($query); //prepara a consulta
$statm->execute($args); //executa o statment
return $statm; //retorna o statement
}
}?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Tratando erros de conexão
• Via try e catch.
<?php try { $bd = new PDO('mysql:host=localhost;dbname=test', $user, $pass); } catch (PDOException $e) { print "Erro: " . $e->getMessage() . "<br/>"; die();//termina o script atual
//ou lançar exceção
//throw new Exception('Não foi possível conectar ao bd'); } ?>
• Cuidado: Se a exceção não for capturada via set_exception_handler ou try e catch um erro ocorrerá e dados da conexão serão expostos.
•
• Ex.: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1049] Unknown database 'pd'' in C:\xampp\htdocs\minicurso\index.php:13 Stack trace: #0 C:\xampp\htdocs\minicurso\index.php(13): PDO->__construct('mysql:host=loca...', 'pdo', 'pdo', Array) #1 {main} thrown in C:\xampp\htdocs\minicurso\index.php on line 13
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Prepared Statement
• Oferecem dois grandes benefícios:
1. A consulta é preparada (parsed) apenas uma vez e
pode ser executada múltiplas vezes com diferentes
parâmetros, i.e, são customizáveis. Quando a
consulta é preparada o banco de dados analizará,
compilará e otimizará a consulta. Usando prepared
statement a aplicação evita repetir a análise,
compilação e otimização do ciclo. Isto significa que
prepared statements usam menos recursos e
assim rodam mais rápido.
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Prepared Statement
2. Os parâmetros dos prepared statements não necessitam de
ser quoted. O driver do servidor de BD automaticamente faz
isso. Isso certifica ao desenvolvedor que nenhuma SQL
injection ocorrerá (entretanto, se outras porções do código
da consulta estão sendo construída com entradas
unescaped, SQL injection é ainda possível).
• Def.: São templates para SQL compilados que serão
executados.
• Prepared statements são emuladas para drivers que não
suportam-as. Isto faz a aplicação usar o mesmo paradigma
de acesso ao dado.
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Crie uma classe DAO <?php
include_once 'mysqlpdo.php';
include_once 'ilogincomumdao.php';
class LoginComumDAOMySQL extends MySQLPDO implements ILoginComumDAO {
public function __construct($driver_options=array(PDO::ATTR_PERSISTENT => true)) {
parent::__construct($driver_options);
}
public function add(LoginComum $l) {
//PREPARED STATEMENT
$stmt = $this->prepare("INSERT INTO LOGIN (log_user, log_senha) VALUES (:user, :senha)");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':senha', $senha);
//ou $stmt = $this->prepare("INSERT INTO LOGIN (log_user, log_senha) VALUES (?, ?)");
//$stmt->bindParam(1, $user);
//$stmt->bindParam(2, $senha);
$user = $l->getUsuario();
$senha= $l->getSenha();
//$user = 'x';
//$senha = 'y';
$stmt->execute();
return $stmt;
}
//... TEM MAIS CÓDIGO
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Crie uma classe DAO
public function atualiza(LoginComum $l) {
return $this->query("UPDATE LOGIN SET log_senha = ? WHERE log_user = ?", $l->getSenha(), $l->getNroVezesAcessado(), $l->getUsuario());
}
public function busca($usuario) {
return $this->query("SELECT * FROM LOGIN where log_user = ?", $usuario);
}
public function remove($usuario) {
return $this->query("DELETE FROM LOGIN where log_user = ?", $usuario);
}
}
?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exemplo busca de dados com fetch()
$stmt = $this->prepare("SELECT * FROM LOGIN
where log_user = ?");
if ($stmt->execute(array($usuario))) {
while ($row = $stmt->fetch()) {
print_r($row);
}
}
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Alterando o controle • Para testar o método add, deixe o arquivo de controle clogin.php como abaixo:
<meta Content-Type="text/html" charset="utf-8">
<?php // controle/clogin.php
include_once '../modelo/mlogincomum.php';
include_once '../dao/logincomumdaomysql.php';
class cLogin{
private $msg;
function __construct() {
$login_comum = new LoginComum($_POST['usuario'], $_POST['senha']);
$loginComumDAO = new LoginComumDAOMySQL();
$stmt = $loginComumDAO->add($login_comum);
if($stmt->errorCode() == 0){
$this->msg = $login_comum->getUsuario(). " foi adicionado com sucesso";
}else{
$this->msg = $stmt->errorInfo()[2];
}
header("Location: ../visao/login.php?msg=$this->msg");
function __destruct() {
echo "Bye!"."<br>";
}
}
$clogin = new cLogin();//ou new cLogin
?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Alterando a visão <?php // visao/login.php
if(isset($_GET['msg'])){//imprime na visão a mensagem na url
echo $_REQUEST['msg']."<br>";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form method="post" action="../controle/clogin.php">
Usuário: <input type="text" name="usuario">
<br><br>
Senha: <input type="password" name="senha">
<input type="submit" value="Logar!">
</form>
</body>
</html>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Transação (ACID)
try {
$bd->beginTransaction();
$bd->exec(
"insert into staff (id, first, last) values
(23, 'Joe', 'Bloggs')");
$bd->commit();
} catch (Exception $e) {
$bd->rollBack();
echo "Failed: " . $e->getMessage();
}
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Encerrando uma conexão
Para encerrar uma conexão com o servidor de banco de dados basta atribuir null ao objeto PDO.
$bd = null;
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Stored Procedures
• Prepared statements também podem chamar uma stored procedure com parâmetros de entrada e saída.
<?php
$stmt=$bd->prepare ("CALL funcao(?)"); $stmt-> bindParam (1, $return_value, PDO::PARAM_STR, 4000); // executa a stored procedure
$stmt->execute(); print "procedure returned $return_value\n";
?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Drivers
Banco de dados Driver Banco de dados suportados
4D (PDO) PDO_4D 4D
CUBRID (PDO) PDO_CUBRID Cubrid
Firebird (PDO) PDO_FIREBIRD Firebird
IBM (PDO) PDO_IBM IBM DB2
Informix (PDO) PDO_INFORMIX IBM Informix Dynamic Server
MS SQL Server (PDO) PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
MS SQL Server (PDO) PDO_SQLSRV Microsoft SQL Server / SQL Azure
MySQL (PDO) PDO_MYSQL MySQL 3.x/4.x/5.x
ODBC and DB2 (PDO) PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
Oracle (PDO) PDO_OCI Oracle Call Interface
PostgreSQL (PDO) PDO_PGSQL PostgreSQL
SQLite (PDO) PDO_SQLITE SQLite 3 and SQLite 2
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Constantes pré-definidas
• Geral
• http://us2.php.net/manual/pt_BR/pdo.constants.php
• Do MySQL
• http://us2.php.net/manual/pt_BR/ref.pdo-mysql.php
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Segurança em PHP
• Gerar senha criptografada com password_hash() a partir
do PHP 5.5.0
• Características:
• Cria senhas usando algoritmos hashing fortes (one-way);
• Compatível com a função crypt();
• Atualmente suporta dois algoritmos:
• PASSWORD_DEFAULT: usa atualmente o algoritmo BCRYPT e pode
gerar senhas de tamanhos variáveis. Para armazenar no BD o
recomendável é colocar a senha gerada em um campo de 255
caracteres.
• PASSWORD_BCRYPT: gera um resultado padronizado com a função
crypt() usando hash com identificador "$2y$". O resultado será sempre
uma string de tamanho 60 ou Falso em caso de falha.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Segurança em PHP
• Opções suportadas:
• salt - programador fornece uma string para usar na
função. Isto irá substituir e evitar que uma string seja
gerada automaticamente. Se omitida, uma string
randômica será gerada para cada nova senha que é o
desejado.
• cost - o custo do algoritmo que deve ser usado. Se
omitido, o valor default 10 será usado. Dependendo do
hardware, um custo maior poderá ser considerado.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Segurança em PHP
• string password_hash ( string $password , i
nteger $algo [, array $options ] )
• password – O password do usuário
• algo - o algoritimo a ser usado na função
• Options – Um array assossiativo contendo opções: salt e
cost.
• Retorna o hash da senha, ou FALSE em caso de falha.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exemplo 1
<?php
/**
* Usa o algoritmo padrão
*/
echo password_hash("rasmuslerdorf", PASSWORD
_DEFAULT). "<br>";
?>
• Saída:
• $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7
KnEd1rVAGv3Fykk1a
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exemplo 2
/**
* Define o custo do algoritmo BCRYPT para 12 e o
salt é gerado randomicamente. Sempre gera 60
caracteres
*/
$options = [
cost => 12,
salt => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT,
$options). "<br />";
• Saída:
• $2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Não adianta muito um bom algoritmo
hash se o usuário... • Não deixe que os usuários criem senhas fracas.
Determine:
• Número mínimo de caracteres;
• Uso de caracteres especiais;
• Letras maiúsculas e minúsculas;
• Uso de números, etc.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Verificar senha
boolean password_verify ( string $password , string
$hash )
• password – a senha do usuário
• Hash – Uma hash criado por password_hash().
if (password_verify('rasmuslerdorf', $hash)) {
echo ‘Senha válida!';
} else {
echo ‘Senha inválida.';
}
password_hash() retorna algoritmo, custo e o salt. Portanto, toda a informação necessária para verificar a hash está incluída nela permitindo verificar a hash sem separar em campos separados no BD.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exercícios
• Utilize a função password_hash() para criar a hash da
senha do usuário antes de salvaguardar o registro no
banco de dados. Veja o resultado no banco de dados.
• Utilize a função password_verify() para verificar a
senha digitada pelo usuário.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Uma solução:
• Crie um método para comparar a senha e outro que gere
o hash da senha.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Uma solução:
• Na camada DAO altere onde é necessário definir o HASH
da senha. Neste caso, nas funções de adicionar e
atualizar.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Uma solução:
• Apenas testando no controle
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Escondendo o PHP (Segurança por
obscuridade) • Ao definir expose_php para off no seu arquivo php.ini,
você reduz a quantidade de informação disponível para
os hackers.
• Configurar o servidor web (por ex. Apache) para analisar
diferentes tipos de arquivo através do PHP. Ou com
diretivas no arquivo .htaccess, ou no arquivo de
configuração do apache.
• Ex: defina uma arquivo nomeado .htaccess e coloque este trecho
de código.
# Make all PHP code look like HTML
AddType application/x-httpd-php .htm .html
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Dicas de segurança
• Limite o poder dos usuários do seu banco ou de um usuário do Apache • Nunca atribua poderes de admin a usuários comuns
• Não use nos campos das tabelas do banco de dados o mesmo nome que o atributo “name” das tags HTML. Dica: use prefixos ou pós-fixos nos campos e nas tabelas.
• Cheque as variáveis recebidas de um formulário HTML • Ex.: Se a variável for do tipo inteiro, verifique se uma string foi
passada
• Não dê permissões totais de acesso a páginas aos usuários comuns por exemplo com comandos no linux. • Usando a diretiva open_basedir definida no php.ini você pode
controlar e restringir quais diretórios o PHP tem permissão de usar.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Dicas de segurança
• Estabeleça quando necessário conexões sobre SSL
(HTTPS = HTTP + SSL) para criptografar comunicações
cliente/servidor para aumentar a segurança.
• Ou use SSH para criptografar a conexão de rede entre
cliente e servidor remoto.
• Se uma dessa opções for usada, monitoramento do seu
tráfego e obtenção de informação sobre seu banco de
dados serão dificultados por um atacante.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exemplo de Injeção SQL por falta de
checagem de variável <?php
$offset = $argv[0]; // Sem validação de entrada!
$query = "SELECT id, name FROM products ORDER BY na
me LIMIT 20 OFFSET $offset;";
$result = pg_query($conexão, $query);
?>
• Usuários normais clicam nos links 'próxima' e 'anterior' onde $offset é codificado na URL. O script espera que o valor de $offset seja um inteiro. Se alguém tentar invadir acrescentando a forma codificada por urlencode() da URL seguinte:
Exemplo de ataque: 0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; --
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Correção do exemplo anterior
<?php settype($offset, 'integer'); $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"; // por favor perceba o %d na string de formato, usando %s seria inútil $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;", $offset); ?>
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exemplo 2
• Exemplo #1 Uso Perigoso de Variáveis
• <?php // remove um arquivo do diretório home do usuário... ou talvez // de outra pessoa? unlink ($evil_var); // Escreve registro do acesso... ou talvez uma entrada em /etc/passwd? fwrite ($fp, $evil_var); // Executa algo trivial... ou rm -rf *? system ($evil_var); exec ($evil_var); ?>
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Dicas de segurança
• Adicione aspas para cada valor não numérico que será passado para o banco de dados com as funções de caracteres de escape. Ex.:mysql_real_escape_string(). Ou funções addslashes() e str_replace()
• Não imprima qualquer informação específica do banco de dados, especialmente sobre o esquema, custe o que custar.
• Tome cuidado em relatar erros
• o estilo de um erro genérico do PHP indica que o sistema está rodando o PHP.
• O atacante pode explorar vulnerabilidades do back-end
• Dica: crie seu tratador de erros
• Desabilite display_errors no arquivo php.ini e defina o arquivo de registro usando a diretiva error_log
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Dicas de segurança
• O XAMPP avisa-o quando alguns problemas de
segurança ocorrem.
• Veja no menu segurança (security) em localhost/xampp
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Dicas
• Trabalhar com PHP em modo error_reporting (E_ALL)
também pode ajudar avisando sobre variáveis sendo
usadas antes de serem checadas ou inicializadas (então
você pode prevenir que dados incomuns sejam
operados).
• TESTAR
• Captcha
• Mantenha-se atualizado!
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Site para treinar e aprender alguns tipos
de ataque • http://www.dvwa.co.uk/
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Outros sites
• Conectando PHP ao MySQL:
http://us2.php.net/manual/pt_BR/ref.pdo-
mysql.connection.php
• http://us2.php.net/manual/pt_BR/class.pdostatement.php
• Gerar Senha segura:
http://br1.php.net/manual/en/function.password-hash.php
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Bootstrap
• Framework de front-end
• Características: • Estrutura simples, intuitiva e poderosa para o desenvolvimento
web mais rápido e mais fácil;
• Customizável;
• Responsível;
• Não é necessário ter grandes conhecimentos em CSS3.
• Algumas versões em 10/12/2013 • Globo Bootstrap - Versão 2.2.2 – (Utilizado neste curso)
• Bootstrap – Versões 2.3.2 (com alguns recursos novos em relação ao anterior) e 3.0.3 – (Mais recente, com mais recursos que o anterior)
Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Usando o Bootstrap
• Baixe ele em
http://globocom.github.io/bootstrap/assets/bootstrap.zip
• Extraia-o para a pasta de visao do projeto.
Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Usando o Bootstrap
• Adicione no arquivo de visão login.php as seguintes
diretivas para incluir o css e javascript.
Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Usando o Bootstrap
• Veja a diferença com e sem bootstrap respectivamente.
• É bem simples mudar a cor do botão, basta colocar a classe
na tag html que fará com que o botão por exemplo seja azul <input class="btn btn-primary" type="submit"
value="Logar!">
• Uma lista de classes disponíveis em CSS podem ser
encontradas em http://globocom.github.io/bootstrap/base-
css.html#buttons
Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia