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
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.