Sposób na SQL Injection w 20 linijkach

Przedstawiamy kod źródłowy jednej niewielkiej objętościowo funkcji języka PHP, która okazuje się być skutecznym rozwiązaniem na dziury typu SQL Injection. Całość ma jedyne 20 linijek i dodatkowo znacznie przyspiesza generowanie zapytań SQL poprzez zastosowanie szablonu argumentów ściśle określających ich typ.

Funkcja korzysta z wbudowanej funkcji MySQL do dodawania znaków unikowych, jednak rozbudowa funkcjonalności do innych baz danych nie powinna być większym problemem.

<?php

$arrArguments = array();

$intArgumentIndex = 0;

function parseArgument($arrMatches) {

global $arrArguments, $intArgumentIndex;

$strMatch = $arrMatches[0];

$strArgument = @$arrArguments[$intArgumentIndex++];

switch ($strMatch) {

case ‚%d’: return (int)$strArgument;

case ‚%s’: return ‚”‚.

mysql_real_escape_string($strArgument).'”‚;

case ‚%b’: return (int)((bool)$strArgument);

}

}

function SQL($strSql) {

global $arrArguments, $intArgumentIndex;

$arrArgs = func_get_args();

array_shift($arrArgs);

$arrArguments = $arrArgs;

$intArgumentIndex = 0;

return preg_replace_callback(‚/(%[dsb])/’, ‚parseArgument’,

$strSql);

}

?>
Zastosowanie:

$sql = SQL(‚INSERT INTO users (id, uid, name, username, password, newsletter) VALUES (NULL, %d, %s, %s, %s, %b)’, $_POST[‚uid’], $_POST[‚name’], $_POST[‚username’], md5($_POST[‚password’]), $_POST[‚newsletter’]);

INSERT INTO users (id, uid, name, username, password, newsletter)
VALUES (NULL, 1, „Łukasz \”anAKiN\” Lach”, „anakin”,
„97296eca657a093aa379778c237e292d”, 1)
Przepis na SQL Injection