Segurança em PHP

xuxaki

Power Member
Trabalho a pouco tempo com php, e surgiram-se algumas dúvidas...

Já tenho tudo a funcionar no site que estou a fazer, mas preocupa-me a questão da segurança, já que os dados de acesso a base de dados estão explicitamente guardados no servidor...

Eu sei que o php não deixa ver o código fonte, apenas o html final, etc, mas questiono-me se algum "hacker" mais teimoso não consiga, com relativa facilidade, sacar-me esses ficheiros?!

Há algo que possa fazer para prevenir este tipo de situação?
 
Trabalho a pouco tempo com php, e surgiram-se algumas dúvidas...

Já tenho tudo a funcionar no site que estou a fazer, mas preocupa-me a questão da segurança, já que os dados de acesso a base de dados estão explicitamente guardados no servidor...

Eu sei que o php não deixa ver o código fonte, apenas o html final, etc, mas questiono-me se algum "hacker" mais teimoso não consiga, com relativa facilidade, sacar-me esses ficheiros?!

Há algo que possa fazer para prevenir este tipo de situação?


claro que consegue, basta teres alguma coisa mal programada, consegue acederte ás pastas todas do servidor e sacar e ver os ficheiros :)
 
.php não pode ser acedido, por url.
se tiver num servidor, ele vai levar sempre parse.
Em segurança, não há "sempres". A falha mais grave de segurança é a falsa sensação de segurança :)
Por exemplo, se queres proteger a pass da BD, podes po-la num ficheiro fora da web root, com as devidas permissões para ser lido apenas por um script do estilo "utils" que centraliza o acesso à BD. Sempre que acedes à BD deves usar esse utils. Desta forma, mesmo que o apache se passe (que é pouco provável, mas possível), o ficheiro com a pass estará protegido, nao podendo ser obtido por URL directo.
Mas preocupa-te antes com os ataques por XSS, SQL-Inj, etc, etc. Ataca as questões de segurança por ordem de maior probabilidade do ataque respectivo.
 
.php não pode ser acedido, por url.
se tiver num servidor, ele vai levar sempre parse.


Claro que pode ser acedido, basta ele ter um include por url o ácaro mete-lhe uma cmd e têm acesso ao servidor todo.

Isto por php-injection, mas milhentos métodos de atacar uma pagina.

O melhor mesmo é nunca usar métodos de navegação do género http://pagina.com/index.php?id=homepage

E todas as variáveis que vêm do utilizador, tipo de formulários e assim devem levar um Clean, para não serem lidos caracteres especiais.
 
então alguém me pode dar um exemplo de como posso configurar isso?

krunch, a tua ideia pareceu-me interessante, mas sinceramente não estou a ver como a por em prática :007:
 
um exemplo (que é usado no Joomla e que eu aproveitei para a minha PAT)

imagina que tens um site que é sempre acedido pelo index.php, e depois este ficheiro é que chama o resto dos ficheiros para mostrar o site. deste modo o unico ficheiro a que o utilizador precisa de ter acesso directo é o index.php

então no inicio dele pões:

Código:
define(VALID_ACESS, 1);

isto define uma constante chamada VALID_ACESS.
nos outros ficheiros PHP começas sempre por pôr:

Código:
defined(VALID_ACESS) or die("Não tem permissões para aceder a esta página")

repara que aqui e defineD, e não define. esta verifica se a constante VALID_ACESS existe. ela só irá existir se tiver sido o index.php a ser executado em primeiro lugar (e a fazer include ao ficheiro em questão)

se um utilizador tentar aceder directamente a outro ficheiro, por exemplo, o login.php, essa constante não vai estar definida e vai receber a mensagem do die()

isto é uma maneira, mas não precisas necessariamente de ter assim. podes só por esta protecção no ficheiro que tenha as coisas importantes (dados acesso à base de dados, funções importantes, etc)
 
então alguém me pode dar um exemplo de como posso configurar isso?

krunch, a tua ideia pareceu-me interessante, mas sinceramente não estou a ver como a por em prática :007:
Ha imensos sites com tutoriais. Googla :)
Resumindo:
Todos os teus *.php que acedem a dados devem fazer require de um utils.php.
No utils.php é tens o codigo de acesso à BD.
Num ficheiro tipo ~/secreto tens um .php com uma variavel $pass="123";
O utils.php faz require do php com a pass. Assim a pass está guardada apenas num sitio, em vez de estar replicada em imensos ficheiros "duvidosos".
Valida as permissoes dos ficheiros, pondo no minimo possivel.

Mas, tal como o masterArt disse, um ataque por xss pode lixar-te este esquema todo :D
Ataca esta questão depois de protegeres o codigo contra os outros tipos de ataques...
 
um exemplo (que é usado no Joomla e que eu aproveitei para a minha PAT)

imagina que tens um site que é sempre acedido pelo index.php, e depois este ficheiro é que chama o resto dos ficheiros para mostrar o site. deste modo o unico ficheiro a que o utilizador precisa de ter acesso directo é o index.php

então no inicio dele pões:

Código:
define(VALID_ACESS, 1);
isto define uma constante chamada VALID_ACESS.
nos outros ficheiros PHP começas sempre por pôr:

Código:
defined(VALID_ACESS) or die("Não tem permissões para aceder a esta página")
repara que aqui e defineD, e não define. esta verifica se a constante VALID_ACESS existe. ela só irá existir se tiver sido o index.php a ser executado em primeiro lugar (e a fazer include ao ficheiro em questão)

se um utilizador tentar aceder directamente a outro ficheiro, por exemplo, o login.php, essa constante não vai estar definida e vai receber a mensagem do die()

isto é uma maneira, mas não precisas necessariamente de ter assim. podes só por esta protecção no ficheiro que tenha as coisas importantes (dados acesso à base de dados, funções importantes, etc)

Boa dica ;)

Existem milhares de defines nessas frameworks um bocado estranhas, essa é uma das bacanas

obrigado por partilhares!

cumps:002:
 
Boas!
Estou a tentar por em pratica a técnica do define e defined, mas não percebo porquê obtenho sempre a mensagem do die ("não tem permissões para ver a página"), mesmo quando acedo através do index.php!

Eu tenho então logo no inicio do index.php (depois do header do html):
Código:
<?php define('ACESSO', 1); ?>
depois tenho a verificação da opção, ou seja:
Código:
if($_GET['option'] == "admin"){
include('.../admin.php');
}
e logo no inicio do admin.php tenho:
Código:
<?php defined('ACESSO') OR die("Não tem permissões para aceder a esta página!"); ?>
Mas vai sempre para o die! Alguém me sabe dizer porquê?
 
tira as pelicas no ACESSO (todos eles). isso não é texto, é uma constante, por isso não leva pelicas/aspas

o primeiro define convém que fique com as pelicas, senão dá um notice indicando que está a tentar redefinir uma constante. o define acaba por funcionar porque ainda não estava atribuido valor mas de qualquer maneira é mais correcto usar as pelicas na chamada do define.
 
Back
Topo