Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho duas dúvidas. O bind_param do MySQLi me deixa preparado contra SQL Injection? Porque antes para proteger meus sistemas eu usava o seguinte método:
public function escapeAll ($value) {
if (is_array($value)) {
foreach ($value as $x => $nvl)
$value[$x] = $this->escapeAll($nvl);
}
elseif (is_string($value)) {
$value = addslashes(htmlentities($value));
}
return $value;
}
E outra dúvida, já que eu estou usando o MySQLi me recomendaram abstrair o SQL. Bom, realmente fica mais fácil, e mais "bonito" um código PHP onde uma query não aparece descaradamente. Aí por exemplo, para a cláusula WHERE eu criei o seguinte método.
public function WHERE ($fields, $seps="and") {
$size = count($fields);
$qry = "WHERE";
$x = 0;
$aon = is_array($seps);
foreach ($fields as $value => $operator) {
if ($x == ($size-1) && !$aon)
$seps = NULL;
$add = NULL;
if (substr($operator, -1, 1) == ")") {
$add = ")";
$operator = substr($operator, 0, -1);
}
$qry .= " ".$value.$operator."?".$add." ".($aon ? $seps[$x] : $seps);
$x++;
}
return $qry;
}
/*
WHERE:
Monta cláusula WHERE.
Parâmetro 1:
Array com chaves sendo os campos e valores sendo os operadores. Suporta encadeamento de valores. Exemplo: array (
"(campo1" => "="
"campo2" => ">)"
);
Resultará numa query "WHERE (campo1=? and campo2>?)".
Parâmetro 2:
Separador, pode ser uma string para um único separador, ou um array especificando cada separador para cada par de campos.
Retorno:
Cláusula WHERE.
*/
Mas em questão de desempenho, mesmo que afete apenas alguns microsegundos, perde para digitar a query diretamente?
Porque o que seria mais útil nisso, seria por exemplo, onde tenho um método capaz de receber 3 valores. Sendo que todos eles são opcionais para montar a cláusula WHERE. Por exemplo: campo1, campo2 e campo3.
É claro, tem a vantagem de abstração do SQL, mas de verdade, em um sistema que eu tenho 100% de certeza que não vou migrar, não vejo vantagem em abstrair, é claro, à não ser que não afete o desempenho.
Gente, a minoria dos injections são feitos em aspas.
Não pretendo usar PDO amigo. Minha dúvida é referente ao bind_param do MySQLi. Concordo Andrey, mas essa minoria existe né.
>
Gente, a minoria dos injections são feitos em aspas.
E a maioria é feito como?
Falou!
Creio que ele esteja se referindo à outras Injections, como PHP injection por exemplo. Mas foi uma boa pergunta, e a maioria?
Tem vários meios, com codificação base64, eval .. entre outros tipos, até mesmo cast direto na query
Poderia me dar um exemplo de algum, por exemplo o base64. Mas tirando esta parte, e quanto a minha segunda dúvida?
Olá, venho aqui recomendar o uso da classe PDO4You, a qual estou utilizando a um bom tempo atrás e tem se tornado a base dos meus projetos.
Para quem se interessar, possui um repositório no github para poder baixar e utilizar em suas aplicações, ou simplesmente acompanhar e/ou compartilhar.
Segue link: https://bitly.com/PDO4You
Sugestões ou críticas, sempre são bem vindas e ajudam a tornar esta classe ainda melhor para benefício de todos e assim seja até quando o PHP existir. =D
Abraços.
Ainda não baixei, mas... Qual seria a vantagem dessa PDO4You em relação à PDO?
Use o binParam da classe PDO do proprio PHP.