Este post no es una consulta, es para ayudar a otros usuarios.
Bueno, pues estoy siendo acosado por un islamista turco que está jaqueando todas mis Webs colándose en mi gestor de contenido, una vez dentro os podéis imaginar la que me lía en las páginas.
Las páginas estaban desarrolladas en ASP y con bases de datos Access. Esto ya pasó a la historia, las soluciones que he tenido que implementar son las siguientes:
Inclusión de método Captcha
- Solución sacada de
http://www.tipstricks.org/
Función ComprobarCaptcha:
Código ASP:
Ver original<%
' Implementada a trav s del c digo de http://www.tipstricks.org/
' La funci n devuelve verdadero o falso despu s de comprobar el valor captcha
' introducido.
'
' Se le pasan como par metros el valor del m todo post del formulario y el valor
' del bot n reintentar, este deber estar en blanco.
'
'
Function ComprobarCaptcha(request_method, btnretry)
'Iniciamos el valor de la funci n a falso
ComprobarCaptcha = False
'Comprobamos el valor de los par metros.
if request_method = "POST" and IsEmpty(btnretry) then
'La variable de sesi n se crea al crear el gr fico captcha a trav s del archivo
'captcha.asp, si no se ha creado devolvemos falso.
if IsEmpty(Session("ASPCAPTCHA")) or Trim(Session("ASPCAPTCHA")) = "" then
ComprobarCaptcha = False
else
Dim TestValue : TestValue = Trim(Request.Form("txtCaptcha"))
'//Uppercase fix for turkish charset//
TestValue = Replace(TestValue, "i", "I", 1, -1, 1)
TestValue = Replace(TestValue, "I", "I", 1, -1, 1)
TestValue = Replace(TestValue, "i", "I", 1, -1, 1)
'////////////////////
TestValue = UCase(TestValue)
if StrComp(TestValue, Trim(Session("ASPCAPTCHA")), 1) = 0 then
ComprobarCaptcha = True
else
ComprobarCaptcha = False
end if
'//IMPORTANT: You must remove session value for security after the CAPTCHA test//
Session("ASPCAPTCHA") = vbNullString
Session.Contents.Remove("ASPCAPTCHA")
'////////////////////
end if
end if
End Function
%>
La función la tenemos a parte en un include y así deben de ser los formularios:
Código HTML:
Ver original<form method="post" action="admin_loginadmin.asp?login=si"> <li>Usuario :
<input type="text" name="usuario" size="20"/></li> <li>Contraseña:
<input type="password" name="Contrasena" size="10"/></li> <li><img src="captcha.asp" id="imgCaptcha" /></li> <li><input type="text" name="txtCaptcha" id="txtCaptcha" value="" /></li> <li><input type="submit" value="Enviar" name="Enviar"/></li> <li><input type="submit" name="btnRetry" id="btnRetry" value="Cargar de nuevo" /></li>
Esta es la breve explicación que he creado y puesto en mi código para no olvidarme:
Código ASP:
Ver original<!--
Incluye Captcha de http://www.tipstricks.org/
A parte del código de esta página, se tienen que añadir los archivos
captcha.asp y wordlist.asp al raiz de la web, explicamos el por qué de cada archivo
captcha.asp : Es un código en asp que genera un gráfico captcha, el tipo de gráfico que genera
es configurable desde la web del fabricante.
wordlist.asp: Es la lista de las palabras a generar, cogerá una palabra aleatoria de este
fichero para generar el gráfico captcha.
Al formulario de logeo se añade:
<li><img src="captcha.asp" id="imgCaptcha" /></li>
Esta línea crea/genera la imagen Captcha
<li><input type="text" name="txtCaptcha" id="txtCaptcha" value="" /></li>
Es el cuadro de texto donde debemos escribir el captcha, dejamos los mismos
nombres para que el código funcione.
<li><input type="submit" name="btnRetry" id="btnRetry" value="Cargar de nuevo" /></li>
No sé la idea del fabricante, yo he eliminado un script de java para regenerar el gráfico
captcha sin cargar de nuevo la página. Se usa este botón para volver a cargar la página y
que muestre otro gráfico captcha.
En el código sólo tenemos que hacer uso de la función ComprobarCaptcha que devuelve verdadero o falso
después de comprobar el valor introducido en txtCaptcha, se le pasan dos parámetros, el método de envío
del formulario y el valor del botón de reintento.
-->
Siguiente paso: Migración de Access a MySQL
Aún en proceso. Una putada las tildes como siempre y estoy teniendo problemas con las sentencias SQL que no son las mismas, os pongo ejemplos:
El Select Top
n ya no funciona, hay que poner un Limit
n al final, el Delete * tampoco funciona por seguridad y así muchas cosas más.
Lo más jodido son las tildes ahí estamos liado con el utf8 y compañía como siempre.
Siguiente paso: Evitar inyección SQL
El que no sepa de qué trata que pinche
aquí
He creado el siguiente código con la ayuda de
este enlace
He puesto esta función a parte, es la que comprueba que no haya código malicioso en una cadena
Código ASP:
Ver original<%
'''''''''''''''''''''''''''''''''''''''''''''''''''
' This function does not check for encoded characters
' since we do not know the form of encoding your application
' uses. Add the appropriate logic to deal with encoded characters
' in here
'''''''''''''''''''''''''''''''''''''''''''''''''''
Function CheckStringForSQL(str)
On Error Resume Next
Dim lstr, BlackList
BlackList = Array(" or ", "'", "--", ";", "/*", "*/", "@@", "@",_
"char", "nchar", "varchar", "nvarchar",_
"alter", "begin", "cast", "create", "cursor",_
"declare", "delete", "drop", "end", "exec",_
"execute", "fetch", "insert", "kill", "open",_
"select", "sys", "sysobjects", "syscolumns",_
"table", "update")
' If the string is empty, return true
If ( IsEmpty(str) ) Then
CheckStringForSQL = false
Exit Function
ElseIf ( StrComp(str, "") = 0 ) Then
CheckStringForSQL = false
Exit Function
End If
lstr = LCase(str)
' Check if the string contains any patterns in our
' black list
For Each s in BlackList
If ( InStr (lstr, s) <> 0 ) Then
CheckStringForSQL = true
Exit Function
End If
Next
CheckStringForSQL = false
End Function
%>
Y creado este procedimiento:
Código ASP:
Ver original<%
'Este Procedimiento evita la inyección SQL
'Comprueba que los datos de formularios, querystrings y cookies no sean
'maliciosos
' sacado de:
' http://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspxhttp://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspx
Public Sub ComprobarFormulario ()
Dim ErrorPage, s
'
' Below is a black list that will block certain SQL commands and
' sequences used in SQL injection will help with input sanitization
'
' However this is may not suffice, because:
' 1) These might not cover all the cases (like encoded characters)
' 2) This may disallow legitimate input
'
' Creating a raw sql query strings by concatenating user input is
' unsafe programming practice. It is advised that you use parameterized
' SQL instead. Check http://support.microsoft.com/kb/q164485/ for information
' on how to do this using ADO from ASP.
'
' Moreover, you need to also implement a white list for your parameters.
' For example, if you are expecting input for a zipcode you should create
' a validation rule that will only allow 5 characters in [0-9].
'
' Populate the error page you want to redirect to in case the
' check fails.
ErrorPage = "/ErrorPage.asp"
'''''''''''''''''''''''''''''''''''''''''''''''''''
' Check forms data
'''''''''''''''''''''''''''''''''''''''''''''''''''
For Each s in Request.Form
If ( CheckStringForSQL(Request.Form(s)) ) Then
' Redirect to an error page
Response.Redirect(ErrorPage)
End If
Next
'''''''''''''''''''''''''''''''''''''''''''''''''''
' Check query string
'''''''''''''''''''''''''''''''''''''''''''''''''''
For Each s in Request.QueryString
If ( CheckStringForSQL(Request.QueryString(s)) ) Then
' Redirect to error page
Response.Redirect(ErrorPage)
End If
Next
'''''''''''''''''''''''''''''''''''''''''''''''''''
' Check cookies
'''''''''''''''''''''''''''''''''''''''''''''''''''
For Each s in Request.Cookies
If ( CheckStringForSQL(Request.Cookies(s)) ) Then
' Redirect to error page
Response.Redirect(ErrorPage)
End If
Next
End Sub
%>
El procedimiento lo ejecuto en toooooodas las páginas que haya formularios y espero que el dichoso turco islamista me deje en paz.