Redirecionamento de Páginas

Julho 5, 2007

Muito útil para redirecionar para um determinado site após a contagem do clique efetuado no link.

Ex: o usuário clica em um link do site / o link redireciona para uma página interna que após o loop no banco do clique efetuado / utiliza o redirecionador para o site que o link de fato faz referência.

———– Redirecionamento para página ASP ——————–  
  <%  
Response.AddHeader “Refresh”,“2 ; URL=pagina.asp”  
%>  
   
EXPLICAÇÕES  
‘— Componente ————— Tempo —– Caminho –  
‘Response.AddHeader ”Refresh”,”segundos ; URL=pagina.asp  
 —————————————————————-  
================================================================  
—————————————————————-  
  
  
  
———– Redirecionamento para página HTML ——————  
 
Entre as tags <head>  </head> insira o código abaixo:  
  <META HTTP-EQUIV=”Refresh“ CONTENT=”2 ; URL=pagina.html“> 
 
EXPLICAÇÕES 
‘— Componente ——————– Tempo —– Caminho – 
<META HTTP-EQUIV=”Refresh“ CONTENT=”segundos ; URL=pagina.html”>  
   
================================================================  
= DICA: Em ambos os casos o caminho pode ser redirecionado     =  
= para um endereço completo Ex: http://www.codigofonte.com.br  =  
================================================================


Data com dia da semana e mês por extenso

Julho 5, 2007

Para quem precisa exibir a data completa com dia da semana e mês por extenso para saudação ou mesmo para noticias está ai um otimo código.

Ex:
Response.Write(ExibeData(objRS(“data”)))
Ex2:
Response.Write(ExibeData(Now()))

<%  
Function ExibeData(data)  
  dia_semana = WeekDay(data)  
  Select Case dia_semana  
  Case 1 : dia_semana = “Domingo”  
  Case 2 : dia_semana = “Segunda-Feira”  
  Case 3 : dia_semana = “Terça-Feira”  
  Case 4 : dia_semana = “Quarta-Feira”  
  Case 5 : dia_semana = “Quinta-Feira”  
  Case 6 : dia_semana = “Sexta-Feira”  
  Case 7 : dia_semana = “Sábado”  
  End Select  
  mes = Month(data)  
  Select Case mes  
  Case 1 : mes = “Janeiro”  
  Case 2 : mes = “Fevereiro”  
  Case 3 : mes = “Março”  
  Case 4 : mes = “Abril”  
  Case 5 : mes = “Maio”  
  Case 6 : mes = “Junho”  
  Case 7 : mes = “Julho”  
  Case 8 : mes = “Agosto”  
  Case 9 : mes = “Setembro”  
  Case 10 : mes = “Outubro”  
  Case 11 : mes = “Novembro”  
  Case 12 : mes = “Dezembro”  
  End Select  
  ExibeData = dia_semana & “, ” & Day(Date()) & “ de ” & mes & “ de ” & Year(data)  
End Function  
  
‘ Exemplo  
Response.Write(ExibeData(now()))  
%> 


Validar CPF com expressão regular

Julho 5, 2007

Esta função é muito útil na validação do CPF passado por parâmetro.

A função também verifica se o CPF está digitado no formato correto utilizando Expressão Regular.

Na função o CPF pode ser digitado em 2 formatos diferentes:
XXXXXXXXX-XX ou XXX.XXX.XXX-XX.

<%  
‘—————————————————–  
‘Funcao: IsCPF(ByVal intNumero)  
‘Sinopse: Verifica se o valor passado é um CPF válido  
‘          Formatos aceitos: XXX.XXX.XXX-XX ou  
‘                            XXXXXXXXXXXXXX  
‘Parametro: intNumero  
‘Retorno: Booleano  
‘Autor: Gabriel Fróes - www.codigofonte.com.br  
‘—————————————————–  
Function IsCPF(ByVal intNumero)  
    ‘Validando o formato do CPF com expressão regular  
    Set regEx = New RegExp                            ‘Cria o Objeto Expressão  
    regEx.Pattern = “d{3}.?d{3}.?d{3}-?d{2}”    ‘ Expressão Regular  
    regEx.IgnoreCase = True                            ‘ Sensitivo ou não  
    regEx.Global = True  
    Retorno = RegEx.Test(intNumero)  
    Set regEx = Nothing  
  
    ‘Caso seja verdadeiro posso validar se o CPF é válido  
    If Retorno = True Then  
        ‘Validando a sequencia números  
        Dim CPF_temp  
        CPF_temp            = intNumero  
        CPF_temp            = Replace(CPF_temp, “.”“”)  
        CPF_temp            = Replace(CPF_temp, “-”“”)  
        CPF_Digito_temp        = Right(CPF_temp, 2)  
          
        ‘Somando os nove primeiros digitos do CPF  
        Soma    = (Clng(Mid(CPF_temp,1,1)) * 10) + (Clng(Mid(CPF_temp,2,1)) * 9) + (Clng(Mid(CPF_temp,3,1)) * 8) + (Clng(Mid(CPF_temp,4,1)) * 7) + (Clng(Mid(CPF_temp,5,1)) * 6) + (Clng(Mid(CPF_temp,6,1)) * 5) + (Clng(Mid(CPF_temp,7,1)) * 4) + (Clng(Mid(CPF_temp,8,1)) * 3) + (Clng(Mid(CPF_temp,9,1)) * 2)  
        ‘———————————-  
        ‘Calculando o 1º dígito verificador  
        ‘———————————-  
        ‘Pegando o resto da divisão por 11  
        Resto    = (Soma Mod 11)  
          
        If Resto = 1 Or Resto = 0 Then  
            DigitoHum = 0  
        Else  
            DigitoHum = Cstr(11-Resto)  
        End If  
        ‘———————————-  
        ‘———————————-  
        ‘Calculando o 2º dígito verificador  
        ‘———————————-  
        ‘Somando os 9 primeiros digitos do CPF mais o 1º dígito  
        Soma    = (Clng(Mid(CPF_temp,1,1)) * 11) + (Clng(Mid(CPF_temp,2,1)) * 10) + (Clng(Mid(CPF_temp,3,1)) * 9) + (Clng(Mid(CPF_temp,4,1)) * 8) + (Clng(Mid(CPF_temp,5,1)) * 7) + (Clng(Mid(CPF_temp,6,1)) * 6) + (Clng(Mid(CPF_temp,7,1)) * 5) + (Clng(Mid(CPF_temp,8,1)) * 4) + (Clng(Mid(CPF_temp,9,1)) * 3) + (DigitoHum * 2)  
        ‘Pegando o resto da divisão por 11  
        Resto    = (Soma Mod 11)  
          
        If Resto = 1 Or Resto = 0 Then  
            DigitoDois = 0  
        Else  
            DigitoDois = Cstr(11-Resto)  
        End If  
        ‘———————————-  
        ‘Verificando se os digitos são iguais aos digítados.  
        DigitoCPF = Cstr(DigitoHum) & Cstr(DigitoDois)  
        If Cstr(CPF_Digito_temp) = Cstr(DigitoCPF) Then  
            Retorno = True  
        Else  
            Retorno = False  
        End If  
    End If  
    IsCPF = Retorno  
End Function  
%> 


Descobrir o país a partir do endereço IP

Julho 5, 2007

Descobrir o país a partir do endereço IP

<%
Option Explicit
‘Declarando das Variáveis
Dim ip

‘Requisitando os parâmetros
ip = Request.Form(“ip”)

Public Function getPaisFromIP(ByVal ip)
‘Declarando das Variáveis
Dim objCon
Dim objRs
Dim ipLongo
Dim bdAccess
Dim sql

‘Convertendo o IP para Longo
ipLongo = convertIPToLongo(ip)

‘Abrindo Conexão com o Banco de Dados
bdAccess = Server.Mappath(“ipPaises.mdb”)
Set objCon = Server.CreateObject(“ADODB.Connection”)
objCon.open “PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=” & bdAccess & “;”

‘Query para descobrir o país do IP
sql = “SELECT TBIP.*, TBPAISES.PAIS FROM TBIP INNER JOIN TBPAISES ON TBIP.SIGLA_PAIS = TBPAISES.SIGLA_PAIS WHERE “ & ipLongo & ” BETWEEN IP_INICIO AND IP_FIM”

‘Executando a Query
Set objRs = Server.CreateObject(“ADODB.RecordSet”)
Set objRs = objCon.execute(sql)

If Not objRs.EOF Then
getPaisFromIP = objRs(“PAIS”) & ” (“ & objRs(“SIGLA_PAIS”) & “)”
Else
getPaisFromIP = “Não encontrado.”
End If

‘Destruição dos objetos
objRs.close
objCon.close
set objRs = Nothing
Set objCon = Nothing
End function

Function convertIPToLongo (ByVal ip)
Dim Cont
Dim Pos
Dim AntPos
Dim Num

If ip = “” Then
convertIPToLongo = 0
Else
For Cont = 1 To 4
Pos = InStr(AntPos + 1, ip, “.”, 1)
If Cont = 4 Then
Pos = Len(ip) + 1
End If
Num = Int(Mid(ip, AntPos + 1, Pos – AntPos – 1))
AntPos = Pos
convertIPToLongo = ((Num Mod 256) * (256 ^ (4 – Cont))) + convertIPToLongo
Next
End If
End Function
%>
<!DOCTYPE html PUBLIC ‘-//W3C//DTD XHTML 1.0 Transitional//EN’ ‘http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd’>
<html xmlns=“http://www.w3.org/1999/xhtml” xml:lang=“pt” lang=“pt-br”>
<head><title>DEMO : Descobrir o País a partir do IP</title></head>
<style>body{font:normal 12px tahoma}</style>
<body>
<h1>DEMO : Descobrir o País a partir do IP</h1>
Digite o Endereço IP (xxx.xxx.xxx.xxx)<br />
<form action=“<%=Request.ServerVariables(“SCRIPT_NAME“)%>” method=“POST”>
<input type=“text” size=“20″ name=“ip” />
<input type=“submit” value=“Enviar” />
<form>
<%If Len(ip) > 10 Then%>
<h2>Resultado:</h2>
Endereço IP: <b><%=ip%></b><br />
País: <b><%=getPaisFromIP(ip)%></b>
<%Else%>
<br />IP Inválido.
<%End If%>
</body>
</html>

Créditos do criador do código fonte: http://www.codigofonte.com.br/codigo/asp/ambiente/descobrir-o-pais-a-partir-do-endereco-ip


Forçar Submit

Dezembro 27, 2006

Caso deseje forçar a ação submit no javascript sem utilizar o botão Submit (como acrescentar a ação em uma Combo ou em um Button) basta acrescentar o código abaixo no evento interessado:

 <select name=”cmbItem” onChange=”document.forms[0].submit();”>

No exemplo acima a ação submit envia os dados após a mudança de valores na combo Item.


Evitando Injeção SQL (parte 3)

Novembro 14, 2006

A seguir algumas orientações de como você pode evitar um ataque de injeção SQL :

1- Estabeleça uma política de segurança rígida e criteriosa limitando o acesso dos seus usuários. Isto quer dizer que você deve dar somente os poderes necessários aos seus usuários. Não de acesso de escrita a tabelas e dê somente acesso as tabelas que o usuário vai precisar.

2- Faça a validação da entrada de dados no formulário e não permita os caracteres inválidos como : (‘) , (–) e (;) nem de palavras maliciosas como insert , drop , delete, xp_ . Abaixo algumas funções que você pode usar:

- Substituindo o apóstrofe(‘) pelo duplo apóstrofe (”)

<%
Function ExpurgaApostrofe(texto)
ExpurgaApostrofe = replace( texto , “‘” , “””)
End function
%>

- Substituindo os caracteres e palavras maliciosas por vazio(“”).

<%
Function LimpaLixo( input )

dim lixo
dim textoOK

lixo = array ( “select” , “drop” , ”;” , “–” , “insert” , “delete” , ”xp_”)

textoOK = input

for i = 0 to uBound(lixo)
textoOK = replace( textoOK , lixo(i) , “”)
next

LimpaLixo = textoOK

end Function
%>

- Rejeitando os dados maliciosos:

<%
Function ValidaDados( input )

lixo = array ( “select” , “insert” , “update” , “delete” , “drop” , “–” , “‘”)

ValidaDados = true

for i = lBound (lixo) to ubound(llixo)
if ( instr(1 , input , lixo(i) , vbtextcompare ) <> 0 ) then
ValidaDados = False
exit function}
end if
next
end function
%>

3- Limite a entrada de texto para o usuário no formulário de entrada de dados. Se o campo nome deve ter somente 10 caracteres restrinja a isto a entrada de dados no formulário. O mesmo vale para a senha.

4- Faça o tratamento adequado de erros não permitindo que mensagens de erros exponham informações sobre a estrutura dos seus dados.

5- Faça um log para auditoria dos erros ocorridos e das operações mais importantes da aplicação.

Segurança é coisa séria e vale a pena tomar todas as precauções a nosso alcance para preservar nossos dados e nossos empregos.

Fonte: www.macoratti.com.br


Evitando Injeção SQL (parte 2)

Novembro 10, 2006
NomeSenha

 

<form
nam
e="frmLogin" action="login.asp" method="post">Nome : <input type=”text” name=”nomeUsuario”>Senha: <input type=”text” name=”senhaUsuario”>

<input type=”Enviar”>

</form>

Geralmente quando o usuário clicar no botão – Enviar – o script login.asp será executado para efetuar a validação dos dados informados. Abaixo temos um script típico para um arquivo de validação de informações:

<%
dim nomeUsuario, senhaUsuario, consulta
dim conn, rS

nomeUsuario = Request.Form(“nomeUsuario”)
senhaUsuario = Request.Form(“senhaUsuario”)

set conn = server.createObject(“ADODB.Connection”)
set rs = server.createObject(“ADODB.Recordset”)

consulta = “select count(*) from usuarios where nomeUsuario=’” & nomeUsuario & “‘ and senhaUsuario=’” & senhaUsuario & “‘”

conn.Open “Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=myDB; User Id=sa; senhaUsuario=”

rs.activeConnection = conn
rs.open consulta

if not rs.eof then
response.write “Acesso Concedido”
else
response.write “Acesso Negado”
end if
%>

Vamos analisar o que ocorre quando um usuário tenta se autenticar. Vamos supor que ele é usuário cadastrado com nome Macoratti e senha 123456 (só suposição). Ao informar o nome e a senha e clicar no botão Enviar o script do arquivo login.asp será executado. Vamos ver como ficou a instrução SQL montada neste caso :

select count(*) from usuarios where nomeUsuario=’macoratti’ and senhaUsuario=’123456′

Neste caso o usuário macoratti, senha 123456 será autenticado e terá acesso ao sistema. Tubo bem ?

Não , se você usa este tipo de instrução SQL nada esta bem pois o texto final da consulta SQL depende inteiramente do conteúdo das variáveis , e , se o conteúdo destas variáveis não for validado e tratado o texto final concatenado poderá ser um SQL adulterado através de uma injeção SQL.

Quer ver ? Vou começar pegando leve. Vamos supor que um hacker decidiu invadir sua página. Uma das primeiras coisas que ele pode fazer é tentar uma injeção SQL , e, vai começar verificando se você esta tratando o apóstrofe (aspa simples: ‘). Se você não sabe a presença de um caractere de apóstrofe (‘) no conteúdo de uma variável concatenada no SQL é usada para delimitar strings de texto. Então suponha que ele digite os seguintes dados nos campos nome e senha:

nome = tes’te
senha =

Se você não tratar o apóstrofe vai ocorrer um erro de SQL (incorrect Sintax) ,e , vendo isto o hacker vai ficar mais animado…

Agora vou pegar pesado. Suponha então que a seguir ele digite os seguintes dados

nome = ‘ ; drop table users–
senha =

Este comando irá excluir a tabela users (se ela existir). E se você pensa que é muito difícil o hacker adivinhar o nome da sua tabela vou mostrar mais abaixo que ele pode fazer isto de uma maneira simples. Isto é possível pois o caractere (;) indica o fim de uma consulta e o começo de outra em T-SQL , e , o caractere (–) no final da linha faz com que o scrpt ASP seja executada sem erro.

Continuando o ataque , ele pode também informar o seguinte :

nome = admin
senha = ‘ or 1=1–

veja como vai ficar a consulta SQL montada:

select count(*) from usuarios where nomeUsuario=’admin’ and senhaUsuario=” or 1=1–’

Aqui a consulta irá verificar se o nome do usuário é admin e se senha é vazio ou 1 for igual a 1 ( o que é verdade) ; bingo, se existir um usuário admin ele entrou no seu sistema.

Ele pode também tentar o seguinte :

nome = ‘ or 1=1–
senha =

a consulta SQL montada será :

select count(*) from usuarios where nomeUsuario=” or 1=1 –’ and senhaUsuario=”

e bingo , ele burlou o seu sistema.

O hacker pode também tentar o seguinte :

nome = ‘ OR “=’
senha = ‘ OR “=’

e a consulta SQL montada será :

select count(*) from usuarios where nomeUsuario=” OR “=” AND senhaUsuario=” OR “=”

a consulta agora esta fazendo a comparação : OR “=” que é sempre verdadeira. Bingo ele entrou no seu site.

Para saber o nome das tabelas e campos o hacker pode fazer o seguinte :

nome = ‘ having 1=1–
senha =

isto pode causar o seguinte erro:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14′

[Microsoft] [ODBC SQL Server Driver] [SQL Server] Column ‘usuarios.codigo’ is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

/login.asp , line 28

e bingo , o hacker agora sabe que o nome da tabela é usuarios e o nome do campo relacionado no formulário como nome é codigo.

E então , o que você acha que ele vai fazer ? Fazer a mesma coisa para o campo senha e então ele vai saber o nome da tabela e dos campos relacionados ao formulário. Imagine o estrago que ele não será capaz de fazer agora…

Pensa que ele pode ficar somente nisto. Já conhecendo o nome da tabela e das colunas se o hacker quiser saber o tipo de dados do campo ele pode fazer o seguinte :

nome = ‘ UNION SELECT SUM(nomeUsuario) FROM usuarios–
senha =

como o SQL Server vai tentar aplicar a cláusula SUM antes de determinar se o número dos campos nas duas colunas é igual. Ao tentar fazer um SUM em um campo texto o sistema pode emitir a seguinte mensagem de erro:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e7′

[Microsoft] [ODBC SQL Server Driver] [SQL Server] The Sum or average aggregate operation cannot take a varchar data type as na argument.

/login.asp , line 109

e bingo de novo , ele agora sabe o tipo de dado do campo nomeUsuario.

Agora sabe o que ele vai fazer ? Vai inserir um usuário com nome senha para se logar , assim :

nome = ‘ ; INSERT INTO usuarios VALUES(‘hacker’,'111111′)–
senha =

e bingo , ele vai se logar como hacker e senha 111111.

Acho que com estes exemplos já deu para você perceber que você tem que cuidar com muito mais cuidado das suas instruções SQL .Tenha certeza de uma coisa : as possibilidades do hacker são muitas.

Fonte: www.macoratti.net


Evitando Injeção SQL (parte 1)

Novembro 3, 2006

A SQL – Structured Query Language – é largamente usada para interagir com banco de dados relacionais. Se você considerar que 90% das aplicações utilizam banco de dados com suporte a SQL vai concluir que o uso da SQL é quase uma unanimidade por ser prática , fácil e portátil.

Em se falando de aplicações Web temos uma grande utilização de banco de dados para armazenar as mais diversas informações : endereços e documentos pessoais , contas e valores financeiros , números de cartões de crédito , dados empresariais , etc.

Ao colocar sua aplicação na Web você a esta expondo a um acesso mais amplo e indiscriminado. Afinal qualquer um que tenha acesso a url do site terá acesso a sua aplicação e aos dados que ela disponibiliza. Pensando na segurança de suas informações as empresas investem pesado em firewalls , certificação digital e outros recursos , com o objetivo de se proteger de invasores.

Para que o controlar o acesso as informações normalmente restringe-se o acesso aos usuários cadastrados usando um nome e senha para identificação ; estes dados são colhidos através de um formulário de login e são então verificados com as informações armazenadas em um banco de dados dos usuários cadastrados; se estiverem corretas o acesso é permitido caso contrário o acesso é negado.

É assim que funciona o home banking na internet e uma infinidade de outras aplicações web na qual o acesso é restrito.

Você pode ter o aparato mais moderno em termos de tecnologia de segurança protegendo o seu site de um ataque hacker e nem se dar conta de que a vulnerabilidade da sua aplicação esta ali naquele formulário de login. Ele pode ser a porta de entrada para ataques maliciosos através da injeção de SQL.

A injeção SQL ocorre quando um invasor consegue inserir comandos SQL na instrução SQL que você usa no seu script de modo a burlar a restrição e ter acesso ou danificar as informações armazenadas no seu banco de dados.

Neste artigo eu vou mostrar como a injeção de SQL ocorre e falar sobre algumas das medidas que você pode tomar para evitá-la. Embora as informações sejam focadas em páginas ASP e banco de dados SQL Server /Access elas se aplicam a qualquer script e banco de dados que usam um dialeto SQL.


Lendo todos Cookies do site

Outubro 3, 2006

Recurso interessante que possibilita a leitura de todos os cookies criados por seu site:

<%
for each cookie & “=” & Request.Cookies(cookie) & “<br>”
Response.Write cookie & “=” & Request.Cookies (“nome”) & “<br>”
next
%>


Submit com duas funções Return

Setembro 21, 2006

Já se deparou diante um código em Javascript onde é necessário a verificação de duas funções antes de dar um submit?

Para isso é necessário digitar apenas um return definindo as funções obrigatórias entre parênteses.

<form method=”post” action=”salva.asp” onSubmit=”return (validaEmail(txtUsEmailCorporativo) && validaForm());”>

Guarde isso pois vai precisar usar um dia.