Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, venho estudando PHP mas nunca fiz algo grande, sempre algo para treinar, rodando localmente, mas agora apareceu uma oportunidade de desenvolver algo, mas estou um pouco com 'medo' das práticas que vinha fazendo estarem erradas ou então inseguras, uso o DB mysql, vou postar exemplos do que faço e alguém com mais experiência pode me dizer se estou fazendo algo que comprometa a segurança?
Para me conectar no banco eu utilizo:
mysql_connect("local","user","pass") or die (mysql_error());
mysql_select_db("db") or die (mysql_error());
Isso é seguro?
Nas outras página eu faço mais ou menos assim:
<tr><td>Nome</td><td><input type="text" name="txtName"/></td></tr>
<tr><td>Senha</td><td><input type="password" name="txtSenha"/></td></tr>
<tr><td><input type="submit" name="cmdCadastrar" value="Cadastrar"/></td></tr>
if(isset($_POST['cmdCadastrar'])){
include("conecta.php") //conecta.php = página com o código que foi postado acima
$nome = $_POST['txtName'];
$senha = $_POST['txtSenha'];
}
Tem como deixar isso mais seguro? Pois pelo pouquíssimo que entendo não acho que esta seguro.
Muito obrigado, vou olhar com calma.
Só acrescentando...
Para conectar com o banco utilize a classe PDO.
http://www.php.net/manual/pt_BR/book.pdo.php
Alguns links falando sobre segurança:
http://www.sitepoint.com/php-security-blunders-2/
http://www.ibm.com/developerworks/opensource/library/os-php-secure-apps/index.html
Só aconselho utilizar PDO se realmente precisar de recursos avançado e/ou caso sua aplicação possa mudar de SGBD, ou seja, invés de utilizar mysql, em uma certa altura você opte pelo postgresql, por exemplo. Sem isso, na minha opinião, PDO é "gordura extra".
$MySQL = array(
'servidor' => '127.0.0.1', // Endereço do servidor
'usuario' => 'root', // Usuário
'senha' => '', // Senha
'banco' => 'meu_site' // Nome do banco de dados
);
$MySQLi = new MySQLi($MySQL['servidor'], $MySQL['usuario'], $MySQL['senha'], $MySQL['banco']);
// Verifica se ocorreu um erro e exibe a mensagem de erro
if (mysqli_connect_errno())
trigger_error(mysqli_connect_error(), E_USER_ERROR);
Dei uma pesquisada e encontrei essa forma de conexão com o BD, isso esta seguro?
O que fica armazenado em arquivos PHP, normalmente está seguro. O problema são as entradas que o usuário fornece. Com isso que você tem que tomar cuidado.
A única exceção à regra é quando há falhas no próprio interpretador PHP, nesse caso, a opção é trocar a versão.
>
O que fica armazenado em arquivos PHP, normalmente está seguro. O problema são as entradas que o usuário fornece. Com isso que você tem que tomar cuidado.
A única exceção à regra é quando há falhas no próprio interpretador PHP, nesse caso, a opção é trocar a versão.
Muito obrigado Henrique, clareou muitas dúvidas que eu tinha.
<?php
// Conecta ao banco de dados
$mysqli = new mysqli('127.0.0.1', 'usuario', 'senha', 'meusite');
// Verifica se ocorreu algum erro
if (mysqli_connect_errno()) {
die('Não foi possível conectar-se ao banco de dados: ' . mysqli_connect_error());
exit();
}
// "Hoje" em formato SQL
$data = date('Y-m-d');
// Prepara uma consulta SQL
if ($sql = $mysqli->prepare("SELECT id, titulo, link FROM noticias WHERE ativa = 1 AND data <= ?")) {
// Atribui valores às variáveis da consulta
$sql->bind_param('s', $data); // Coloca o valor de $data no lugar da primeira interrogação (?)
// Executa a consulta
$sql->execute();
// Atribui o resultado encontrado a variáveis
$sql->bind_result($id, $titulo, $link);
// Para cada resultado encontrado...
while ($sql->fetch()) {
// Exibe um link com a notícia
echo '<a href="'. $link .'" title="'. $titulo .'">'. $titulo .'</a>';
echo '<br />';// Total de notícias
echo '<br />Total de notícias: ' . $sql->num_rows;
// Fecha a consulta
$sql->close();
}
// Fecha a conexão com o banco de dados
$mysqli->close();
?>
Achei esse código acima e consegui entender o que foi feito, mas não consegui achar exemplos de como salvar o valor digitado em um input type usando prepared statements, eu posso salvar igual estava fazendo antes $nome = $_POST['txtNome'], e depois passar pela prepared statements?
Não está bom, mas poderia estar pior...
A primeira coisa é abandonar a API mysql_*... Ela será descontinuada. Se pretende continuar só com MySQL, utilize a versão melhorada MySQLi.
Um reforço grande à segurança no que diz respeito a banco de dados é o uso de Prepared Statements (pesquise sobre). A extensão MySQLi possui todo o suporte necessário para se realizar consultas através de prepared statements.
Aqui é problema...
Você NUNCA deve pegar dados do usuário sem passar por um filtro antes. Nesse caso em específico, sem utilizar os prepared statements que citei, você abre uma porta para invasões.
Suponha que sua consulta para efetuar o login seja a seguinte:
SELECT * FROM users WHERE username = '$nome' AND password = '$senha'
Algum espertão pode tentar fazer login na sua aplicação dessa forma:
Usuário: ' OR 1 = 1;
Senha: blabla
Então a sua consulta se traduziria nisso:
SELECT * FROM users WHERE username = '' OR 1 = 1; AND password = 'blabla'
Como o PHP não possui suporte a múltiplas queries por consulta, tudo o que vem depois do ';' será ignorado.
Como resultado da consulta, você vai obter TODAS as linhas da tabela, pois 1 = 1 sempre.
A essa técnica, dá-se o nome de SQL Injection.
Começando por aí, está num bom caminho...