O que precisamos. Encontrar palavras com operadores adicionais

O registro de controles é realizado pela diretiva @Register, que permite usar controles de usuário e controles de servidor no código HTML da página usando uma sintaxe especial (sintaxe declarativa de controle de servidor personalizado). Com base na análise dessas diretivas, o analisador de página pode associar tags a determinados tipos e, ao criar uma página, incorporar controles já como contêineres de tipos personalizados - ramificações da árvore de controle da página.

As diretivas devem anteceder o primeiro uso das tags declaradas, mais frequentemente elas são colocadas no início da página e no caso de registrar vários controles, em sites com estrutura modular, a quantidade dessas declarações pode ocupar um grande número de linhas . Ao alterar a localização dos controles, você deve procurar as linhas que exigem alterações no código de todas as páginas e controles de usuário nos quais estão registrados, o que é bastante inconveniente.

O artigo descreve um método que simplifica o registro de controles.

Para as diretivas de registro, usaremos um arquivo de texto simples no qual coletaremos todas as diretivas @ Register. Como os caminhos virtuais podem ser usados ​​para declarar controles de usuário e apenas namespaces são especificados para controles de servidor, podemos coletar todos os links que precisamos neste arquivo, e os links para os arquivos ascx estarão corretos para qualquer pasta no projeto. Aqui está a aparência deste arquivo em um dos projetos:


<%@ Register TagPrefix="ch" Namespace="ControlsSharp.HtmlControls" Assembly="ControlsSharp"%>

<%@ Register TagPrefix="cw" Namespace="ControlsSharp.WebControls" Assembly="ControlsSharp"%>

<%@ Register TagPrefix="c" Namespace="ControlsSharp.CustomControls" Assembly="ControlsSharp"%>

<%@ Register TagPrefix="b" Namespace="ControlsBasic.CustomControls" Assembly="ControlsBasic"%>

<%@ Register TagPrefix="cu" TagName="bottommenu" Src="~/UserControls/Menu/cu_menu_bottom.ascx" %>

<%@ Register TagPrefix="cu" TagName="leftmenu" Src="~/UserControls/Menu/cu_menu_left.ascx" %>

<%@ Register TagPrefix="cu" TagName="topmenu" Src="~/UserControls/Menu/cu_menu_top.ascx" %>

Vamos nomear o arquivo register.inc e colocá-lo na pasta /inc do nosso projeto web.

Este arquivo conterá todos os links que precisamos, adicionaremos ou alteraremos o registro de um usuário ou controle de servidor nele.

Agora o arquivo criado precisa ser incluído de alguma forma no código da página. Fazemos isso com a diretiva #include SSI (server side includes). Esta diretiva permite incluir arquivos estáticos e dinâmicos no código da página, processando-os com base no mapeamento do IIS, ou seja, especificar um arquivo asp ou aspx como a origem fará com que o arquivo seja processado pelo processo apropriado e copie os resultados desse processamento para a página de saída. Em ASP, a diretiva #include foi muito utilizada e permitiu a modularização do site. Com o advento do ASP.NET, tornou-se mais conveniente fazer isso de outras maneiras, por exemplo, usando controles de usuário. Versões futuras do ASP.NET implementarão a modularidade usando páginas mestras. Em geral, a diretiva #include perdeu seu significado e foi mantida principalmente para compatibilidade com versões anteriores e para simplificar a migração de projetos ASP para .Net.

Como temos um arquivo de texto simples, nenhum processamento será feito e, antes que qualquer conteúdo dinâmico seja executado, todo o conteúdo do arquivo será copiado para o código da página. Aqueles. adicionar nosso arquivo register.inc ao topo da página, por exemplo, é quase o mesmo que escrever todas as diretivas @Register ali.

Para não depender da localização física do arquivo, usamos novamente a sintaxe do caminho virtual e adicionamos a seguinte linha ao código do arquivo aspx:

Certifique-se de que tudo funciona, caso contrário, corrija os caminhos errados.

Resta realizar mais uma operação. Agora, se você tentar obter o arquivo /inc/register.inc do link em seu navegador, poderá fazê-lo facilmente. O IIS o coloca em suas mãos, assim como nas mãos de um invasor, totalmente gratuito, embora contenha os caminhos da estrutura física do seu site.

Para evitar que isso aconteça, usamos os recursos do manipulador síncrono HttpForbiddenHandler, que nos permite proteger arquivos de um determinado tipo de serem emitidos a pedido do usuário. Essa abordagem é conveniente e é frequentemente usada, por exemplo, para proteger arquivos de banco de dados do MS Access usados ​​em um projeto. Para que os arquivos com a extensão *.inc sejam protegidos usando esse manipulador, você precisa informar ao IIS que esses arquivos serão processados ​​pelo processo ASP.NET, ou seja, configurar o IIS para mapear para arquivos desse tipo.

Para obter uma descrição detalhada do processo de configuração do IIS, consulte COMO: Usar ASP.NET para proteger tipos de arquivo (http://support.microsoft.com/kb/815152/EN-US/). Precisamos criar um mapeamento apenas para arquivos *.inc. Após concluir os passos descritos lá, todas as solicitações de arquivos com essa extensão serão processadas pelo processo ASP.NET, e você terá que editar o arquivo web.config da seguinte forma:

É isso, agora ao tentar obter o arquivo /inc/register.inc através de um link direto, o usuário receberá o erro B.

Para não registrar aspnet_isapi.dll, por exemplo, seu provedor não quer fazer isso, você pode usar a habilidade SSI para especificar arquivos de qualquer tipo e trapacear usando uma extensão de um dos tipos já mapeados no IIS por padrão para um arquivo com diretivas @Register. As extensões *.cs ou *.vb serão convenientes para isso. Esses arquivos contêm código-fonte e geralmente não são copiados para o servidor. Se de repente você cometeu um erro e copiou, não poderá obtê-los na solicitação do navegador - ao tentar fazer isso, o usuário receberá um erro B. Isso acontece porque o mapeamento no IIS é configurado por padrão para arquivos deste tipo e a extensão correspondente já está registrada na seção arquivo machine.config. No Visual Studio, para que o compilador não dê uma mensagem de erro, coloque uma extensão na qual o compilador não esteja interessado: em projetos C# é *.vb, em projetos VB é *.cs.
Conclusão

O método descrito permite registrar controles em um só lugar para todo o projeto. A modificação subsequente deste arquivo requer menos esforço do que se você tivesse que fazê-lo da maneira usual. Tente usar SSI #include dentro dos arquivos que você insere - isso permite que você organize um tipo de hierarquia e herança, o que pode ser conveniente para grandes projetos

O mecanismo de pesquisa do Google (www.google.com) oferece muitas opções de pesquisa. Todos esses recursos são uma ferramenta de pesquisa inestimável para um usuário de Internet pela primeira vez e, ao mesmo tempo, uma arma ainda mais poderosa de invasão e destruição nas mãos de pessoas com más intenções, incluindo não apenas hackers, mas também criminosos não informáticos e até terroristas.
(9475 visualizações em 1 semana)

Denis Batrankov
denisNOSPAMixi.ru

Atenção:Este artigo não é um guia para ação. Este artigo foi escrito para vocês, administradores de servidores WEB, para que percam a falsa sensação de que estão seguros, e finalmente entenderão a insidosidade desse método de obtenção de informações e começarão a proteger seu site.

Introdução

Por exemplo, encontrei 1670 páginas em 0,14 segundos!

2. Vamos inserir outra linha, por exemplo:

inurl:"auth_user_file.txt"

um pouco menos, mas isso já é suficiente para download gratuito e para adivinhar senhas (usando o mesmo John The Ripper). Abaixo vou dar mais alguns exemplos.

Portanto, você precisa perceber que o mecanismo de pesquisa do Google visitou a maioria dos sites da Internet e armazenou em cache as informações contidas neles. Essas informações armazenadas em cache permitem que você obtenha informações sobre o site e o conteúdo do site sem uma conexão direta com o site, apenas pesquisando as informações armazenadas internamente pelo Google. Além disso, se as informações no site não estiverem mais disponíveis, as informações no cache ainda poderão ser preservadas. Tudo que você precisa para este método é conhecer algumas palavras-chave do Google. Essa técnica é chamada de Google Hacking.

Pela primeira vez, informações sobre o Google Hacking apareceram na lista de discussão Bugtruck 3 anos atrás. Em 2001, este tema foi levantado por um estudante francês. Aqui está um link para esta carta http://www.cotse.com/mailing-lists/bugtraq/2001/Nov/0129.html . Ele dá os primeiros exemplos de tais solicitações:

1) Índice de /admin
2) Índice de /senha
3) Índice de /mail
4) Índice de / +banques +filetype:xls (para frança...)
5) Índice de / +passwd
6) Índice de/senha.txt

Este tópico fez muito barulho na parte de leitura em inglês da Internet recentemente: depois de um artigo de Johnny Long publicado em 7 de maio de 2004. Para um estudo mais completo sobre o Google Hacking, aconselho que acesse o site deste autor http://johnny.ihackstuff.com. Neste artigo, quero apenas atualizar você.

Quem pode usar:
- Jornalistas, espiões e todas aquelas pessoas que gostam de meter o nariz nos negócios de outras pessoas podem usar isso para procurar evidências comprometedoras.
- Hackers procurando alvos adequados para hackear.

Como o Google funciona.

Para continuar a conversa, deixe-me lembrá-lo de algumas das palavras-chave usadas nas consultas do Google.

Pesquise usando o sinal +

O Google exclui palavras sem importância, em sua opinião, da pesquisa. Por exemplo, palavras interrogativas, preposições e artigos em inglês: por exemplo são, de, onde. Em russo, o Google parece considerar todas as palavras importantes. Se a palavra for excluída da pesquisa, o Google escreverá sobre ela. Para que o Google comece a procurar por páginas com essas palavras, você precisa adicionar um sinal de + antes delas sem espaço antes da palavra. Por exemplo:

ás + de base

Pesquisar por sinal -

Se o Google encontrar um grande número de páginas das quais é necessário excluir páginas com determinados tópicos, você poderá forçar o Google a pesquisar apenas páginas que não contenham determinadas palavras. Para fazer isso, você precisa indicar essas palavras colocando um sinal na frente de cada uma - sem espaço antes da palavra. Por exemplo:

pesca - vodka

Pesquise com o sinal ~

Você pode procurar não apenas a palavra especificada, mas também seus sinônimos. Para fazer isso, preceda a palavra com o símbolo ~.

Encontrar uma frase exata usando aspas duplas

O Google pesquisa em cada página todas as ocorrências das palavras que você escreveu na string de consulta e não se importa com a posição relativa das palavras, o principal é que todas as palavras especificadas estejam na página ao mesmo tempo ( Esta é a ação padrão). Para encontrar a frase exata, você precisa colocá-la entre aspas. Por exemplo:

"livro"

Para ter pelo menos uma das palavras especificadas, você deve especificar a operação lógica explicitamente: OR. Por exemplo:

livro de segurança OU proteção

Além disso, você pode usar o sinal * na string de pesquisa para denotar qualquer palavra e. para representar qualquer personagem.

Encontrar palavras com operadores adicionais

Existem operadores de pesquisa especificados na string de pesquisa no formato:

operador: search_term

Os espaços ao lado dos dois pontos não são necessários. Se você inserir um espaço após dois pontos, verá uma mensagem de erro e, antes dela, o Google os usará como uma string de pesquisa normal.
Existem grupos de operadores de pesquisa adicionais: idiomas - indique em qual idioma você deseja ver o resultado, data - limite os resultados nos últimos três, seis ou 12 meses, ocorrências - indique onde no documento você precisa procurar a string: em todos os lugares, no título, na URL, domínios - pesquise o site especificado ou vice-versa exclua-o da pesquisa, pesquisa segura - bloqueie sites que contenham o tipo especificado de informações e remova-os das páginas de resultados da pesquisa.
No entanto, alguns operadores não precisam de um parâmetro adicional, por exemplo, a consulta " cache:www.google.com" pode ser chamado como uma string de pesquisa completa e algumas palavras-chave, pelo contrário, exigem uma palavra de pesquisa, por exemplo " site:www.google.com ajuda". À luz do nosso tópico, vejamos os seguintes operadores:

Operador

Descrição

Requer um parâmetro adicional?

pesquise apenas o site especificado em search_term

pesquisar apenas em documentos com o tipo search_term

encontrar páginas contendo search_term no título

encontre páginas contendo todas as palavras search_term no título

encontre páginas que contenham a palavra search_term em seu endereço

encontre páginas que contenham todas as palavras search_term em seu endereço

Operador site: limita a pesquisa apenas no site especificado e você pode especificar não apenas o nome do domínio, mas também o endereço IP. Por exemplo, digite:

Operador tipo de arquivo: restringe as pesquisas a arquivos de um determinado tipo. Por exemplo:

Na data deste artigo, o Google pode pesquisar em 13 formatos de arquivo diferentes:

  • Formato de documento portátil da Adobe (pdf)
  • Adobe PostScript (ps)
  • Lotus 1-2-3 (sem 1, sem 2, sem 3, sem 4, sem 5, sem, sem, sem)
  • Lotus Word Pro (lwp)
  • MacWrite(mw)
  • Microsoft Excel (xl)
  • Microsoft PowerPoint (ppt)
  • Microsoft Word (doc)
  • Microsoft Works (wks, wps, wdb)
  • Microsoft Write (escrever)
  • Formato Rich Text (rtf)
  • Flash de Onda de Choque (swf)
  • Texto (ans, txt)

Operador link: mostra todas as páginas que apontam para a página especificada.
Deve ser sempre interessante ver quantos lugares na Internet sabem sobre você. Nós tentamos:

Operador cache: mostra a versão em cache do site do Google, como estava quando o Google visitou a página pela última vez. Pegamos qualquer site que muda com frequência e olhamos:

Operador título: procura a palavra especificada no título da página. Operador allintitle:é uma extensão - procura todas as poucas palavras especificadas no título da página. Comparar:

intitle:voo para marte
intitle:flight intitle:on intitle:mars
allintitle:voo para marte

Operador inurl: faz com que o Google mostre todas as páginas que contêm a string especificada no URL. allinurl: procura todas as palavras em um URL. Por exemplo:

allinurl:acid_stat_alerts.php

Este comando é especialmente útil para aqueles que não possuem o SNORT - pelo menos podem ver como ele funciona em um sistema real.

Métodos de hackers do Google

Assim, descobrimos que, usando uma combinação dos operadores e palavras-chave acima, qualquer pessoa pode coletar as informações necessárias e pesquisar vulnerabilidades. Essas técnicas são frequentemente chamadas de Google Hacking.

mapa do site

Você pode usar o site: declaração para ver todos os links que o Google encontrou no site. Normalmente, as páginas que são criadas dinamicamente por scripts não são indexadas usando parâmetros, então alguns sites usam filtros ISAPI para que os links não fiquem no formulário /article.asp?num=10&dst=5, mas com barras /artigo/abc/num/10/dst/5. Isso é feito para garantir que o site seja geralmente indexado pelos mecanismos de pesquisa.

Vamos tentar:

site: www.whitehouse.gov whitehouse

O Google acha que cada página de um site contém a palavra whitehouse. Isso é o que usamos para obter todas as páginas.
Há também uma versão simplificada:

site: whitehouse.gov

E a melhor parte é que os camaradas do whitehouse.gov nem sabiam que analisamos a estrutura do site e até as páginas em cache que o Google baixou para si. Isso pode ser usado para estudar a estrutura dos sites e visualizar o conteúdo sem ser notado por enquanto.

Listando arquivos em diretórios

Os servidores WEB podem exibir listas de diretórios de servidores em vez de páginas HTML normais. Isso geralmente é feito para forçar os usuários a selecionar e baixar arquivos específicos. No entanto, em muitos casos, os administradores não têm intenção de mostrar o conteúdo de um diretório. Isso ocorre devido a uma configuração incorreta do servidor ou à ausência de uma página mestra no diretório. Como resultado, o hacker tem a chance de encontrar algo interessante no diretório e usá-lo para seus próprios propósitos. Para encontrar todas essas páginas, basta notar que todas elas contêm as palavras: index of em seu título. Mas como o índice de palavras não contém apenas essas páginas, precisamos refinar a consulta e levar em consideração as palavras-chave na própria página, portanto, consultas como:

intitle:index.of diretório pai
intitle:index.of name size

Como a maioria das listagens de diretórios são intencionais, você pode ter dificuldade em encontrar listagens perdidas na primeira vez. Mas pelo menos você poderá usar as listagens para determinar a versão do servidor WEB, conforme descrito abaixo.

Obtendo a versão do servidor WEB.

Saber a versão do servidor WEB é sempre útil antes de iniciar qualquer ataque hacker. Novamente, graças ao Google, é possível obter essas informações sem se conectar a um servidor. Se você observar atentamente a lista de diretórios, poderá ver que o nome do servidor WEB e sua versão são exibidos lá.

Apache1.3.29 - Servidor ProXad em trf296.free.fr Porta 80

Um administrador experiente pode alterar essas informações, mas, via de regra, é verdade. Assim, para obter esta informação, basta enviar um pedido:

intitle:index.of server.at

Para obter informações de um servidor específico, refinamos a solicitação:

intitle:index.of server.at site:ibm.com

Ou vice-versa, estamos procurando servidores rodando em uma versão específica do servidor:

intitle:index.of Apache/2.0.40 Server em

Esta técnica pode ser usada por um hacker para encontrar uma vítima. Se, por exemplo, ele tiver um exploit para uma determinada versão do servidor WEB, ele poderá encontrá-lo e tentar o exploit existente.

Você também pode obter a versão do servidor observando as páginas que são instaladas por padrão ao instalar uma nova versão do servidor WEB. Por exemplo, para ver a página de teste do Apache 1.2.6, basta digitar

intitle:Test.Page.for.Apache.funcionou!

Além disso, alguns sistemas operacionais instalam e iniciam imediatamente o servidor WEB durante a instalação. No entanto, alguns usuários nem estão cientes disso. Naturalmente, se você perceber que alguém não excluiu a página padrão, é lógico supor que o computador não foi submetido a nenhuma configuração e provavelmente está vulnerável a ataques.

Tente procurar por páginas do IIS 5.0

allintitle:Bem-vindo aos Serviços de Internet do Windows 2000

No caso do IIS, você pode determinar não apenas a versão do servidor, mas também a versão do Windows e do Service Pack.

Outra forma de determinar a versão do servidor WEB é procurar manuais (páginas de ajuda) e exemplos que podem ser instalados no site por padrão. Os hackers encontraram algumas maneiras de usar esses componentes para obter acesso privilegiado ao site. É por isso que você precisa remover esses componentes no local de produção. Sem contar o fato de que pela presença desses componentes você pode obter informações sobre o tipo de servidor e sua versão. Por exemplo, vamos encontrar o manual do apache:

inurl:módulos manuais de diretivas do apache

Usando o Google como um scanner CGI.

O scanner CGI ou o scanner WEB é um utilitário para procurar scripts e programas vulneráveis ​​no servidor da vítima. Esses utilitários precisam saber o que procurar, para isso eles possuem uma lista completa de arquivos vulneráveis, por exemplo:

/cgi-bin/cgiemail/uargg.txt
/random_banner/index.cgi
/random_banner/index.cgi
/cgi-bin/mailview.cgi
/cgi-bin/maillist.cgi
/cgi-bin/userreg.cgi

/iissamples/ISSamples/SQLQHit.asp
/SiteServer/admin/findvserver.asp
/scripts/cphost.dll
/cgi-bin/finger.cgi

Podemos encontrar cada um desses arquivos usando o Google, usando as palavras index of ou inurl além do nome do arquivo na barra de pesquisa: podemos encontrar sites com scripts vulneráveis, por exemplo:

allinurl:/random_banner/index.cgi

Com conhecimento adicional, um hacker pode explorar uma vulnerabilidade de script e usar a vulnerabilidade para forçar o script a servir qualquer arquivo armazenado no servidor. Por exemplo, um arquivo de senha.

Como se proteger de ser hackeado pelo Google.

1. Não carregue dados importantes no servidor WEB.

Mesmo se você postou os dados temporariamente, pode esquecê-los ou alguém terá tempo para encontrar e pegar esses dados antes de apagá-los. Não faça isso. Existem muitas outras maneiras de transferir dados que os protegem contra roubo.

2. Verifique seu site.

Use os métodos descritos para pesquisar seu site. Verifique seu site periodicamente para novos métodos que aparecem no site http://johnny.ihackstuff.com. Lembre-se de que, se você deseja automatizar suas ações, precisa obter uma permissão especial do Google. Se você ler com atenção http://www.google.com/terms_of_service.html, então você verá a frase: Você não pode enviar consultas automatizadas de qualquer tipo para o sistema do Google sem permissão prévia expressa do Google.

3. Você pode não precisar que o Google indexe seu site ou parte dele.

O Google permite que você remova um link para seu site ou parte dele de seu banco de dados, bem como remova páginas do cache. Além disso, você pode proibir a pesquisa de imagens em seu site, proibir a exibição de pequenos fragmentos de páginas nos resultados da pesquisa. Todas as opções para excluir um site estão descritas na página http://www.google.com/remove.html. Para isso, você deve confirmar que é realmente o proprietário deste site ou inserir tags na página ou

4. Use robots.txt

Sabe-se que os motores de busca procuram o arquivo robots.txt na raiz do site e não indexam as partes marcadas com a palavra Não permitir. Você pode usar isso para impedir que parte do site seja indexada. Por exemplo, para evitar a indexação de todo o site, crie um arquivo robots.txt contendo duas linhas:

Agente de usuário: *
não permitir: /

O que mais acontece

Para que a vida não pareça mel para você, vou dizer no final que existem sites que seguem aquelas pessoas que, usando os métodos acima, procuram brechas em scripts e servidores WEB. Um exemplo dessa página é

Apêndice.

Um pouco doce. Tente um dos seguintes para você:

1. #mysql dump filetype:sql - procura por dumps do banco de dados mySQL
2. Relatório de Resumo de Vulnerabilidade do Host - mostrará quais vulnerabilidades outras pessoas encontraram
3. phpMyAdmin rodando em inurl:main.php - isso forçará o fechamento do controle via painel phpmyadmin
4. Não para distribuição confidencial
5. Detalhes da Solicitação de Variáveis ​​do Servidor da Árvore de Controle
6. Executando no modo filho
7. Este relatório foi gerado pelo WebLog
8. intitle:index.of cgiirc.config
9. filetype:conf inurl:firewall -intitle:cvs - talvez alguém precise de arquivos de configuração de firewall? :)
10. intitle:index.of finance.xls - hmm....
11. intitle: Índice de bate-papos dbconvert.exe - logs de bate-papo icq
12. intext:Análise de tráfego de Tobias Oetiker
13. intitle:Estatísticas de uso geradas pelo Webalizer
14. intitle:estatísticas de estatísticas avançadas da web
15. intitle:index.of ws_ftp.ini - ws ftp config
16. inurl:ipsec.secrets contém segredos compartilhados - chave secreta - boa descoberta
17. inurl:main.php Bem-vindo ao phpMyAdmin
18. inurl:server-info Informações do servidor Apache
19. site: notas de administração edu
20. ORA-00921: fim inesperado do comando SQL - obter caminhos
21. intitle:index.of trillian.ini
22. intitle: Índice de pwd.db
23. intitle:index.of people.lst
24. intitle:index.of master.passwd
25.inurl:passlist.txt
26. intitle:Index of .mysql_history
27. intitle:index of intext:globals.inc
28. intitle:index.of administrators.pwd
29. intitle:Index.of etc shadow
30. intitle:index.of secring.pgp
31. inurl:config.php dbuname dbpass
32. inurl:executar tipo de arquivo:ini

  • "Hackeando no Google"
  • Centro de treinamento "Informzashchita" http://www.itsecurity.ru - um centro especializado líder na área de treinamento em segurança da informação (Licença do Comitê de Educação de Moscou nº 015470, acreditação estadual nº 004251). O único centro de treinamento autorizado da Internet Security Systems e Clearswift na Rússia e nos países da CEI. Centro de treinamento autorizado da Microsoft (especialização em segurança). Os programas de treinamento são coordenados com a Comissão Técnica Estadual da Rússia, FSB (FAPSI). Certificados de treinamento e documentos estaduais sobre treinamento avançado.

    SoftKey é um serviço exclusivo para compradores, desenvolvedores, revendedores e parceiros afiliados. Além disso, esta é uma das melhores lojas de software on-line da Rússia, Ucrânia, Cazaquistão, que oferece aos clientes uma ampla variedade, muitos métodos de pagamento, processamento rápido (geralmente instantâneo), rastreamento do processo de atendimento do pedido na seção pessoal, vários descontos da loja e fabricantes ON.

    Todo desenvolvedor ASP.NET precisa estar familiarizado com as Diretivas de Página. Se você é iniciante e deseja aprender sobre as Diretivas de Página, pode ler este artigo.

    Então a primeira pergunta é sobre as Diretivas de Página.

    O que é uma Diretiva de Página?

    Basicamente, as Diretivas de Página são comandos. Esses comandos são usados ​​pelo compilador quando a página é compilada.

    Como usar as diretivas em uma página ASP.NET

    Não é difícil adicionar uma diretiva a uma página ASP.NET. É simples adicionar diretivas a uma página ASP.NET. Você pode escrever diretivas no seguinte formato:

    <%@%>

    Veja o formato da diretiva, ele começa com "<%@" and ends with "%>". A melhor maneira é colocar a diretiva no topo da sua página. Mas você pode colocar uma diretiva em qualquer lugar da página. Mais uma coisa, você pode colocar mais de um atributo em uma única diretiva.

    Aqui está a lista completa de diretivas:

    • @Página
    • @Mestre
    • @Ao controle
    • @Importar
    • @Implements
    • @Registro
    • @Conjunto
    • @MasterType
    • @Cache de saída
    • @PreviousPageType
    • @Referência

    Vamos discutir algo sobre cada diretiva.

    Quando você deseja especificar os atributos para uma página ASP.NET, você precisa usar a diretiva @Page. Como você sabe, uma página ASP.NET é uma parte muito importante do ASP.NET, então essa diretiva é comumente usada no ASP.NET.

    <%@Page Language="C#" AutoEventWIreup="false" CodeFile="Default.aspx.cs" Inherits="_Default"%>

    Agora você tem algumas informações sobre as Diretivas @Page. A Diretiva @Master é bastante semelhante à Diretiva @Page. A única diferença é que a diretiva @master é para páginas mestras. Você precisa observar que, ao usar a Diretiva @Master você define a propriedade da página de template, então qualquer página de conteúdo pode herdar todas as propriedades definidas na Página Mestra, mas existem algumas propriedades que só estão disponíveis em uma Página Mestra.

    <%@Master Language="C#" AutoEventWIreup="false" CodeFile="MasterPage1.master.cs" Inherits="MasterPage"%>

    @Ao controle

    @Control cria controles de usuário ASP.NET. Ao usar a diretiva você define as propriedades a serem herdadas pelos controles do usuário e esses valores são atribuídos aos controles do usuário

    <%@Control Language="C#" Explicit="True" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>

    Como você sabe, você precisa definir namespaces em sua classe .cs antes de usar uma classe C# ou VB. Portanto, a diretiva @Import importa namespaces. Essa diretiva suporta apenas um único atributo "namespace" e esse atributo recebe um valor de string que especifica o namespace a ser importado. Uma coisa que você precisa observar é que a diretiva @Import não pode conter mais de um par atributo/valor. Mas você pode usar várias linhas.

    <%@Import Namespace="System.Data"%>

    @Implements

    A Diretiva @Implements faz com que as páginas ASP.NET implementem interfaces de estrutura .Net. Esta diretiva suporta apenas uma interface de atributo único.

    <%@Implements Interface="System.Web.UI.IValidator"%>

    @Registro

    Quando você cria um controle de usuário e arrasta esse controle de usuário para sua página, verá a diretiva @Register. Esta diretiva registra seu controle de usuário na página para que o controle possa ser acessado pela página.

    <%@ Register TagPrefix="MayTag Namespace="MyName.MyNameSpace" Assembly="MyAssembly"%>

    @Conjunto

    A diretiva @Assembly anexa assemblies à página ou a um controle de usuário ASP.NET, portanto, todas as classes e interfaces de assembly estão disponíveis para a classe. Esta diretiva suporta os dois atributos Name e src. O atributo Name define o nome do assembly e o atributo src define a origem do assembly.

    <%@Assembly Name="MyAssembly"%>
    <%@Assembly src="MYAssembly.cs">

    @MasterType

    A diretiva @MasterType conecta um nome de classe à página ASP.NET para obter referências ou membros fortemente tipados contidos na página mestra especificada. Esta diretiva suporta os dois atributos Typename e virtualpath. Typename define o nome da classe derivada da qual obter os membros fortemente tipados ou de referência e virtualpath define o local da página da qual eles são recuperados.

    <%@MasterType VirtualPath="/MasterPage1.master"%>

    @cache de saída

    Ele controla as políticas de cache de saída de uma página ASP.NET.

    <%@ OutputCache Duration ="180" VaryByParam="None"%>
    @Previouspagetype

    Esta diretiva especifica a página da qual se origina qualquer postagem entre páginas.

    @Referência

    Esta diretiva declara que outra página ou mensagem de controle de usuário seja cumprida junto com a página ou controle ativo. Esta diretiva suporta o virtualpath de atributo único. Ele define o local da página ou controle de usuário do qual a página ativa será referenciada.

    <%@Reference VirtualPayh="~/MyControl.ascx"%>

    Palavras finais

    Espero que você obtenha algum conhecimento a partir daqui. Por favor, comente sobre como você gosta deste artigo. Seus comentários são muito valiosos para mim, pois somente você me dirá onde estou errando e quais melhorias preciso fazer para escrever um artigo melhor. Por favor, comente e forneça seu feedback.

    O que é um livro de visitas?

    Claro, aqui estamos falando do livro de visitas mais típico. Em primeiro lugar, trata-se de um sistema que permite ao usuário inserir texto, selecionar uma avaliação de um determinado site e também especificar seus próprios dados (nome, e-mail, http, etc.). É também um sistema de apresentação de dados inseridos por diversos usuários, com possibilidade de navegar, enviar e-mails para os autores das mensagens. Variações também são possíveis com diferentes configurações e com o controle do vocabulário normativo.

    O que nós precisamos

    Obviamente, supõe-se que o leitor esteja familiarizado com os fundamentos da programação ASP e SQL (a familiaridade com as primeiras partes deste artigo será suficiente para isso). Além disso, precisamos do Microsoft SQL Server 7.0 ou 2000, algum editor de HTML ou texto (recomendo usar o Macromedia Dreamweaver UltraDev 4.0) e um pouco de paciência.

    Criando e preparando um banco de dados

    Para organizar o armazenamento dos dados inseridos pelos usuários, você precisa de uma tabela onde possa criar campos para armazenar o nome do usuário, seu endereço de e-mail, país de residência, endereço do site, endereço IP, valor de classificação do usuário do site em uma escala de cinco pontos, etc.:

    Para integrar facilmente o sistema em sites existentes, é recomendável planejar outra tabela para armazenar cores e outras configurações. Isso permitirá que você altere as configurações especificadas no futuro sem alterar os parâmetros correspondentes nos textos de origem dos módulos do aplicativo do livro de visitas.

    • Execute o Configurador ODBC de Fontes de Dados - Iniciar->Configurações->Painel de Controle->Ferramentas Administrativas->Origens de Dados ODBC.
    • Vá para a guia DSN do sistema e crie uma nova fonte de dados clicando em Adicionar…
    • Na lista de drivers exibida, selecione o driver do banco de dados - Microsoft SQL Server e clique em Avançar.
    • Na linha Data Source Name, especifique o nome do seu banco de dados (no exemplo descrito, Gustbook é o nome pelo qual você se referirá a ele no futuro).
    • Na linha Servidor, especifique o servidor ao qual a conexão será feita e clique em Avançar.
    • Selecione o modo de autenticação Com SQL Server…, defina o nome de usuário e a senha para se conectar ao servidor SQL; defina o protocolo de comunicação com o servidor (botão Client Configuration - TCP/IP) e clique duas vezes em Next, depois clique em Finish.
    • Você verá estatísticas sobre as ações realizadas e poderá usar o botão Testar fonte de dados para verificar a fonte de dados.
    • Como resultado, você verá uma linha na lista de fontes de dados em seu sistema.

    Agora que o banco de dados está pronto, você pode prosseguir diretamente para a criação de um livro de visitas.

    Integração do sistema em um site pronto

    É claro que o livro de visitas em si não faz sentido. Julgue por si mesmo: quem precisa de um site projetado exclusivamente para coletar as opiniões dos leitores. Afinal, para coletar opiniões sobre algo, você deve primeiro apresentar esse algo ao julgamento deles. Portanto, é necessário dar atenção especial às questões relacionadas à simplificação da incorporação do sistema em sites prontos.

    Em particular, para facilitar a personalização do sistema para os recursos característicos de um determinado site, é recomendável (como mencionado acima) criar uma tabela especial para armazenar todas essas preferências para inserir determinados valores específicos do seu site afim disso. A vantagem óbvia dessa abordagem é que, para incorporar o sistema em um site já concluído, você não precisa fazer alterações no código-fonte dos módulos, basta alterar as configurações na tabela de banco de dados correspondente.

    Imagine um exemplo da implementação de tal tabela: .

    Como você pode ver, existem campos para armazenar informações sobre o nome e senha para acessar o modo de configuração do sistema, sobre as cores do fundo principal da mensagem do usuário, os quadros superior e inferior (campos Mid_Color, Top_Color, Bot_Color, respectivamente) , sobre a cor e tamanho do cabeçalho do formulário utilizado para inserir os dados do usuário (campos Form_Color e FormTitleSize, respectivamente), sobre a cor, tamanho e estilo da fonte do texto da própria mensagem, campos de informação, bem como as próprias páginas do guestbook (campos MessageFontColor, MessageFontSize, MessageFontFace, InfoFontColor, InfoFontSize, InfoFontFace, PageFontColor, PageFontSize e PageFontFace respectivamente), alterne os campos para habilitar o envio automático de notificações de novas mensagens por e-mail para o responsável (por exemplo, o gerente ou administrador do site), campos para armazenar o endereço de e-mail do responsável, o texto da mensagem com agradecimento pela mensagem deixada pelo usuário, com a lista não são permitidos x palavras e um interruptor para o seu modo de filtragem (se este último estiver habilitado, as palavras na lista de palavras inválidas serão automaticamente substituídas no texto da mensagem por asteriscos e, assim, o controle sobre a normatividade do vocabulário dos textos do site será exercido).

    O desenvolvimento do sistema de integração do livro de visitas implica a organização de uma interface Web para a configuração de todos os parâmetros que consideramos (campos da tabela de administração).

    A integração do sistema em um site já finalizado em sua forma pura pode criar algumas dificuldades tanto na percepção do texto fonte quanto no futuro, se, por exemplo, você precisar desabilitar temporariamente o livro de visitas em um determinado site. Portanto, tentaremos desenvolver o sistema de forma que sua integração no local finalizado não seja difícil. Para isso, é necessário formar um módulo independente do sistema e incluí-lo no texto do site principal quando necessário. Assim, por exemplo, o texto da página do seu site pode ter esta aparência:

    ASP em uma bandeja de prata (Parte - 15) – Livro de visitas

    Como você pode ver, no primeiro caso, a diretiva para incluir uma página com um livro de visitas () é indicado no lugar certo e, no segundo caso, a página do site original é apresentada simplesmente na forma de três elementos incluídos sequencialmente: o início, a página do livro de visitas e o fim. Usar esta ou aquela forma de organizar a estrutura da página do seu site é uma questão de gosto e depende tanto da estrutura do site original quanto do grau de sua complexidade.

    Página principal do livro de visitas (arquivo Guest.asp)

    A aplicação apresentada terá apenas uma página, que servirá tanto para exibir as mensagens do usuário, quanto para navegar e inserir novas mensagens. Dependendo dos valores dos parâmetros-chave, uma ou outra ação será executada e a página estará em um estado ou outro. Antes de tudo, você precisará desenvolver aquela parte dela, que exibirá as mensagens do usuário e que conterá links para a parte que serve para adicionar novas mensagens.

    Primeiro, vamos escrever algumas funções para trabalhar com strings:

    1. A função para substituir uma string vazia por um espaço e uma aspa simples por uma dupla:<% Function ChkString(string) If string = "" then string = " " ChkString = Replace(string, """, """") End Function %>
    2. A função de verificar o vocabulário do texto da mensagem quanto à normatividade. Se as palavras corresponderem a palavras da lista de palavras inválidas, substitua-as por asteriscos:<% Function ChkBadWords(String2) strBadWords = objRec2("BadWords") bwords = split(strBadWords, "|") For i = 0 to ubound(bwords) String2 = Replace(String2, bwords(i), string(len(bwords(i)),"*"), 1,-1,1) Next ChkBadWords = String2 end function %>
    3. A função de formatar o texto inserido pelo usuário. Se necessário (se houver um sinalizador correspondente no banco de dados), o texto será verificado (filtrado) quanto à normatividade:<% Function FormatStr(String) on Error resume next String = Server.HTMLEncode(String) String2 = Replace(String, CHR(13), "") String2 = Replace(String, CHR(10) & CHR(10), "

      ") String2 = Replace(String, CHR(10), "
      ") Se objRec2("BadOn") = True então String2 = ChkBadWords(String2) End if FormatStr = String2 End Function %>

    4. Função de verificação de campo:<% Function ValidateField(sFieldValue, sFieldType) Valid = True Select Case LCase(sFieldType) Case "name" If Len(sFieldValue) = 0 Then Valid = False Case "message" If Len(sFieldValue) = 0 Then Valid = False End Select ValidateField = Valid End Function %>
    5. O procedimento para adicionar novas mensagens (preste atenção em como o endereço IP do computador do qual a mensagem foi enviada é calculado):
    <% Sub Update strSql = "insert into Messages (Name, Country, Email, URL,IP,Message,Rating) values ("" strSql = StrSql & ChkString(Request.Form("name")) & "", "" strSql = StrSql & ChkString(Request.Form("Country")) & "", "" strSql = StrSql & ChkString(Request.Form("email")) & "", "" strSql = StrSql & ChkString(Request.Form("URL")) & "", "" strSql = StrSql & Request.ServerVariables("REMOTE_ADDR") & "", "" strSql = StrSql & ChkString(Request.Form("Message")) & "", "" strSql = StrSql & ChkString(Request.Form("Rating")) & "")" objConn.Execute (StrSql) %>

    Depois disso, os parâmetros de cores, tamanhos, fontes de design são extraídos e aplicados da tabela correspondente:

    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("FormTitleSize")%>">Obrigado por sua entrada em nosso livro de visitas!

    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Clique aqui para ver sua entrada

    Agora, envie um e-mail para o gerente ou administrador notificando-o sobre uma nova entrada no livro de visitas, se necessário:

    <% If Not(Request.Form("email"))="" AND objRec2("AutoEmail")=True then Name = Request.Form("name") Email = Request.Form("email") sFrom = objRec2("YourEmail") sTo=Email sSubject = "Спасибо, Ваша запись в нашей гостевой книге принята!" sMessage = "Дорогой(ая) " & Name & vbcrlf _ & vbcrlf _ & objRec2("ThankMessage") & vbcrlf _ & vbcrlf _ & vbcrlf Set objNewMail = CreateObject("CDONTS.NewMail") objNewMail.Send sFrom, sTo, sSubject, sMessage Set objNewMail = Nothing End If If objRec2("YouEmail")=True then Name = Request.Form("name") Home_Page = Request.Form("url") Email = Request.Form("email") Message = Request.Form("message") Country = Request.Form("Country") Address = Request.ServerVariables("REMOTE_ADDR") Rating = Request.Form("Rating") If Rating ="0" then Rating="No Rating" End If sFrom = objRec2("YourEmail") sTo= objRec2("YourEmail") sSubject = "Новое сообщение" sMessage = "Привет," & vbcrlf _ & "Новое сообщение поступило в гостевую книгу" & vbcrlf _ & vbcrlf _ & ":" & vbcrlf _ & vbcrlf _ & Message & vbcrlf _ & vbcrlf _ & "Детали сообщения:" & vbcrlf _ & "Ваше имя: " & Name & vbcrlf _ & "Email: " & Email & vbcrlf _ & "URL: " & Home_Page & vbcrlf _ & "Страна: " & Country & vbcrlf _ & "Рейтинг: " & Rating & vbcrlf _ & "Адрес: " & Address Set objNewMail = CreateObject("CDONTS.NewMail") objNewMail.Send sFrom, sTo, sSubject, sMessage Set objNewMail = Nothing End If End Sub %>

    Formulário para inserir novos valores

    Também é aconselhável envolver no procedimento a exibição de um formulário usado para adicionar novas mensagens (observe que o formulário é fechado sobre si mesmo, ou seja, o módulo que o contém serve como reação a ele):

    <% Sub ShowForm(Sign) %>

    >
    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("FormTitleSize")%>"> Deixe uma entrada em nosso livro de visitas

    ">* Indica campos que devem ser lembrados

    colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Seu nome: *
    "tamanho=30> <% If dictFields(LCase("name")) Then Response.Write "Você deve inserir um nome
    " Outra resposta. Escreva "
    " Terminar Se %>
    colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> E-mail:
    "tamanho=30>
    colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> URL:
    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> http:// "tamanho=30>
    colspan=2> "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> O país:
    "tamanho=30>
    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Como você avalia nosso site?
    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%> ">Os teus comentários: *
    "color="vermelho" tamanho="-2"><% If dictFields(LCase("message")) Then Response.Write "Вы не ввели сообщение
    " Outra resposta. Escreva "
    " Terminar Se %>
    <% End Sub %>

    Isso é seguido pela função principal para exibir um número fixo de mensagens do usuário (o valor recuperado da tabela de configurações administrativas):

    <% Sub Show NumPerPage=INT(objRec2("NumPerPage")) If Request.QueryString("page") = "" Then iPageCurrent = 1 Else iPageCurrent = CInt(Request.QueryString("page")) End If Set objRec = Server.CreateObject ("ADODB.Recordset") StrSql = "SELECT * FROM Messages ORDER BY ID DESC;" objRec.PageSize = NumPerPage objRec.CacheSize = NumPerPage objRec.Open StrSql,objConn,3,1,&H0001 iPages = objRec.PageCount TotalRows = objRec.RecordCount If iPageCurrent >iPages Então iPageCurrent = iPages Se iPageCurrent< 1 Then iPageCurrent = 1 If iPages = 0 Then Response.Write "Не найденно записей!" Else ObjRec.AbsolutePage = iPageCurrent %>

    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Total no livro <%=TotalRows%> entradas em <%=iPages%> Páginas)

    <% iRecordsShown = 0 Do While iRecordsShown < NumPerPage And Not objRec.EOF Rating = ObjRec("Rating") If IsNull(Rating) or Rating="0" then Rating = "nr" Else Rating = ObjRec("Rating") End If If IsNull(ObjRec("URL")) then Link = "Не указан URL" Else Link = "http://" & ObjRec("URL") & "" End If Email = FormatStr(ObjRec("Email")) Name = FormatStr(ObjRec("Name")) %>
    "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"><%=ObjRec("DateID") %> "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>">Classificação do site: .gif" altura="14" largura="65">
    "> "cor="<%=objRec2("MessageFontColor")%>"tamanho="<%=objRec2("MessageFontSize")%>"><%=FormatStr(ObjRec("Message"))%>
    "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"> <% If IsEmpty(Email) or Email=" " then Response.Write Name Else Response.Write "" & Nome Termina Se %> "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"><%=FormatStr(ObjRec("Country")) %> IP:<%= ObjRec("IP") %> "> "cor="<%=objRec2("InfoFontColor")%>"tamanho="<%=objRec2("InfoFontSize")%>"> <%=Link%>

    <% iRecordsShown = iRecordsShown + 1 objRec.MoveNext Loop if iPages >1 então %>

    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>"> Páginas: <% For I = 1 To iPages If I = iPageCurrent Then Response.Write ""&EU&"" Outra resposta. Escreva " "&EU&"" Terminar na próxima resposta. Escrever "" Else Response.Write " " End If End If objRec.Close Set objRec = Nothing End Sub %>

    Preste atenção em como o link para visualizar a próxima página com essa “porção” de mensagens é formado e implementado:

    Resposta.Escrever" "&EU&" "

    Como você pode ver, o número da página é passado para ele como o valor do parâmetro page e, posteriormente, se esse valor não for igual a 1, a exibição das mensagens não inicia na primeira mensagem, mas na que será seja o primeiro na conta na página com o número correspondente especificado no parâmetro:

    <% NumPerPage=INT(objRec2("NumPerPage")) If Request.QueryString("page") = "" Then iPageCurrent = 1 Else iPageCurrent = CInt(Request.QueryString("page")) End If %>Segue o texto fonte do próprio módulo, no qual a conexão com o banco de dados é feita e os registros são recuperados (no exemplo descrito, este será o único registro) da tabela de configurações administrativas do Admin:<% Set objConn = Server.CreateObject ("ADODB.Connection") objConn.Open StrConn Set objRec2 = Server.CreateObject ("ADODB.Recordset") ConfigSql = "SELECT * FROM Admin;" objRec2.Open ConfigSql,objConn,0,1,&H0001 %>

    Em seguida, você pode estilizar o título e as tags principais da página HTML:

    ASP em uma bandeja de prata parte 15 - livro de visitas DIY

    "cor="<%=objRec2("PageFontColor")%>"tamanho="<%=objRec2("PageFontSize")%>">

    Ver livro de visitas | Deixe uma entrada no livro de visitas

    E, finalmente, o loop principal para processar sua página principal e única asp do módulo ficará assim:

    <% select case Request.QueryString("mode") case "post" Dim Field Dim dictFields Set dictFields = Server.CreateObject("Scripting.Dictionary") For Each Field in Request.Form If ValidateField(Request.Form(Field), Field) = False Then dictFields.Add LCase(Field), True End If Next If Request.Form.Count <>0 E dictFields.Count = 0 Então chame Update Else If Request.Form.Count<>0 Then End If ShowForm("Sign") End If case "show" Call Show case Else Call Show End Select %>

    Apenas dois casos são considerados aqui, correspondentes a duas funções da nossa aplicação Web: adicionar uma nova entrada ao livro de visitas (o valor do parâmetro mode = “post”) e visualizar as mensagens do livro de visitas (o valor do parâmetro mode = “show” ).

    <% objRec2.Close Set objRec2 = Nothing s objConn.Close Set objConn = Nothing Response.Write "

    " %>

    Conclusão

    Consideramos mais um componente funcional do site e imediatamente o tornamos portátil. O resultado disso foi um código-fonte bastante complexo em termos de percepção. Embora um grande número de parâmetros recuperados da tabela administrativa tenha dificultado um pouco a compreensão do código-fonte do módulo, no entanto, usá-los de uma vez por todas evitará que você precise editar o código quando eles forem alterados. O sistema desenvolvido por nós é bastante aceitável em uso e, graças à modularidade de sua implementação e à abordagem de sua implementação em sites existentes descritos no artigo, pode ser usado como um livro de visitas em um site de quase qualquer grau de complexidade .

    Obviamente, a interface da Web para editar, adicionar e excluir configurações administrativas (esquemas) também deve ser considerada, mas isso levará muito tempo e, portanto, o autor tentará cobri-lo em uma das seguintes partes deste artigo.

    ComputerPress 11 "2001