Autor Zpráva
Dart21
Profil
Dobrý den,
Mám dotaz nejde nějak logovat někam ukládat všechny odeslané SQL příkazy ze serveru?
Mám podezření že mám ve své aplikaci nějakou bezpečnostní "díru" ale vůbec nevím kde proti SQL Injection mám jakousi ochranu ale nevím zda účinnou.
Děkuji za odpovědi příp. tipy.
Alphard
Profil
Jak se připojujete k databázi? Máte nějakou mezivrstvu, např. dibi?
Spectator
Profil
udělej si funkci která jako parametr přijme dotaz, uloží ho a následně dotaz provede a vrátí výsledek
function query_log($query) {
  file_put_contents(...);
  return mysql_query($query);
}

Nebo používej nějakou vrstvu, která se ti stará o bezpečnost dotazů dibi, ...
Dart21
Profil
Mezivrstvu žádnou nemám připojuji se pomocín php funkce mysql_connect();
To Spectator ano toto je taky řešení ale kontrolovat příkazy, které už mám v kodu s tím bych na nic nepřišel. Ten 'hacker' maže účty z databáze jak se mu zachce například příkaz DELETE nikde nemám tedy jen v mé administraci ale tam se mi každá akce loguje. Potřebuji právě zjistit co mu ten příkaz umožnuje vykonat.
Alphard
Profil
Dart21:
Tak to mátě pěkně děravou aplikaci. Escapujete? Znáte např. fci mysql_real_escape_string()?
Dart21
Profil
Ale tohle všechno tam mám. Mám všechny vstupní pole POST a GET ošetřeny tímto:
if(get_magic_quotes_gpc() == 0)
{
  foreach($_POST as $k => $v)
  {
    $_POST[$k]=addslashes($v);
  }
  foreach($_GET as $k => $v)
  {
    $_GET[$k]=addslashes($v);
  }
}


function anti_inject($campo)
{
foreach($campo as $key => $val)
{

$val = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$val);


$val = trim($val);


$val = strip_tags($val);


$val = addslashes($val);


$campo[$key] = $val;
}
return $campo; 
} 

$_GET = anti_inject($_GET);
$_POST = anti_inject($_POST);
Tomáš K.
Profil *
Ale nemáte. Funkci mysql_real_escape_string() určenou k escapování SQL tam nevidím, je tam jen strip_tags, add_slashes a nějaký vcelku zbytečný regulární výraz.

Pokud používáte v dotazech uvozovky, pak by myslím tohle prošlo a zaškodilo:
"; TRUNCATE TABLE users; UPDATE users SET id="

A pokud ne zrovna tohle, tak půjde sestavit dotaz, který tu ochranu překoná.
Dart21
Profil
Takze diky moc vsem osetrim tedy POST a GET funkcí mysql_real_escape_string();

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: