1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Rede social - que cuidados de segurança tomar?

Discussão em 'Web Development' iniciada por Kayvlim, 31 de Agosto de 2007. (Respostas: 6; Visualizações: 1241)

  1. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Boas!

    Penso que todos sabem o que é uma Rede Social. Se não sabem, é simples: hi5, Orkut, MySpace, ...

    Todas estas redes sofreram (graves) falhas de segurança ao longo do tempo. Então o hi5, nem se fala. Ainda hoje está passível de muitas falhas que deixam uma pessoa simplesmente parva.

    Como ainda estou bastante "verde" em web development (só comecei a aprender PHP e MySQL há pouco mais de 2 meses), não estou muito a par das actuais vulnerabilidades que existem. Conheço poucas, e as poucas que conheço, não as sei explorar até ao seu limite.

    A única que conheço que pode comprometer informação pelo servidor é SQL Injection.
    As únicas que conheço que podem comprometer outros clientes são XSS e XSRF. Apesar de não as conhecer muito bem, com alguma investigação pode ser que me consiga safar.

    Para prevenir SQL Injection, a única coisa que me ocorre é:
    1) Onde quer que seja efectuado um query à base de dados onde constem variáveis cujo conteúdo é escrito pelo utilizador, usar o mysql_real_escape_string() nelas
    2) todos os queries à base de dados passem por uma função (i.e. em vez de "mysql_query" seria "db_query". Simples, e eficaz), e esta função trataria de "analisar" cada query. Se for encontrado algum comentário ("--") ou outros comandos que não são normalmente usados pelo software mas que costumam ser úteis em injecções (como subselects ou union selects ou "GRANT", "REVOKE", etc), é registado como sendo uma tentativa de intrusão.

    Para prevenir XSS e XSRF, que conheço mal, o que me ocorre é IMPEDIR o uso de tags HTML - usar, por exemplo, BBcode para tags úteis como A, B, I, FONT, IMG, e verificar o que lhes é dado antes de formatar a string de saída (para evitar [IMG="javascript:..."]), usar o html_entities(), verificar caracteres como %xx (de modo a que "<" seja removido e que "%3C" seja transformado em "&lt;", por exemplo). Videos do YouTube seram possíveis com uma tag específica. Animações Flash escolhidas pelo utilizador não (porque ActionScript permite de certa forma ataques XSS). Acho que aqui o hi5 ainda tem muito que percorrer :P


    Estes são, provavelmente, os ataques mais fáceis de fazer e de defender, mas não sei que outros problemas é que podem vir a afectar o site. Tendo em conta que é sempre introduzida informação pelos utilizadores que será vista por outros utilizadores, todo o cuidado é pouco.


    Para que é que quero "reinventar o hi5"? Para aprender :P quero aprender PHP/MySQL há cerca de um ano, e esta é uma boa forma de evoluir o que sei. Quanto à linguagem, desenrasco-me bem. A minha dúvida está mesmo nos riscos de segurança.


    Algum "hacker" ou alguém mais experiente nesta área me pode dar umas dicas? :)
     
  2. SoundSurfer

    SoundSurfer Power Member

    para o XSS não é preciso tanto... o utilizador pode escrever o que lhe apetece no form... cabe ao programador garantir _sempre_ que o input do utilizador nunca é apresentado/guardado sem tratamento.


    no XSRF se bem me lembro o problema não é bem o input de HTML nas forms... é a reutilização de dados de forms várias vezes, aproveitando-se do facto dos browsers hoje em dia correrem praticamente sempre o mesmo processo, partilhando cookies entre tabs e janelas...

    a solução é teres sempre na form (hidden field, por exemplo) um valor que te permita verificar a "frescura" dos dados do form...

    Não sei que mecanismos o PHP tem contra estes 2 ataques... sei que o ASP.NET já tem essas protecções... recusa de inputs com tags por omissão... para o XSRF, basta ligar a opção para proteger os requests.
     
  3. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Depois de "investigar" um pouco melhor o XSRF, parece-me que uma rede social não é o tipo de coisa que seja afectada por isso. Só se fosse para alterar campos do perfil, mas penso que nesse caso, bastaria verificar o Referrer e pelo menos um hidden field (como propuseste) com dados para confirmar que a edição é legítima. Até aqui tudo bem. Faz-se.

    O PHP tem as funções "html_entities" e "mysql_real_escape_string". O primeiro transforma <img> em &lt;img&gt; e o segundo transforma ' OR '1'='1 em \' OR \'1\'=\'1 . Para além disso, uma verificaçãozinha para despistar "--"'s, "UNION SELECT"s e subselects não faz mal a ninguém, e caso os filtros normais falhem por algum motivo, pelo menos um query mais manhoso deve perder-se por aqui.

    Os inputs com tags não serão recusados. Quero que as pessoas tenham o direito de poder dizer "bla bla bla <isto> bla bla bla". Neste caso, acho que basta o htmlentities() para transformar "<>" em "&lt;&gt;".

    Mas para além disto, que mais é que devo ter em atenção?
     
  4. Disconected

    Disconected Power Member


    Para o "bbcode" podes perfeitamente usar funções como o preg_replace que te permite substituir todos os [tag_do_buffo] por <tag_do_bufo>.
     
  5. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Se fosse só o preg_replace, então [script]alert("ola");[/script] resultaria, coisa que ninguém quer ;) isso será tudo revisto.
    A questão não está nos problemas a que já estou ciente - está naqueles que eu não conheço. A lista que dei é só um exemplo do que quero saber, e ao mesmo tempo dizer o que já sei que tenho de ter em mente.
     
  6. Disconected

    Disconected Power Member

    tu fazes uma lista das funções que aceitas... não aceitas todas como é obvio (se aceitasses tudo, para quÊ dares-te ao trabalho de converter em vez de usar tags html directas ?).
     
  7. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Claro :P daí eu ter dito que apenas um preg_replace não ajudaria muito.

    Quanto a isso, era do género
    [b][/b] -> <b></b>
    [font][/font] -> <font></font>
    [img=link] -> sanitize(link) -> <img src="link">
    [youtube=codigo] -> sanitize(codigo) ->
    <object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/codigo"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/codigo" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>

    Desta forma, bastaria colocar, por exemplo, [youtube=hXqb_3fR6Ok] para mostrar um video.


    e outras tags, cujo conteúdo teria de ser correctamente filtrado.


    Repito, não é das tags que quero falar. É de outras falhas de segurança. Fazer o "sanitize" aos valores das tags evita de certa forma tanto SQL Injection como XSS. Mas essas duas não devem ser as únicas coisas com que me devo preocupar!
     
    Última edição: 1 de Setembro de 2007

Partilhar esta Página