Autor Zpráva
PHP_Nemaster
Profil
Dobrý den,
mám takový problém. Asi je to dost jednoduché, ale nevím, jak to vyřešit.

Potřebuji vložit do DB informace z pole, kde index je název sloupce a hodnota je hodnota, kterou chci vložit.


$values = array( 'username' => $_POST['username'], 'password' => $_POST['password'] ) a:

INSERT INTO profiles ( $values['klic'], $values['dalsi_klic'] ) VALUES ( $values['hodnota'], $values['dalsi_hodnota'] )

Zkoušel jsem to přes foreach, to téměř funguje, ale místo jednoho dotazu mi to udělá tolik dotazů, kolik je v poli hodnot...

Nevíte někdo jak na to?
Předem děkuji za odpověd'
Someone
Profil
foreach ($values as $sloupec => $hodnota) {
    $sloupce[] = $sloupec;
    $hodnoty[] = $hodnota;
}
$sql_sloupce = implode(",",$sloupce);
$sql_hodnoty = implode("','",$hodnoty);

....

INSERT INTO profiles (".$sql_sloupce.") VALUES('".$sql_hodnoty."');

Je to první, co mě napadlo, takže to prosím ber s rezervou.
Alphard
Profil
[#2] Someone
A samozřejmě k ničemu, protože to není escapované...

PHP_Nemaster:
Mohu vám poradit hotové řešení
dibi::query('INSERT INTO [table]', $arr);
případně
dibi::insert('table', $arr);
nebo jste další, kdo pracujete na vlastním layeru?
Someone
Profil
Alphard:
Přidat mysql_real_escape_string přeci není takový problém ne?
Majkl578
Profil
[#2] Someone:
A proti SQL injekci to za tebe bude zabezpečovat kdo?

Aspoň nějak takto:
$sloupce = array_map(function ($item) {
    return '`' . mysql_real_escape_string($item) . '`';
}, array_keys($values));
$hodnoty = array_map(function ($item) {
    return "'" . mysql_real_escape_string($item) . "'";
}, $values);

$sql = 'INSERT INTO profiles (' . implode(', ', $sloupce) . ') VALUES (' . implode(', ', $hodnoty) . ')';
Alphard
Profil
[#4] Someone
Majkl mě předběhl, ale názvy sloupců ošetříte jak? Podobnými chybami jde velká část útoků i na velké servery. Uvedené řešení je k ničemu, na tom trvám. Když dokončení není problém, aspoň na to upozorněte.
Someone
Profil
Názvy sloupců se zdají být konstatní viz.:[#1] PHP_Nemaster
Alphard
Profil
[#7] Someone
Ok, špatně jsem se podíval, tak to se omlouvám. Ale i tak zkušenosti říkají, že tu funkci dřív nebo později někdo použije jinak, než je teď zamýšleno.
Já osobně neuznávám žádné potenciální díry v zabezpečení, žádné komentáře u query "je ošetřeno jinde". Ošetřuji veškeré všechny vstupy a nic se nemůže zdát. Ono je to dobré i na uvození reserved words.
Someone
Profil
Ještě nemám tolik zkušeností co Vy, takže si nedovolím stát v opozici, je to spíše dotaz, ale jak to lze zneužít pokud bych vkládání do pole ošetřil funkcí mysql_real_escape_string() ?:
foreach ($values as $sloupec => $hodnota) {
    $sloupce[] = $sloupec;
    $hodnoty[] = mysql_real_escape_string($hodnota);
}
Alphard
Profil
[#9] Someone
Do neuvozených názvu sloupců, lze-li je podvrhnout, můžete vložit třeba -- tj. komentář pro mysql. Mezera ani pomlčka samo o sobě není nic, co by se escapovalo. Přímým zneužitím si nejsem jist, ale určitě to není dobré, možná by šlo něco vymyslet.

Abych pravdu řekl, nejsem si ani jist, jestli řešení v [#5] Majkl578 je zcela neprůstřelné. mysql_real_escape_string() ošetřeje řetězce Escapes special characters in a string for use in an SQL statement, ale identifikátor sloupce se uvozuje jinak.
Možná bych se nebál použít tvrdší translační tabulky nebo povolit jen alfanumerické znaky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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