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


Transação de Dados

Outubro 13, 2006

O MSSqlServer usa um registro de transações onde são registradas praticamente todas as alterações efetuadas no banco de dados, isso permite que as alterações sejam revertidas caso haja problemas


Transações ADO

Outubro 13, 2006

O objeto ADO Connection tem três métodos (begintrans, committrans e rollbacktrans) que permitem o gerenciamento das transações. Para inciar uma transação chame o método begintrans(), para finalizar um transação chame o método committrans() e para abortar uma transação chame o método rollbacktrans(). Ex:

<%
… cria conexão
conexao.BeginTrans
varSql = “update ..”
conexao.execute varSql
conexão.commitTrans
%>


Transações em páginas Asp

Outubro 13, 2006

Em uma página asp transacional as modificações feitas dentro da página são automaticamente suspensas caso ocorra um erro ou a transação seja explicitamente abortada. Tanto o IIS quanto o PWS utilizam o Microsoft Transaction Server para gerenciar as transações efetuadas em uma página asp.
É importante entender que o MTS só aceita determinados tipos de transação, por exemplo, o MTS não reverte alterações efetuadas em variáveis Application ou Session, no sistema de arquivo ou em componentes que não foram projetados para suportar transações. Em geral, utiliza-se uma página asp transacional para reverter apenas alterações em bancos de dados, especificamente SQL Server.
Você cria uma página asp transacional incluído uma diretiva @transaction na parte superior da página. A diretiva @transaction deve vir logo na primeira linha da página. Ex:

<%@ transaction=required %>
<%
Sub OnTransactionAbort
response.write “um erro ocorrido”
end sub
%>
<html> …


Entendendo Transações

Outubro 9, 2006

Transação é a realização de todas as etapas para a execução de um objetivo. Um exemplo de transação é a transferência de dinheiro entre contas, por exemplo, a transferência de dinheiro de uma conta para outra pelo caixa eletrônico. Se você transferir dinheiro da conta corrente para a poupança, será preciso corrente e a mesma quantia deve ser creditada na conta poupança. No entanto, se a primeira etapa tiver sido finalizada e a segunda não, a quantia especificada desaparecerá e jamais será encontrada novamente.
O uso de transações resolvem esse problema, se uma das etapas da transação falhar, todas as outras serão interrompidas e o dinheiro será novamente creditado em sua conta corrente.
Existe três métodos diferentes para usar transações dentro de uma página ASP: criar asp transacionais, transações ADO ou usar bancos de dados de transações.


Cachesize

Setembro 6, 2006

A propiedade Cachesize indica quantos registros são armazenados no cache da memoria local por vez.

Por default, o Cachesize está configurado para 1 (registro) mas isto pode ser modificado por qualquer valor inteiro maior que zero.

Mudar o valor da Cachesize antes de abrir um conjunto de registros irá fazer com que o servidor de dados busque primeiro a quantidade informada de registros no buffer de memoria local o que pode aumentar consideravelmente a performance.

Exemplo:

<% Recordset.Cachesize= tamanho %>


Paginação

Agosto 9, 2006

Paginar registros significa dividir um conjunto de registros em diversas páginas.

O objeto RecordSet possuí três propriedades que permitem dividir o resultado de consultas:

  1. AbsolutePage – Define ou retorna a página corrente atual de registros;
  2. PageCount – Retorna o total de páginas em um conjunto RecordSet;
  3. PageSize – Define ou retorna o número de registros contidos em uma única página (o padrão é 10);

Exemplo de exibição de registros em diversas páginas

<%
‘Verificar a página atual
varPagina = Request(“pagina”)
if varPagina = “” then
varPagina = 1
end if

‘Criar conexão definindo o número de registros por página
Set rs = Server.CreateObject(“ADODB.RecordSet”)
rs.ActiveConnection = conexao
rs.CursorType = adOpenOptimistic
rs.PageSize = 5 ‘define número de registros em uma página
rs.open “select …”

‘Definir a página que será exibida e imprimir os reginstros na mesma
rs.AbsolutePage = varPagina ‘define qual página será exibida
do while rs.eof = false and varNumLinhas < rs.PageSize
‘imprime
rs.MoveNext
loop

‘ Imprimindo links com números de página
Response.Write “página atual …”
if rs.PageCount > 1 then
‘imprime o rodapé com o link das páginas
for i = 1 to rs.PageCount
response.Write (i)
next
else
Response.Write “1”
end if
%>


Métodos de um RecordSet (CursorLocation, CursorType, LockType)

Agosto 2, 2006

CursorLocation

2 : Modo servidor
3 : Modo cliente (o mais rapido)

CursorType

0 : Somente leitura (o mais rápido entre todos)
1 : Não permite visualizar registros incluídos ou excluídos por outros usuários
2 : Exclusões, inclusões e alterações nos registros são visíveis (o mais lento de todos)
3 : Permite somente adicionar um registro, inclusões, alterações e exclusões feitas por outros não são visíveis

LockType

1 : Somente leitura, não permite alterações
2 : Bloqueia os registros na fonte após a edição
3 : Bloqueia os registros somente quando se chama o método “Update”
4 : Requerido quando se usa o modo “Batch Update”

Abrindo um RecordSet

<%
Set rsClientes = Server.CreateObject(“ADODB.Recordset”)
rsClientes.CursorLocation = 3
rsClientes.CursorType = 0
rsClientes.LockType = 1
strSQL = “SELECT * FROM Clientes“
rsClientes.Open strSQL, conexao
%>