Categories
AJAX PHP Seguridad Varios

Problema de seguridad en Relay

Hoy, mientras intentaba personalizar Relay -que es un gestor de archivos basado en Ajax- para hacer que funcione como un navegador de código fuente, encontré un bug en la función getFileInfo (relay.php) que permite hacer SQL Injection.

La porción donde se encuentra la falla es: (~ línea 763)

php:

$fileid=mysql_escape_string($fileid);
$query = "select * fr0m $GLOBALS[tablePrefix]filesystem where id=$fileid";

El problema radica en que mysql_escape_string o mysql_real_escape_string sólo escapan los caracteres \x00, \n, \r, \, ', " y \x1a.; por tanto, si $fileid tendría el valor 0 or 1=1 u otra sentencia que no incluya los caracteres mencionados, ya se imaginarán que puede pasar.

Una propuesta para solucionar este problema es hacer un cast explícito de $fileid o encerrar entre comillas el valor de este parámetro en la consulta SQL (digo esto porque se hace uso de mysql_escape_string)

php:

$fileid=intval($fileid);
$query = "select * fr0m $GLOBALS[tablePrefix]filesystem where id=$fileid";

// o   
$fileid=mysql_real_escape_string($fileid);
$query = "select * fr0m $GLOBALS[tablePrefix]filesystem where id='$fileid'";

Si están utilizando Relay, es recomendable que corrijan este error, para evitar molestias por pérdida de datos :-P.

Categories
.NET AJAX ASP.NET

Videos sobre Atlas

Para los interesados, Luis Abreu publicó unos cuantos videos básicos sobre la utilización de Atlas, también está disponible el código fuente de los ejemplos mostrados en éstos.

Categories
.NET AJAX ASP.NET

Script#

Script#, al igual que Google Web Toolkit, permite generar código javascript, utilizando en este caso cualquier lenguaje compatible con el .NET Framework.

csharp:

// Demo.cs
using System;
using ScriptFX;
using ScriptFX.UI;

namespace HelloWorld {

    public class Demo : IScriptlet {

        private Button _okButton;
        private XMLHttpRequest _request;

        public void Start() {

            _okButton = new Button(Document.GetElementById("okButton"));
            _okButton.Click += new EventHandler(this.OnOKButtonClick);
        }

        private void OnOKButtonClick(object sender, EventArgs e) {
            Callback completedCallback = new Callback(this.OnRequestComplete);

            _request = new XMLHttpRequest();
            _request.Onreadystatechange = Delegate.Unwrap(completedCallback);
            _request.Open("GET", "Hello.ashx", true);
            _request.Send(null);
        }

        private void OnRequestComplete() {
            if (_request.ReadyState == 4) {
                _request.Onreadystatechange = Function.Empty;
               
                Window.Alert(_request.ResponseText);
            }
        }
    }
}
 

En la página de demostración, lo único que se tiene que hacer es registrar la clase "HelloWorld.Demo".

html:

<!-- Demo.aspx -->
<%@ Page Language="C#" %>
<!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" >
<head runat="server">
  <title>Demo Script#</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <input type="button" id="okButton"
        value="OK" />

    </div>
   
    <nStuff:Scriptlet runat="server"
      ScriptAssembly="HelloWorld"
      ScriptletType="HelloWorld.Demo" />

    </form>
</body>
</html>
csharp:

<%@ WebHandler Language="C#" Class="HelloHandler" %>

// Handler.ashx: Se encarga de procesar la petición.

using System;
using System.Web;

public class HelloHandler : IHttpHandler {

    public bool IsReusable {
        get {
            return true;
        }
    }

    public void ProcessRequest(HttpContext context) {
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;

        string greeting = String.Empty;
        string name = request["name"];
        if (!String.IsNullOrEmpty(name))
        {
            greeting = "Hello " + HttpUtility.HtmlEncode(name) + "!";
        }
        else
            greeting = "Hello from server";

        greeting += " - Server time: " + DateTime.Now.ToShortTimeString();
     
        response.ContentType = "text/plain";
        response.Write(greeting);
    }
}

xml:

<!-- Web.config -->
<?xml version="1.0"?>
<configuration>

  <system.web>
    <pages>
      <controls>
        <add tagPrefix="nStuff" assembly="nStuff.ScriptSharp.Web" namespace="nStuff.ScriptSharp" />
      </controls>
    </pages>
  </system.web>

</configuration>

Pueden descargar el compilador de Script# desde http://www.nikhilk.net/Content/Samples/ScriptSharp.zip o ver un video demostrativo en http://www.nikhilk.net/Content/Video/ScriptSharpIntro.wmv

Categories
AJAX JavaScript Varios

La W3C prepara un estándar para XMLHttpRequest

La W3C en su tarea de estandarizar y facilitar el trabajo a los programadores ha sacado el primer borrador para el estándar del Objeto XMLHttpRequest, sin duda una gran iniciativa y una gran ayuda para las personas que como yo, recién estamos aprendiendo más sobre XMLHttpRrequest y su aplicación en AJAX.

Un pequeño ejemplo que nos dejan:

Javascript:

// The following script:
var r = new XMLHttpRequest();
r.open('get', 'demo.cgi');
r.setRequestHeader('X-Test', 'one');
r.setRequestHeader('X-Test', 'two');
r.send(null);

// ...would result in the following header being sent:
...
X-Test: one, two
...
 

Enlaces