Na programação ASP, pode-se dizer que a autenticação de identidade é comumente usada. Mas como podemos alcançar segurança de autenticação?
Página de envio do formulário: sub.htm
<html>
<cabeça>
<title>Login de administrador</title>
<corpo>
<form name="form1" method="post" action="sub.asp">
<p>Administrador:
<input type="text" name="UserID" size="25" maxlength="20">
senha:
<input type="text" name="Pass" size="12" maxlength="20">
<input type="submit" name="Enviar" value="Enviar">
</p>
</form>
</body>
</html>
Programa SUB.asp
<%
Receber dados do formulário
usuário=request.from("ID do usuário")
Verifique se os dados enviados pelo formulário estão vazios (você pode usar JAVASCRIPT ou VBSCRIPT para controlar a página do formulário, mas não esqueça de controlá-la aqui!
se usuário="" então
Vá para a página da mensagem de erro!
resposta.redirect "err1.htm"
Esta frase pode não ser útil, mas é bom adicioná-la!
resposta.fim
terminar se
pass=request.from("Passar")
se passar = "" então
resposta.redirect "err2.htm"
resposta.fim
terminar se
Junte-se ao banco de dados
arquivo=server.mappath("seu banco de dados")
definir conn=server.createobject("adodb.connection")
dr="driver={driver de acesso microsoft (*.mdb)};dbq="&arquivo
conn.open dr
definir rs=server.createobject("adodb.recordset")
A chave é a linguagem SQL aqui
sql="selecione * da tabela onde user= "&user&" e pass= "&pass&" "
rs.opensql
se não rs.eof então
Se você encontrar, vá para a página de gerenciamento.
resposta.redirect "login.asp"
outro
Se não for encontrado, você entrará em uma página de erro.
resposta.write "err3.htm"
terminar se
%>
Todos acham que o código acima deveria servir, mas há um sério risco de segurança aqui:
Se eu quiser fazer login como administrador, posso inseri-lo na caixa de entrada do formulário SUb.htm:
Digite na primeira caixa de texto: a ou 1 = 1 ou OR =
Insira na segunda caixa de texto: a ou 1 = 1 ou OR =
Enviar, todos verão... "Ah, me escute, ok, vou jogar os tijolos mais tarde..."
"a" e "1" são caracteres.
Algumas pessoas podem perguntar por que você entra como administrador quando insere esses caracteres. ?
Na verdade, esses caracteres são um engano da linguagem SQL em seu programa. Para quem inseriu com sucesso,
consulte: Ao iniciar o programa SQL, a tabela é consultada em busca de registros que atendam ao usuário= "&user&" e pass= ". &pass&" "condições
sql="select * from table where user= "&user&" and pass= "&pass&" "
Depois de inserir o código acima, ele se tornou:
sql="select * from table where user= a or 1 = 1 e pass= a ou 1 = 1 "
Vejamos, há algum motivo para não entrar? ? Dê-me um motivo para não entrar!
O mesmo é verdade se o campo USER PASS acima for numérico!
Solução:
1.
Use REPLACE Substitua caracteres especiais no conteúdo inserido pelo usuário para atingir fins de controle! sql="select * from table where user= "&replace(user," "," ")&" and pass= "&replace(pass," "," ")& " "
Este método só pode substituir um caractere por vez. Na verdade, os caracteres perigosos não são apenas " ", mas também caracteres como ">", "<", "&", "%" e assim por diante. deve ser totalmente controlado Mas o que devo fazer se a função REPLACE não for adequada
2. O método de controle do programa
utiliza um programa para controlar todo o conteúdo inserido pelo cliente, para que quaisquer possíveis caracteres ou códigos perigosos inseridos pelo usuário possam? seja totalmente controlado, este é o meu método!
<%
Capture o conteúdo do formulário enviado pelo usuário
usuário=request.from("usuário")
pass=request.from("pass")
...
O controle de loop começa
para i=1 para len(usuário)
Use a função MID para ler um caractere na posição i na variável user
us=mid(usuário,i,1)
Comparar caracteres lidos
se us=" " ou us="%" ou us="<" ou us=">" ou us="&" então
Se contiver os caracteres acima, aparecerá uma mensagem de erro. Não pode conter os caracteres especiais acima.
resposta.redirect "err2.htm"
resposta.fim
terminar se
próximo
...
%>