Provendo dados em um servidor PostgreSQL através do Apache e PHP

Aprenda a configurar um serviço HTTP com suporte a PHP e acesso a bancos de dados no PostgreSQL.

[ Hits: 25.135 ]

Por: Stefano Fontes em 10/11/2010


Criando um banco de dados de teste



Considerando que você já possui um servidor PostgreSQL corretamente instalado, configurado e funcionando em seu sistema, e também que você possui no mínimo algumas noções sobre SQL e sobre o PostgreSQL, crie o seguinte banco de dados de teste, por exemplo através do "psql", o terminal interativo do PostgreSQL:

# createdb teste

Saída do comando:

CREATE DATABASE

Entre a seguir no banco de dados "teste" recém criado:

# psql teste

No terminal interativo, digite a seguinte linha de comandos SQL:

teste=# create table teste (nome varchar(30), endereco varchar(30), telefone varchar(30));

Saída do comando:

CREATE TABLE

A sequência de comandos acima criou o banco de dados "teste"; a seguir entramos neste banco de dados através do terminal interativo "psql"; finalmente criamos dentro do banco de dados a tabela "teste", contendo os campos "nome", "endereco" e "telefone", todos do tipo "varchar" de até 30 caracteres, conforme demonstrado abaixo:

teste=# \d teste
             Table "public.teste"
  Column  |         Type          | Modifiers 
----------+-----------------------+-----------
 nome     | character varying(30) | 
 endereco | character varying(30) | 
 telefone | character varying(30) |

A seguir insira os seguintes dados na tabela recém criada, através dos comandos SQL:

teste=# insert into teste values ('Pedro', 'Rua Um 256', '3256-7785');

Saída do comando:

INSERT 17385 1

teste=# insert into teste values ('Paulo', 'Rua Dois 344', '3256-9423');

Saída do comando:

INSERT 17386 1

teste=# insert into teste values ('Maria', 'Rua Quatro 52', '3256-4982');

Saída do comando:

INSERT 17387 1

Verifique agora o conteúdo de sua tabela:

teste=# select * from teste;

Saída do comando:
 nome  |   endereco    | telefone  
-------+---------------+-----------
 Pedro | Rua Um 256    | 3256-7785
 Paulo | Rua Dois 344  | 3256-9423
 Maria | Rua Quatro 52 | 3256-4982
(3 rows)

Para um teste mais efetivo, crie uma senha criptografada para o usuário do banco de dados, que por padrão é o usuário "postgres" na instalação (substitua a palavra 'senha' por uma boa senha aleatória com números e letras):

teste=# alter user postgres with encrypted password 'senha';

Saída do comando:

ALTER USER

Você poderá verificar a alteração realizada acima através do seguinte comando:

teste=# select * from pg_shadow;

Saída do comando:
 usename  | usesysid | usecreatedb | usesuper | usecatupd | 
 passwd | valuntil | useconfig 

 postgres |        1 | t           | t        | t         | 
 md5df745e1d739eeb8388a86357549c809f |          | 
(1 row)

A seguir modifique o seu pg_hba.conf como segue:

# vi pg_hba.conf

# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD

# "local" is for Unix domain socket connections only
local   all         all                              md5
# IPv4 local connections:
host    all         all         127.0.0.1/32            md5

Salve e saia do arquivo.

Observe que:

1) Da forma acima, configuramos o método de autenticação por senha criptografada (md5), para todos os acessos locais na própria máquina, a todos os bancos de dados e por todos os usuários cadastrados no PostgreSQL; esta é uma medida de segurança interessante, uma vez que estamos considerando que o servidor de bancos de dados está instalado na mesma máquina do servidor Apache/PHP, e mesmo que o mesmo seja invadido remotamente, o acesso local ao servidor de bancos de dados estará protegido por senha criptografada;

2) Caso você deseje instalar o Apache/PHP em uma máquina diferente daquela onde está instalado o servidor de bancos de dados, por exemplo, em uma DMZ na rede local ("demitarized zone" - máquinas que se encontram diretamente expostas à Internet, sem proteção de "firewall"), você deverá adicionar a seguinte linha no arquivo acima (pg_hba.conf), substituindo o endereço abaixo utilizado pelo de sua rede local, se for outro:

host    all         all         192.168.1.0/24        md5

Neste caso, ajuste também as configurações de seu "firewall", para que ele permita o acesso da máquina localizada na "DMZ" ao servidor de bancos de dados, que provavelmente encontra-se "atrás" do "firewall".

Note que, neste caso, você deverá ter a mesma versão do PostgreSQL instalada na máquina do Apache/PHP, apenas para efeito de compilação/instalação do PHP, como já explicado anteriormente; ou, de alguma forma, você deverá gerar ou obter o pacote do PHP para sua distribuição, com o suporte ao PostgreSQL já compilado.

3) Embora o código PHP não seja exibido no "browser" da máquina cliente, quando de sua execução (o PHP processa o "script" no servidor e só envia o resultado para o cliente), é conveniente tomar todas as medidas de segurança visando proteger o conteúdo do "script" em PHP que fará o acesso ao banco de dados (em nosso caso /var/www/htdocs/teste.php), como por exemplo, através do ajuste de suas permissões de leitura e escrita, já que o mesmo conterá a senha de acesso ao banco de dados.

Além disso, é conveniente que você consulte os manuais do Apache, PHP, PostgreSQL e "firewall", se houver, visando aumentar sua segurança contra acessos não autorizados, invasivos e potencialmente danosos.

Finalmente, faça o servidor PostgreSQL reler o arquivo de configuração:

/usr/lib/postgresql/bin/pg_ctl reload -D /var/lib/postgres/data

Saída do comando:

postmaster successfully signaled

Para fazer um teste de autenticação, tente o acesso através do "psql" através de outra máquina na rede:

psql -h [nome_do_servidor] -d teste -U postgres
Password: (entre com a senha, que NÃO será mostrada na tela)

Se tudo der certo, você verá a seguir a seguinte mensagem, e após o "prompt" do "psql":
Welcome to psql 8.0.24, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

teste=#

Ou seja, seu banco de dados de teste está pronto para ser acessado através do PHP com autenticação através de senha criptografada, e podemos passar agora à próxima etapa.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Iniciando
   3. Testando
   4. Criando um banco de dados de teste
   5. Acessando o banco de dados
   6. Conclusão
Outros artigos deste autor

Configurando disquete e pendrive para boot sem suporte na BIOS

Criando um repositório criptografado de dados com Cryptsetup (dm-crypt) sem (re)particionamento do HD

Leitura recomendada

Armazenando datas de uma outra forma

PHP com suporte ao MS SQL Server 7

PDO - Introdução e conceitos

Executando comandos DML em base de dados MySQL através do Eclipse PHP (Bônus: Temas e Fontes no Eclipse)

Abordagem exemplificada à Orientação a Objetos com PHP

  
Comentários
[1] Comentário enviado por jcb em 19/11/2010 - 00:22h

schaf , show de bola seu artigo ...
porém, no arquivo teste.php na linha 16 ($linhas = pg_numrows($result);) só tem um erro ae, que o certo é pg_num_rows.
Abs

[2] Comentário enviado por schaf em 26/11/2010 - 12:40h

Prezado jcb:

Muito grato pelo seu comentário.
Entretanto, a correção, por você (muito bem) observada, foi mencionada por mim no artigo, logo abaixo do código do teste.php, e deve-se ao fato de diferença de versões do PHP utilizadas.
Para maior esclarecimento reproduzo abaixo o referido trecho do artigo:

"Observação importante: Como utilizei a versão 4.3.10-22 do PHP, as funções acima pg_exec, pg_numrows e pg_freeresult aqui possuem estes nomes; entretanto, os nomes atuais destas funções são respectivamente: pg_query, pg_num_rows e pg_free_result; portanto se você estiver utilizando uma versão mais recente do PHP faça estas substituições."

Muito grato pela contribuição!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts