Jump to content
fddsantos

SQL Injection

Recommended Posts

fddsantos

Boa tarde pessoal,

Gostava de fazer esta pergunta, Como posso combater os ataques de sql injection?

Obrigado pela atenção,

Fábio Santos


Lei de Lavoisier aplicada à Informática:Na Informática nada se compra, nada se cria! Tudo se copia!

Share this post


Link to post
Share on other sites
mjamado
Penso que a solução mais eficaz passa por usar prepared statements: http://php.net/manual/en/book.pdo.php

Não é a "mais eficaz", é a única que é eficaz (tirando não se usar SQL, de todo).


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
MoshMage

Aconselho a usar PDO. Estas funções não são 100% seguras

Erm.. é certo que fui vago; mas tu também podias elaborar x)

Tive agora no SO e aqui explica o "porque"; No entanto.. também existe um mysqli::prepare() portanto... qual é a grande diferença?

(é uma duvida legal, só agora é que li sobre PDO - ando a fazer a minha transação para OOP aos poucos)


If all Else fails, use Else If;

Share this post


Link to post
Share on other sites
mjamado
No entanto.. também existe um mysqli::prepare() portanto... qual é a grande diferença?

Desde que uses prepared statements, como o Rui Carlos disse lá atrás, é a mesma coisa; a única diferença é que PDO é multi-motor, enquanto do MySQLi é só para esse motor. Se tiveres a certeza absoluta que o motor de DB não vai mudar ao longo do ciclo de vida do projecto, podes usar a extensão específica do motor; senão, usa PDO, que é mais fácil mudar de motor mais tarde.

  • Vote 1

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
MoshMage

Desde que uses prepared statements, como o Rui Carlos disse lá atrás, é a mesma coisa; a única diferença é que PDO é multi-motor, enquanto do MySQLi é só para esse motor. Se tiveres a certeza absoluta que o motor de DB não vai mudar ao longo do ciclo de vida do projecto, podes usar a extensão específica do motor; senão, usa PDO, que é mais fácil mudar de motor mais tarde.

Ah! Por momentos temi pela minha protecção contra SQL Injection (se bem que ainda nao actualizei para o prepared statements)

Obrigado :)


If all Else fails, use Else If;

Share this post


Link to post
Share on other sites
brunoais

@mjamado

O uso do cast (int, float, etc... mas não string (n sei se há mais nesta categoria)) tb torna o dado completamente seguro para meter na DB.

Claro que estes que indiquei é limitado a números

Edited by brunoais

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mjamado
Claro que estes que indiquei é limitado a números

Generalidades vs. especificidades.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

Para quem precisar :

return (is_int($string) && $string >= 0) || ctype_digit($string);

Pq a parte:

$string >= 0

?

De qq modo, eu n uso isso.

Se se trata de dados que eu estou à espera que seja exclusivamente números inteiros uso diretamente o cast.

Edited by brunoais

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
yoda

Pq a parte:

$string >= 0

?

De qq modo, eu n uso isso.

Se se trata de dados que eu estou à espera que seja exclusivamente números inteiros uso diretamente o cast.

Essa parte ficou a mais, não reparei. Uso-a porque é bastante comum usar essa condição para verificar ID's.

Quando trabalhas com comandos que são inseridos pelo utilizador é melhor filtrar bem o input e condicionar o uso da aplicação àquilo que é o seu propósito, caso contrário torna-se mais fácil sofrer um ataque no site.

Share this post


Link to post
Share on other sites
taviroquai

Se o input for inválido (basta um parametro invalído), se possível, a aplicação nem devia chegar a efectuar a ligação à base de dados e devolver logo o erro, tentando efectuar o minimo de instruções, incluir o mínimo de ficheiros e consumir o minimo de recursos do sistema... mas nem sempre é possivel...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.