¿Inyección de SQL para un formulario de nombre de usuario / contraseña?

-1

Así es como ocurre la validación de usuarios en mi sitio:

if(!empty($_POST['username']) && !empty($_POST['password']))
{       
    $query = "SELECT * FROM users WHERE username='".$_POST['username']."' AND binary password='".$_POST['password']."'";

Sin embargo, tengo este código de limpieza de inyección que se ejecuta en cada página que carga mi sitio.

Sin embargo, estoy intentando desarrollar una lista de ataques de combinaciones inteligentes de nombre de usuario y contraseña que podrían probar si puedo obtener acceso no autorizado al sistema.

Cosas como:

  1. %%, %%
  2. *, *
  3. ' OR '1'='1, ' OR '1'='1
pregunta Steve 10.02.2011 - 13:28
fuente

4 respuestas

12

Mientras use SQL dinámico, SQL-Injection seguirá siendo un vector de ataque abierto. Si desea protegerse contra la inyección de SQL, el camino a seguir es mediante consultas parametrizadas. Sospecho que está utilizando PHP + MySQL, por lo que este sería un ejemplo de una consulta parametrizada.

$dbh = new PDO('mysql:host=localhost;dbname=example', 'user', 'password');
$sth = $dbh->prepare('SELECT * FROM users WHERE username=? AND binary password=?');
$sth->execute(array($_POST['username'], $_POST['password']));
$result = $sth->fetch_all();

Por supuesto, eliminar la entrada del usuario de los caracteres ilegales puede ser algo que desee hacer porque, aunque su sitio esté protegido contra la inyección de SQL, es posible que sus usuarios sean atacados a través de XSS. Así que sugiero una combinación de ambas técnicas.

    
respondido por el Mike 10.02.2011 - 13:52
fuente
3

Estoy de acuerdo con mike, que al usar consultas parametrizadas puede deshacerse de las inyecciones de SQL, pero nuevamente, eso depende de cómo se construyen.

Yo diría que usar una lista blanca siempre es mejor que usar una lista negra. Cuando intentamos enumerar los tipos de ataques, siempre existe la posibilidad de que un ataque salte. Como mencionó, filtrar 1 = 1 pero luego a = a, me = me producirá el mismo resultado ... Por lo tanto, la inclusión en listas blancas ayudaría cuando inicialmente solo acepte lo que quiere y descarte a otros usando expresiones regulares ... luego consultas parametrizadas ... .

    
respondido por el Auditor 17.02.2011 - 22:19
fuente
2

La mejor respuesta a esta pregunta es anular la pregunta. El código que muestra es vulnerable, y la única forma razonable de solucionarlo es arreglar el código. La mejor solución es utilizar una declaración preparada o una consulta parametrizada: no utilice la concatenación de cadenas para crear consultas SQL. La recopilación de ejemplos de ataques no conducirá a una defensa eficaz contra los ataques de inyección de SQL. Las probabilidades son que siempre habrá un ataque más que no esté en tu lista.

    
respondido por el D.W. 10.02.2011 - 21:22
fuente
0

Estoy de acuerdo con las respuestas anteriores, solo corrija el código para que sea seguro. Pero también recomiendo algún tipo de recopilación de datos del sitio en vivo, de modo que alguien que esté intentando los ataques pueda ser prohibido.

    
respondido por el ddyer 11.08.2012 - 23:02
fuente

Lea otras preguntas en las etiquetas