• O final completo é simples 4 letras. Curiosidades sobre sexo que ninguém te contou antes. Nunca tente corrigir a entrada

    17.07.2023

    Olá. Meu nome é Sasha Barannik. No Mail.Ru Group, gerencio o departamento de desenvolvimento web, composto por 15 funcionários. Aprendemos a criar sites para dezenas de milhões de usuários e podemos lidar facilmente com vários milhões de audiências diárias. Eu mesmo faço desenvolvimento web há cerca de 20 anos e, nos últimos 15 anos de trabalho, a programação tem sido predominantemente em PHP. Embora os recursos da linguagem e a abordagem de desenvolvimento tenham mudado muito durante esse período, entender as principais vulnerabilidades e a capacidade de se proteger contra elas continuam sendo habilidades essenciais para qualquer desenvolvedor.

    Existem muitos artigos e guias sobre segurança na Internet. Este livro me pareceu bastante detalhado, mas conciso e compreensível. Espero que ajude você a aprender algo novo e tornar seus sites mais seguros e confiáveis.

    P.S. O livro é longo, então a tradução será feita em vários artigos. Então vamos começar...

    Outro livro sobre segurança PHP? Existem muitas maneiras de iniciar um livro de segurança do PHP. Infelizmente, não li nenhum deles, então terei que lidar com isso no processo de escrita. Talvez eu comece com o mais básico e espero que tudo dê certo.

    Se considerarmos um aplicativo web abstrato lançado online pela empresa X, podemos supor que ele contém uma série de componentes que, se hackeados, podem causar danos significativos. O que por exemplo?

  • Danos aos usuários: obter acesso a e-mail, senhas, dados pessoais, detalhes de cartões bancários, segredos comerciais, listas de contatos, histórico de transações e segredos profundamente guardados (como alguém batizando seu cachorro de Glitter). O vazamento desses dados prejudica os usuários (pessoas físicas e jurídicas). Aplicativos da Web que usam indevidamente esses dados e sites que tiram proveito da confiança do usuário também podem causar danos.
  • Danos à própria Empresa X: Danos aos usuários resultam em danos à reputação, indenizações, perda de informações comerciais importantes, custos adicionais como infraestrutura, melhorias de segurança, remediação, custos legais, grandes benefícios para a saída de gerentes de alto escalão, etc.
  • Vou me concentrar nessas duas categorias porque elas incluem a maioria dos aborrecimentos que a segurança de aplicativos da Web deve evitar. Todas as empresas que encontraram graves violações de segurança são rápidas em escrever em comunicados à imprensa e em sites como estão maravilhadas com isso. Portanto, aconselho você a sentir antecipadamente, de todo o coração, a importância desse problema antes de enfrentá-lo na prática.

    Infelizmente, os problemas de segurança geralmente são resolvidos após o fato. Acredita-se que o mais importante é criar um aplicativo funcional que atenda às necessidades dos usuários, com orçamento e prazo aceitáveis. É um conjunto compreensível de prioridades, mas você não pode ignorar a segurança para sempre. É muito melhor ter isso em mente o tempo todo implementando decisões específicas durante o desenvolvimento quando o custo da mudança é baixo.

    A segurança secundária é em grande parte o resultado da cultura de programação. Alguns programadores começam a suar frio ao pensar em uma vulnerabilidade, enquanto outros podem contestar a existência de uma vulnerabilidade até que possam provar que não é uma vulnerabilidade. Entre esses dois extremos, existem muitos programadores que simplesmente encolherão os ombros, porque ainda não erraram. É difícil para eles entender este mundo estranho.

    Visto que o sistema de segurança de aplicações web deve proteger os usuários que confiam nos serviços da aplicação, é necessário saber as respostas para as perguntas:

  • Quem quer nos atacar?
  • Como eles podem nos atacar?
  • Como podemos pará-los?
  • Quem quer nos atacar? A resposta à primeira pergunta é muito simples: tudo e todos. Sim, todo o universo quer te ensinar uma lição. Uma criança com um computador com overclock rodando Kali Linux? Ele provavelmente já atacou você. Um homem desconfiado que gosta de colocar paus nas rodas? Ele provavelmente já contratou alguém para atacá-lo. API REST confiável por meio da qual você recebe dados por hora? Provavelmente foi hackeado há um mês para fornecer dados infectados. Até eu posso te atacar! Portanto, não acredite cegamente neste livro. Considere-me mentindo. E encontre um programador que me leve à água potável e exponha meus maus conselhos. Por outro lado, talvez ele também vá hackear você...

    O objetivo dessa paranóia é tornar mais fácil categorizar mentalmente tudo o que interage com seu aplicativo da Web (usuário, hacker, banco de dados, entrada não confiável, gerente, API REST) ​​e, em seguida, atribuir a cada categoria um índice de confiança. Obviamente, "Hacker" não é confiável, mas e quanto a "Database"? "Entrada não confiável" recebeu esse nome por um motivo, mas você realmente filtraria uma postagem de blog do feed Atom confiável de um colega?

    Aqueles que levam a sério o hacking de aplicativos da Web aprendem a tirar proveito dessa mentalidade atacando com mais frequência não fontes de dados vulneráveis, mas fontes de dados confiáveis ​​que têm menos probabilidade de ter um bom sistema de proteção. Esta não é uma decisão aleatória: na vida real, assuntos com maior índice de confiança despertam menos suspeitas. São essas fontes de dados que primeiro presto atenção ao analisar um aplicativo.

    Vamos voltar aos bancos de dados. Supondo que um hacker possa acessar o banco de dados (e nós, paranóicos, sempre assumimos), ele nunca será confiável. A maioria dos aplicativos confia em bancos de dados sem questionar. Do lado de fora, um aplicativo da Web parece uma única entidade, mas por dentro é um sistema de componentes separados que trocam dados. Se considerarmos que todos esses componentes são confiáveis, se um deles for hackeado, todos os outros serão rapidamente comprometidos. Esses problemas de segurança catastróficos não podem ser resolvidos com a frase "Se a base for hackeada, ainda assim perdemos". Você pode dizer isso, mas não é um fato que você terá que fazer isso se inicialmente não confiar na base e agir de acordo!

    Como eles podem nos atacar? A resposta à segunda pergunta é uma lista bastante extensa. Você pode ser atacado de qualquer lugar em que cada componente ou camada de um aplicativo da Web esteja obtendo seus dados. Em essência, os aplicativos da Web simplesmente processam dados e os movem de um lugar para outro. Solicitações de usuários, bancos de dados, APIs, feeds de blog, formulários, cookies, repositórios, variáveis ​​de ambiente PHP, arquivos de configuração, arquivos de configuração novamente, até mesmo arquivos PHP que você executa - todos os quais podem ser infectados com dados de violação de segurança e danos. . Na verdade, se os dados maliciosos não estiverem explicitamente presentes no código PHP usado para a solicitação, é provável que venham como uma "carga útil". Isso pressupõe que a) você escreveu o código-fonte do PHP, b) ele foi revisado adequadamente e c) você não foi pago por organizações criminosas.

    Se você usar fontes de dados sem verificar se os dados são completamente seguros e adequados para uso, você estará potencialmente aberto a ataques. Você também precisa verificar se os dados recebidos correspondem aos dados enviados. Se os dados não forem totalmente seguros para retirada, você também terá sérios problemas. Tudo isso pode ser expresso como uma regra para PHP “Validate input; escapar da saída."

    Essas são as fontes óbvias de dados que precisamos controlar de alguma forma. As fontes também podem incluir repositórios do lado do cliente. Por exemplo, a maioria dos aplicativos reconhece os usuários atribuindo-lhes IDs de sessão exclusivos, que podem ser armazenados em cookies. Se um invasor obtiver o valor do cookie, ele poderá se passar por outro usuário. Embora possamos mitigar alguns dos riscos associados à interceptação ou adulteração dos dados do usuário, não podemos garantir a segurança física do computador do usuário. Não podemos nem garantir que os usuários acharão "123456" a senha mais idiota depois de "senha". Adicionando tempero é o fato de que hoje os cookies não são o único tipo de armazenamento do lado do usuário.

    Outro risco frequentemente negligenciado diz respeito à integridade do seu código-fonte. Em PHP, está se tornando cada vez mais popular desenvolver aplicativos baseados em um grande número de bibliotecas, módulos e pacotes fracamente acoplados para estruturas. Muitos deles são baixados de repositórios públicos como o Github, instalados usando instaladores de pacotes como o Composer e seu companheiro da web Packagist.org. Portanto, a segurança do código-fonte depende inteiramente da segurança de todos esses serviços e componentes de terceiros. Se o Github estiver comprometido, provavelmente será usado para distribuir código com um aditivo malicioso. Se Packagist.org - o invasor poderá redirecionar as solicitações de pacote para seus próprios pacotes maliciosos.

    Atualmente, Composer e Packagist.org são afetados por vulnerabilidades conhecidas na detecção de dependência e distribuição de pacotes, então sempre verifique tudo em seu ambiente de produção e verifique a fonte de todos os pacotes com Packagist.org.

    Como podemos pará-los? Quebrar a segurança de um aplicativo da Web pode ser ridiculamente fácil e demorado. É justo supor que todo aplicativo da Web tenha uma vulnerabilidade em algum lugar. A razão é simples: todas as aplicações são feitas por pessoas, e as pessoas cometem erros. Portanto, a segurança perfeita é um sonho impossível. Todos os aplicativos podem conter vulnerabilidades e a tarefa dos programadores é minimizar os riscos.

    Você terá que pensar com cuidado para reduzir a probabilidade de dano de um ataque a um aplicativo da web. No decorrer da história, falarei sobre possíveis métodos de ataque. Algumas delas são óbvias, outras não. Mas de qualquer forma, para resolver o problema, é necessário levar em consideração alguns princípios básicos de segurança.

    Princípios básicos de segurança Ao projetar medidas de segurança, sua eficácia pode ser avaliada usando as seguintes considerações. Alguns eu já mencionei acima.
  • Não confie em ninguém nem em nada.
  • Sempre assuma o pior cenário possível.
  • Aplique proteção em vários níveis (Defence-in-Depth).
  • Siga o princípio "quanto mais simples, melhor" (Keep It Simple Stupid, KISS).
  • Respeite o princípio do "menor privilégio".
  • Os atacantes cheiram a ambigüidade.
  • Leia a documentação (RTFM), mas nunca confie nela.
  • Se não foi testado, então não funciona.
  • A culpa é sempre sua!
  • Vamos examinar brevemente todos os pontos.1. Não confie em ninguém ou em nada Como mencionado acima, a atitude correta é presumir que todos e tudo com o qual seu aplicativo da Web interage deseja invadi-lo. Isso inclui outros componentes ou camadas de aplicativos necessários para processar solicitações. Tudo e todos. Sem exceções.2. Sempre assuma o pior caso Muitos sistemas de segurança têm uma coisa em comum: não importa quão bem sejam feitos, todos podem ser violados. Se você levar isso em consideração, entenderá rapidamente a vantagem do segundo ponto. Concentrar-se no pior cenário ajudará a avaliar a extensão e a gravidade do ataque. E se isso acontecer, você poderá reduzir as consequências desagradáveis ​​por meio de proteções adicionais e alterações na arquitetura. Talvez a solução tradicional que você está usando já tenha sido substituída por algo melhor?3. Use Defesa em Profundidade A Defesa em Profundidade é emprestada da ciência militar, porque as pessoas há muito perceberam que as numerosas paredes, sacos de areia, equipamentos, coletes à prova de balas e frascos que cobrem órgãos vitais de balas e lâminas inimigas são a abordagem certa. segurança. Você nunca sabe qual dos itens acima não protegerá e precisa garantir que vários níveis de proteção permitam que você conte com mais de uma fortificação de campo ou formação de batalha. Claro, não se trata apenas de falhas únicas. Imagine um atacante escalando uma gigantesca parede medieval usando uma escada e descobrindo que há outra parede atrás dela, de onde são bombardeados com flechas. Os hackers se sentirão da mesma forma.4. Keep It Simple Stupid (KISS) As melhores defesas são sempre simples. Eles são fáceis de desenvolver, implementar, entender, usar e testar. A simplicidade reduz os bugs, incentiva o desempenho correto do aplicativo e facilita a implementação até mesmo nos ambientes mais complexos e hostis.5. Aderir ao princípio de "menores privilégios" Cada participante na troca de informações (usuário, processo, programa) deve ter apenas os direitos de acesso que ele precisa para desempenhar suas funções.6. Os invasores detectam obscuridade "Segurança através da obscuridade" baseia-se na suposição de que, se você usar a proteção A e não contar a ninguém o que é, como funciona ou se existe, então ela o ajudará magicamente, porque os invasores estão em uma perda. Na verdade, isso só dá uma pequena vantagem. Frequentemente, um atacante habilidoso pode descobrir o que você fez, então você também precisa usar defesas explícitas. Aqueles que estão indevidamente convencidos de que uma defesa vaga elimina a necessidade de uma real devem ser punidos especialmente para se livrar das ilusões.7. Leia a documentação (RTFM), mas nunca confie nela O manual do PHP é a bíblia. Claro, não foi escrito pelo Monstro do Espaguete Voador, então tecnicamente pode conter uma série de meias-verdades, omissões, interpretações erradas ou erros ainda não percebidos ou corrigidos. O mesmo vale para Stack Overflow.

    Fontes especializadas de sabedoria de segurança (focadas em PHP e além) fornecem conhecimento mais detalhado em geral. A coisa mais próxima de uma bíblia de segurança PHP é OWASP, com artigos, tutoriais e dicas. Se algo é desencorajado no OWASP, nunca o faça!

    8. Se não foi testado, não funciona Ao implementar proteções, você deve escrever todos os testes necessários para verificar se elas funcionam. Incluindo fingir que você é um hacker por quem a prisão está chorando. Pode parecer exagero, mas estar familiarizado com as técnicas de hacking de aplicativos da web é uma boa prática; você aprenderá sobre possíveis vulnerabilidades e sua paranóia aumentará. Ao mesmo tempo, não é necessário informar a gerência sobre a gratidão recém-adquirida por hackear um aplicativo da web. Certifique-se de usar ferramentas automatizadas para identificar vulnerabilidades. Eles são úteis, mas é claro que não substituem revisões de código de qualidade e até mesmo testes manuais do aplicativo. Quanto mais recursos você gastar em testes, mais confiável será seu aplicativo.9. A culpa é sempre sua! Os programadores estão acostumados a acreditar que as vulnerabilidades de segurança serão encontradas como ataques dispersos e suas consequências são insignificantes.

    Por exemplo, violações de dados (um tipo de hack bem documentado e amplamente difundido) costumam ser vistas como pequenos problemas de segurança porque não afetam diretamente os usuários. No entanto, vazar informações sobre versões de software, linguagens de desenvolvimento, locais de código-fonte, lógica de aplicativo e lógica de negócios, estrutura de banco de dados e outros aspectos do ambiente de aplicativo da Web e operações internas geralmente é essencial para um ataque bem-sucedido.

    Ao mesmo tempo, ataques a sistemas de segurança geralmente são combinações de ataques. Individualmente, eles são insignificantes, mas ao mesmo tempo às vezes abrem caminho para outros ataques. Por exemplo, a injeção de SQL às vezes requer um nome de usuário específico, que pode ser obtido usando um Timing Attack contra a interface administrativa, em vez de uma força bruta muito mais cara e perceptível. Por sua vez, a injeção de SQL permite implementar um ataque XSS em uma conta administrativa específica sem chamar a atenção para um grande número de entradas de log suspeitas.

    O perigo de olhar para as vulnerabilidades isoladamente reside em subestimar sua ameaça e, portanto, em tratá-las com descuido. Os programadores geralmente são preguiçosos demais para corrigir uma vulnerabilidade porque a consideram muito pequena. Também é praticado transferir a responsabilidade pelo desenvolvimento seguro para programadores ou usuários finais, e muitas vezes sem documentar problemas específicos: mesmo a existência dessas vulnerabilidades não é reconhecida.

    A aparente insignificância não é importante. É irresponsável forçar programadores ou usuários a corrigir suas vulnerabilidades, especialmente se você nem mesmo as informou.

    Validação de entrada A validação de entrada é o perímetro de defesa externo de seu aplicativo da web. Ele protege a lógica de negócios principal, processamento de dados e geração de saída. Literalmente, tudo fora desse perímetro, com exceção do código executado pela solicitação atual, é considerado território inimigo. Todas as possíveis entradas e saídas do perímetro são guardadas dia e noite por sentinelas beligerantes que atiram primeiro e perguntam depois. Conectados ao perímetro estão "aliados" protegidos separadamente (e de aparência muito suspeita), incluindo "Modelo", "Banco de Dados" e "Sistema de Arquivos". Ninguém quer atirar neles, mas se tentarem a sorte... bang. Cada aliado tem seu próprio perímetro, que pode ou não confiar no nosso.

    Lembra das minhas palavras sobre em quem você pode confiar? Ninguém e nada. No mundo do PHP, o conselho está em todo lugar para não confiar na "entrada do usuário". Esta é uma das categorias de acordo com o grau de confiança. Assumindo que os usuários não são confiáveis, pensamos que todo o resto pode ser confiável. Isto está errado. Os usuários são a fonte de entrada não confiável mais óbvia porque não os conhecemos e não podemos controlá-los.

    Critérios de validação A validação de entrada é a defesa mais óbvia e menos confiável de um aplicativo da web. A grande maioria das vulnerabilidades se deve a falhas no sistema de verificação, por isso é muito importante que essa parte da proteção funcione corretamente. Ele pode falhar, mas ainda aderir às seguintes considerações. Sempre tenha em mente ao implementar validadores personalizados e usar bibliotecas de validação de terceiros que as soluções de terceiros tendem a executar tarefas comuns e omitir rotinas de validação de chave que seu aplicativo pode precisar. Ao usar quaisquer bibliotecas projetadas para necessidades de segurança, verifique você mesmo quanto a vulnerabilidades e operação correta. Também recomendo não esquecer que o PHP pode exibir um comportamento estranho e possivelmente inseguro. Veja este exemplo, retirado das funções de filtro:

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    O filtro funciona sem problemas. O problema é que o URL php:// aceito pode ser passado para uma função PHP que espera receber um endereço HTTP remoto, em vez de retornar dados do script PHP em execução (por meio de um manipulador PHP). A vulnerabilidade ocorre porque a opção de filtro não possui um método que restrinja os URIs permitidos. Mesmo que o aplicativo esteja esperando um link http, https ou mailto, não algum URI específico do PHP. É necessário, por todos os meios, evitar uma abordagem excessivamente geral da verificação.

    Tenha cuidado com o contexto A validação de entrada deve evitar que você insira dados inseguros em seu aplicativo da web. Um grande obstáculo: as verificações de segurança de dados geralmente são realizadas apenas para o primeiro uso pretendido.

    Digamos que recebi dados contendo um nome. Posso verificar facilmente apóstrofos, hífens, colchetes, espaços e toda uma série de caracteres Unicode alfanuméricos. O nome é um dado válido que pode ser usado para exibição (primeiro uso pretendido). Mas se você usá-lo em outro lugar (por exemplo, em uma consulta ao banco de dados), ele estará em um novo contexto. E alguns dos caracteres que são permitidos em um nome serão perigosos neste contexto: se o nome for convertido em uma string para realizar uma injeção de SQL.

    Acontece que a validação de entrada é inerentemente não confiável. É mais eficaz para truncar valores inválidos sem ambiguidade. Diga quando algo precisa ser um número inteiro, uma string alfanumérica ou um URL HTTP. Esses formatos e valores têm suas limitações e, se devidamente verificados, são menos propensos a representar uma ameaça. Outros valores (texto ilimitado, matrizes GET/POST e HTML) são mais difíceis de verificar e têm maior probabilidade de conter dados maliciosos.

    Como na maioria das vezes nosso aplicativo passará dados entre contextos, não podemos apenas verificar todas as entradas e considerar o trabalho concluído. O check-in é apenas o primeiro loop de proteção, mas não o único.

    Juntamente com a validação de dados de entrada, um método de proteção como escape é frequentemente usado. Com ele, os dados são verificados quanto à segurança ao entrar em cada novo contexto. Normalmente, esse método é usado para proteger contra scripts entre sites (XSS), mas também é solicitado em muitas outras tarefas, como uma ferramenta de filtragem.

    Escaping protege contra interpretações errôneas pelo receptor de dados de saída. Mas isso não é suficiente - à medida que os dados entram em um novo contexto, uma verificação é necessária especificamente para um contexto específico.

    Embora isso possa ser visto como uma duplicação da validação de entrada inicial, as etapas de validação adicionais são, na verdade, mais adequadas ao contexto atual quando os requisitos de dados são muito diferentes. Por exemplo, os dados provenientes de um formulário podem conter uma porcentagem. Na primeira vez que o usamos, verificamos se o valor é realmente um número inteiro. Mas ao passá-lo para o nosso modelo de aplicação, podem surgir novos requisitos: o valor deve se encaixar em uma determinada faixa, o que é obrigatório para o funcionamento da lógica de negócio da aplicação. E se essa verificação adicional não for realizada no novo contexto, poderão surgir sérios problemas.

    Use apenas listas brancas, não listas negras Listas negras e listas brancas são duas abordagens principais para validação de entrada. Preto significa verificar dados inválidos e branco significa verificar dados válidos. A lista de permissões é preferível porque apenas os dados que esperamos são passados ​​durante a validação. Por sua vez, as listas negras levam em consideração apenas as suposições dos programadores sobre todos os possíveis dados incorretos, por isso é muito mais fácil se confundir, perder algo ou cometer um erro aqui.

    Um bom exemplo é qualquer procedimento de validação projetado para tornar o HTML seguro do ponto de vista da saída sem escape em um modelo. Se usarmos uma lista negra, precisamos verificar se o HTML não contém elementos perigosos, atributos, estilos e JavaScript executável. Dá muito trabalho, e os limpadores de HTML baseados em listas negras sempre conseguem ignorar combinações perigosas de código. E as ferramentas de lista branca eliminam essa ambigüidade, permitindo apenas elementos e atributos permitidos conhecidos. Todos os outros simplesmente serão separados, isolados ou removidos, não importa o que sejam.

    Portanto, a lista de permissões é preferível para qualquer procedimento de verificação devido à maior segurança e confiabilidade.

    Nunca tente corrigir os dados de entrada A validação dos dados de entrada geralmente é acompanhada por filtragem. Se durante a verificação simplesmente avaliamos a correção dos dados (com a emissão de um resultado positivo ou negativo), a filtragem altera os dados que estão sendo verificados para que satisfaçam regras específicas.

    Isso geralmente é um pouco prejudicial. Os filtros tradicionais incluem, por exemplo, a remoção de todos os caracteres, exceto números, dos números de telefone (incluindo colchetes e hífens extras) ou o corte de espaços horizontais ou verticais desnecessários. Em tais situações, uma limpeza mínima é realizada para eliminar erros de exibição ou transmissão. No entanto, você pode se empolgar demais com o uso de filtragem para bloquear dados maliciosos.

    Uma consequência de tentar corrigir a entrada é que um invasor pode prever o impacto de suas correções. Digamos que haja algum valor de string inválido. Você procura por ele, exclui e completa a filtragem. E se um invasor criar um valor separado por string para enganar seu filtro?

    alert(documento.cookie);
    Neste exemplo, simplesmente filtrar por tag não fará nada: remover a tag explícita fará com que os dados sejam tratados como um elemento de script HTML totalmente válido. O mesmo pode ser dito sobre a filtragem por quaisquer formatos específicos. Tudo isso mostra claramente por que é impossível tornar a validação de dados de entrada o último loop de proteção do aplicativo.

    Em vez de tentar corrigir as entradas, basta usar um validador da lista de permissões e rejeitar totalmente essas tentativas de entrada. E onde precisar filtrar, filtre sempre antes de fazer a checagem, nunca depois.

    Nunca confie em validadores externos e monitore constantemente as vulnerabilidades Anteriormente, observei que a validação é necessária sempre que os dados são transferidos para um novo contexto. Isso também se aplica à validação realizada fora do próprio aplicativo da web. Esses controles incluem validação ou outras restrições aplicadas a formulários HTML no navegador. Veja este formulário do HTML 5 (tags omitidas):

    Rep. Da Irlanda Reino Unido
    Os formulários HTML são capazes de impor restrições aos dados de entrada. Você pode limitar a seleção com uma lista de itens fixos, definir valores mínimos e máximos e limitar o comprimento do texto. As possibilidades do HTML 5 são ainda maiores. Os navegadores podem verificar URLs e endereços de e-mail, controlar datas, números e intervalos (embora o suporte para os dois últimos seja bastante arbitrário). Os navegadores também podem validar a entrada usando expressões regulares JavaScript incluídas no atributo de modelo.

    Com toda essa abundância de controles, não podemos esquecer que o objetivo deles é melhorar a usabilidade do seu aplicativo. Qualquer invasor é capaz de criar um formulário que não contenha as restrições de seu formulário original. Você pode até criar um cliente HTTP para preenchimento de formulário automatizado!

    Outro exemplo de validadores externos é obter dados de APIs de terceiros, como o Twitter. Essa rede social tem uma boa reputação e geralmente é confiável sem questionar. Mas como somos paranóicos, nem confie no Twitter. Se comprometidas, suas respostas conterão dados inseguros, para os quais não estaremos preparados. Portanto, mesmo aqui, aplique seu próprio cheque para não ficar indefeso em caso de alguma coisa.

    Onde temos confiança em meios externos de verificação, é conveniente rastrear vulnerabilidades. Por exemplo, se um formulário HTML definir um limite para o comprimento máximo e recebermos dados de entrada cujo tamanho atingiu o limite, é lógico supor que esse usuário está tentando ignorar a validação. Dessa forma, podemos registrar lacunas em ferramentas externas e tomar mais medidas contra possíveis ataques, limitando o acesso ou o número de solicitações.

    Evite conversões de tipo no PHP O PHP não é uma linguagem fortemente tipada e a maioria de suas funções e operações são seguras para o tipo. Isso pode levar a sérios problemas. Além disso, não são os valores em si que são especialmente vulneráveis, mas os validadores. Por exemplo:

    Assert(0 == "0ABC"); //retorna TRUE assert(0 == "ABC"); //retorna TRUE (mesmo sem um dígito inicial!) assert(0 === "0ABC"); //retorna NULL/Avisa que a asserção não pode ser verificada
    Ao projetar validadores, certifique-se de usar comparação estrita e conversão de tipo manual quando os valores de entrada ou saída puderem ser uma string. Por exemplo, os formulários podem retornar uma string, portanto, se você estiver trabalhando com dados que precisam ser inteiros, certifique-se de verificar seu tipo:

    Função checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) ( return false; // contém caracteres não digitados ) if (!is_int((int) $int )) ( return false; // outro valor não inteiro ou maior que PHP_MAX_INT ) return ($int >= $min && $int = $min && $int array("verify_peer" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $context);
    UPD. No PHP 5.6+, a opção ssl.verify_peer é definida como TRUE por padrão.

    A extensão cURL inclui validação de servidor pronta para uso, então você não precisa configurar nada. No entanto, os programadores às vezes adotam uma abordagem impensada para a segurança de suas bibliotecas e aplicativos. Essa abordagem pode ser encontrada em qualquer biblioteca da qual seu aplicativo dependa.

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, false);
    Desativar a verificação do servidor em um contexto SSL ou ao usar curl_setopt() resultará em uma vulnerabilidade a ataques man-in-the-middle. Mas é desativado justamente para resolver o problema de erros irritantes que indicam um ataque ou tentativas de um aplicativo entrar em contato com um host cujo certificado SSL está configurado incorretamente ou expirou.

    Os aplicativos da Web geralmente podem atuar como um proxy para ações do usuário, como um cliente do Twitter. E o mínimo que podemos fazer é manter nossos aplicativos de acordo com os altos padrões estabelecidos pelos navegadores que avisam os usuários e tentam protegê-los de se conectarem a servidores suspeitos.

    Conclusões Muitas vezes estamos bem posicionados para criar um aplicativo seguro. Mas nós mesmos contornamos algumas restrições razoáveis ​​para facilitar o desenvolvimento, a depuração e desabilitar a saída de erros irritantes. Ou, por boas intenções, estamos tentando complicar desnecessariamente a lógica do aplicativo.

    Mas os hackers também não comem seu pão em vão. Eles estão procurando novas maneiras de contornar nossas defesas imperfeitas e estudar vulnerabilidades nos módulos e bibliotecas que usamos. E se nossa tarefa é criar um aplicativo da Web seguro, a deles é comprometer nossos serviços e dados. Em última análise, todos nós trabalhamos para melhorar nossos produtos.

    Você precisa determinar o melhor momento para conceber, evitar uma gravidez indesejada ou saber qual é o melhor momento para fazer sexo com seu parceiro? Antes, para isso, as mulheres tinham que ir a uma consulta com o médico, mas agora têm um novo melhor amigo - o smartphone.

    Nos últimos anos, surgiram muitos aplicativos para mulheres que permitem rastrear facilmente seus dias férteis e tempo de ovulação, além de fazer anotações pessoais. Além disso, eles têm muitas outras funções. Um desses aplicativos é o Glow, que já é usado por 47 milhões de mulheres. Glow permite rastrear coisas como o humor das mulheres e a qualidade e frequência do sexo. Graças a este aplicativo, tornou-se possível obter esses fatos interessantes sobre a vida íntima de mulheres de todo o mundo.

    Principais países para mulheres

    1. Você não tem intimidade? Vá para o Canadá. Acontece que os canadenses fazem sexo 45% mais frequentemente do que os usuários médios de aplicativos.

    2. Mas cuidado: o Canadá é um ótimo lugar para engravidar. As mulheres canadenses podem engravidar 21% mais facilmente do que outras mulheres.

    3. As mulheres australianas também fazem sexo com frequência - 37% a mais do que a média dos usuários de aplicativos.

    4. Escusado será dizer que as mulheres na Austrália também têm uma boa chance de engravidar? Eles são 14% mais altos do que outros usuários.

    5. Os EUA são um bom lugar para ser feliz. As mulheres americanas são 16% mais propensas a fazer sexo do que outras mulheres.

    6. Pior lugar para ser feliz? América latina. Aqui, as mulheres fazem sexo com 4% menos frequência do que os usuários médios de aplicativos.

    apetites sexuais

    1. O apetite sexual da mulher corresponde ao seu ciclo mensal. O primeiro dia do ciclo é considerado o primeiro dia da menstruação, que dura aproximadamente cinco dias. Assim, as mulheres são as que menos se interessam por sexo entre um e cinco dias por mês.

    2. Muitas mulheres relatam uma mudança nos níveis de energia ou humor durante esse período, e isso geralmente está associado a uma diminuição do desejo sexual. Além disso, as mulheres ficam menos interessadas em sexo durante uma semana inteira após a menstruação.

    3. A maioria das mulheres começa a fazer sexo novamente no 12º dia do ciclo.

    4. Muitas mulheres têm relações sexuais regulares do 12º ao 14º dia do ciclo. O aplicativo Glow chama esses dias de "auge da sexualidade".

    5. Na verdade, as mulheres se sentem mais sexuais no 13º e 14º dia do ciclo. Mas eis o que é interessante: eles não conseguem necessariamente o melhor e mais satisfatório sexo neste momento.

    6. Acima de tudo, as mulheres gostam de sexo no último 30º dia do ciclo. Este dia no Glow é rotulado como "pico de orgasmos".

    As mulheres estão satisfeitas?

    1. As mulheres se sentem mais felizes nos dias 15 e 16 do ciclo, e também quando fizeram muito sexo nos dias anteriores.

    2. Os usuários do Glow registraram 7,6 milhões de contatos sexuais em dois anos.

    3. Isso significa que a cada minuto pelo menos sete mulheres que usam o aplicativo Glow fazem sexo.

    4. A propósito, os usuários também relataram estar apaixonados 2 milhões de vezes. O aplicativo também rastreia os ciclos sexuais e a fertilidade de 88.000 casais.

    5. Infelizmente, apesar dos contatos sexuais existentes, nem todas as mulheres estão satisfeitas com eles. Quase um terço das mulheres está disposta a desistir do sexo em vez de um smartphone.

    6. Mas isso ainda significa que dois terços preferem desistir de telefones do que sexo.

    Artigos semelhantes