Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,tudo bem ?,tive uma dúvida.
Tava codando no computador o acesso ao banco de dados
$id_produto = $_GET['id'];
$sql = "SELECT imagem FROM `imagens` where id_produto = '$id_produto'";
$result = $mysqli->query($sql);
Porém este metodo é sujeito a mysql injection,então decidi fazer desta forma:
$id_produto = $_GET['id'];
$sql = $mysqli->prepare('SELECT imagem FROM imagens WHERE id_produto = ?');
$sql->bind_param('s',$id_produto);
$sql->execute();
Porém,no servidor,quando eu Upo,o segundo método não funciona,não sei se é porcausa da versão do Mysql que é 5.1.61 e no meu computador é 5.16.17
Como irei fazer o código para o site,usando um código seguro igual ao código atualizado acima ?
Agradeço desde já !
>
Será que não é 'culpa' php.ini?
Pois na recomendação não fala por nenhum momento que o Mysql tem restrição de versão para utilizar PDO
http://php.net/manual/en/pdo.installation.php
Se você habilitar os erros no ambiente de 'produção' oq aparece no trecho do bind?
agora sobre evitar um Injection no seu exemplo sem utilizar o pdo.
é só filtrar por números a entrada.
<?php
function getOnlyNumber($input){
// $input = "222.333.666.38";
$pattern = '/[^\d]/';
$replacement = ''; //Substitui
return preg_replace($pattern, $replacement, $input);
}
$id = getOnlyNumber($_GET);
//"SELECT INTO ...WHERE id = '$id' "
Olá,obrigado pela ajuda,porém não retorna nenhum erro.
não posso fazer do segundo método,pois o id também tem letras,ex: 2BBCC
Você instanciou a class mysqli antes de chamar o objeto ? no seu param, no lugar do "S" seria "i" pois você está tratando como string. O correto é como inteiro. Já que se trata de números
Você instanciou a class mysqli antes de chamar o objeto ? no seu param, no lugar do "S" seria "i" pois você está tratando como string. O correto é como inteiro. Já que se trata de números
Mas o id do produto é uma string,por exemplo: 1CAB,2CAB,3CCCCA e etc...
Eu fiquei em dúvida tambem sobre isso @saidmrn
Mas depois q me liguei.
Oq o @Alaerte está falando é.
$sql->bind_param('s',$id_produto);
o 's' significa string
mas até ai está realmente certo já que você está trabalhando com uma id composta por número + letra.
De qualquer forma você pode adaptar a expressão regular que te dei como exemplo para pegar só
Letra + Número.
Assim já uma protegida ^_^ inicial se o pdo não rolar.
http://php.net/manual/en/function.preg-replace.php
Ou então utilizar funções para proteção.
:htmlspecialchars, addslashes e/ou htmlentities.
Lembrando que ataques são reais inclusive no imaster um usuario sofreu esses dias com uma invasão de XSS.
Então vale a pena investir um tempo na proteção de seu sistema.
Abraços
>
Eu fiquei em dúvida tambem sobre isso @saidmrn
Mas depois q me liguei.
Oq o @Alaerte está falando é.
$sql->bind_param('s',$id_produto);
o 's' significa string
mas até ai está realmente certo já que você está trabalhando com uma id composta por número + letra.
De qualquer forma você pode adaptar a expressão regular que te dei como exemplo para pegar só
Letra + Número.
Assim já uma protegida ^_^ inicial se o pdo não rolar.
http://php.net/manual/en/function.preg-replace.php
Ou então utilizar funções para proteção.
:htmlspecialchars, addslashes e/ou htmlentities.
Lembrando que ataques são reais inclusive no imaster um usuario sofreu esses dias com uma invasão de XSS.
Então vale a pena investir um tempo na proteção de seu sistema.
Abraços
Olá,irei pesquisar mais sobre estes métodos,porém ainda estou na dúvida,por que será que a 2 opção não está pegando no meu host ?
Ok vamos tentar descobrir.
Inicialmente dentro da produção o modulo do PDO está ativo?
Para verificar/confirmar suba um arquivo info.php com o seguinte conteúdo:
<?php
phpinfo();
E veja se a Lib está correta.
Você realmente ativou os erros?
na execução e tentou utilizar a parte que executa o pdo?
ini_set('display_errors', true);
error_reporting(E_ALL);Olá,sim ja coloquei para exibir os erros.
aparentemente,o módulo está instalado.
http://bigioinc.com.br/info.php
Nenhuma página que usa essa consulta está funcionando,sendo que no local todas funcionam.
Vish.
Ai não sei.
o arquivo de conexão new PDO('mysql:host=... está correto?
O banco de dados na produção também está correto?
Quando você passa para o mysqli ele funciona no ambiente produção? (essa resposta mata as duas acima u.u)
Sim funciona tudo perfeitamente.
$mysqli= mysqli_connect('localhost', 'root', '','banco');
Tenta algo simples no PDO.
pdotest.php:
<?php
try {
$user = 'root';
$pass = '';
$dbh = new PDO('mysql:host=localhost;dbname=banco', $user, $pass);
foreach($dbh->query('SELECT * from pessoa') as $row) {
print_r($row);
}
$dbh = null; print "Error!: " . $e->getMessage() . "<br/>";
die();
}Esse seu código funcionou em ambos servidores.porém não conheco muito PDO.
então teria que continuar com o mysqli.
Este codigo funcionando no servidor,qual será o problema do outro então ? :mellow:
@edit
Para registrar também não está pegando e estou utilizando:
$sql = $mysqli->prepare(" INSERT INTO clientes (nome,email,senha,endereco,pais) VALUES (?,?,?,?,?)");
$sql->bind_param("sssss", $nome,$email,$password,$endereco,$pais);
echo "registro concluido";
$sql->execute();
e no local funciona
Nossa me confundi legal haha
to lendo bind e imaginando só PDO por isso falei dele.
Enfim testa esse aqui :
<?php
$mysqli = new mysqli('localhost', 'root', '', 'banco');
/ check connection /
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = $mysqli->prepare('SELECT imagem FROM imagens WHERE id_produto = ?');
var_dump($mysqli);
$id_produto = '2BBCC'; //Precisa criar a variavel fora!
$stmt->bind_param('s', $nm);
$stmt->execute();
O legal desse var_dump é q ele exibe o ultimo erro.Ex forcei uma tabela q não existia ele acabou trazendo:
["error"]=>
string(32) "Table 'banco.pessoas' doesn't exist"
O seu código não funcionou no local
object(mysqli)[1]
public 'affected_rows' => null
public 'client_info' => null
public 'client_version' => null
public 'connect_errno' => null
public 'connect_error' => null
public 'errno' => null
public 'error' => null
public 'error_list' => null
public 'field_count' => null
public 'host_info' => null
public 'info' => null
public 'insert_id' => null
public 'server_info' => null
public 'server_version' => null
public 'stat' => null
public 'sqlstate' => null
public 'protocol_version' => null
public 'thread_id' => null
public 'warning_count' => null
@EDIT
já no servidor apresentou isso:
object(mysqli)#1 (19) { ["affected_rows"]=> int(-1) ["client_info"]=> string(15) "10.0.24-MariaDB" ["client_version"]=> int(100024) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(15) "10.0.20-MariaDB" ["server_version"]=> int(100020) ["stat"]=> string(159) "Uptime: 6725713 Threads: 34 Questions: 9069833464 Slow queries: 2248 Opens: 36415538 Flush tables: 1 Open tables: 29999 Queries per second avg: 1348.531" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(214732251) ["warning_count"]=> int(0) }
Testei o código que cria a conta do usuário.
$sql = $mysqli->prepare(" INSERT INTO clientes (nome,email,senha,endereco,pais) VALUES (?,?,?,?,?)");
$sql->bind_param("sssss", $nome,$email,$password,$endereco,$pais);
echo "registro concluido";
$sql->execute();
e ele está inserindo normalmente,localmente e no servidor
Sobre o code deixei ele tabulado, ajuda na visualização:
object(mysqli)#1 (19) {
["affected_rows"]=> int(-1)
["client_info"]=> string(15) "10.0.24-MariaDB"
["client_version"]=> int(100024)
["connect_errno"]=> int(0)
["connect_error"]=> NULL
["errno"]=> int(0)
["error"]=> string(0) ""
["error_list"]=> array(0) { }
["field_count"]=> int(0)
["host_info"]=> string(25) "Localhost via UNIX socket"
["info"]=> NULL
["insert_id"]=> int(0)
["server_info"]=> string(15) "10.0.20-MariaDB"
["server_version"]=> int(100020)
["stat"]=> string(159) "Uptime: 6725713 Threads: 34 Questions: 9069833464 Slow queries: 2248 Opens: 36415538 Flush tables: 1 Open tables: 29999 Queries per second avg: 1348.531"
["sqlstate"]=> string(5) "00000"
["protocol_version"]=> int(10)
["thread_id"]=> int(214732251)
["warning_count"]=> int(0)
}
Opá.
se o insert rola já anulou qualquer possibilidade de ser problemas.
Parto sempre da premissa que a gente está fazendo alguma merda e nunca é o servidor HSAUHASUAS
De forma simplificada como está o seu Select dinâmico?
Olá,deste jeito,está funcionando tanto em localhost,tanto no servidor:
$id_produto = $_GET['id'];
$sql = "SELECT imagem FROM `imagens` where id_produto = '$id_produto'";
$result = $mysqli->query($sql);
echo $mysqli->error;
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
}
}
Deste modo,funciona apenas no local:
$id_produto = $_GET['id'];
$sql = $mysqli->prepare('SELECT imagem FROM imagens WHERE id_produto = ?');
$sql->bind_param('s',$id_produto);
$sql->execute();
$result = $sql->get_result();
///////////////////////////////////////////////////////////////////////////////////
$sql = $mysqli->prepare('SELECT * FROM `produtos` where idioma = ? and id_produto = ?');
$sql->bind_param('is',$idioma,$id_produto);
$sql->execute();
$result = $sql->get_result();
echo $mysqli->error;
@EDIT
Se for inserido um ID errado,no local ele mostra todos os erros,porém no servidor ele não retorna nadinha
Não aparecia nenhum erro na página,mas fui olhar o html e encontrei:
<b>Fatal error</b>: Uncaught Error: Call to undefined method mysqli_stmt::get_result() in /home/u827835329/public_html/produto.php:201
Stack trace:
#0 {main}
thrown in <b>/home/u827835329/public_html/produto.php</b> on line <b>201</b><br />Nem sei se tu ta acordado ainda haha
Eu nunca tinha usado o mysql ai aproveitei e tava brincando com ele pra entender melhor.
Aqui deu certo com um exemplo, ai adaptei um banco rapidinho pra suas variáveis.
Da uma testada e ve se funciona no seu serv.
<?php
/*
create database banco;
use banco;
create table imagens(
id_produto char(5) PRIMARY KEY
,imagem VARCHAR(250) NOT NULL
)Engine=InnoDb;
INSERT INTO imagens (id_produto, imagem) values ('2BBCC', '123.jpg');
*/
$mysqli = new mysqli('localhost', 'root', '', 'banco');
// check connection printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql = 'SELECT id_produto, imagem FROM `imagens` where id_produto = ?';
/ Prepare statement /
$stmt = $mysqli->prepare($sql);
if($stmt === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $mysqli->errno . ' ' . $mysqli->error, E_USER_ERROR);
}
$id_produto = '2BBCC';
$stmt->bind_param('s', $id_produto);
/ Execute statement /
$stmt->execute();
/ Fetch result and be ready or object or array /
$res = $stmt->get_result();
while($row = $res->fetch_object()) {
echo $row->id_produto;
echo '<br />';
echo $row->imagem;
echo '<hr />';
}: Uncaught Error: Call to undefined method mysqli_stmt::get_result() in /home/u827835329/public_html/produto.php:210
Stack trace:
#0 {main}
thrown in
O problema é que não tem o plugin do mysqli do get_result,então teremos que usar outro método para ler,irei tentar com bind_result
Consegui fazer funcionar:
Como estava faltando mysqlnd Driver ,tive que usar o bind_result
$sql = 'SELECT imagem FROM `imagens` where id_produto = ?';
/ Prepare statement /
$stmt = $mysqli->prepare($sql);
if($stmt === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $mysqli->errno . ' ' . $mysqli->error, E_USER_ERROR);
}
$id_produto = '2BBCC';
$stmt->bind_param('s', $id_produto);
/ Execute statement /
$stmt->execute();
/ Fetch result to array /
$stmt->bind_result($imagem);
$i = 0;
while($stmt->fetch()) {
.....
Pra ler as variaveis,é so usar $imagem e nao mais $row.
Usei o seu código e o adaptei e funcionou nos 2
MUITO OBRIGADO,não sei como te agradecer,sem sua ajuda não teria chegado até aqui !
Toma uns likes ai kkk boa noite !
Aewwww \o/
Faloww posso dormir em paz agora haha
Boa noite!
Será que não é 'culpa' php.ini?
Pois na recomendação não fala por nenhum momento que o Mysql tem restrição de versão para utilizar PDO
http://php.net/manual/en/pdo.installation.php
Se você habilitar os erros no ambiente de 'produção' oq aparece no trecho do bind?
agora sobre evitar um Injection no seu exemplo sem utilizar o pdo.
é só filtrar por números a entrada.