Stránka 1 z 2

SQL dotaz

Napsal: 03 bře 2012 10:01
od Schmutzky
Zdravím,

mám takový řekl bych až velmi noobský dotaz snad mě tu za něj nesežerete :-D

Chci naplnit tabulky a vložit nějaké hodnoty, ale přeji si, abych si mohl selectem(formulářem v prohlížeči) vybrat jakou tabulku a právě to mi dělá problém.

Zajímavé je že po vypsání echo $_POST["sporty"] po odeslání vždy vypíše správně ovšem data nenaplní. Syntaktická chyba tam není jinak tabulky fungujou když to zkouším naplňovat i tak či tak žádnej problém s připojením k db taky problém nehledejte. Jinak ty tabulky se opravdu jmenují tak jako mám name v optionech.

Myslím že kód více osvětlí mou demenci :-D

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Sport:<br />
<select name="sporty">
<option>Vyberte sport...</option>
<option value="fotbal">Fotbal</option>
<option value="hokej">Hokej</option>
<option value="tenis">Tenis</option>
<option value="basket">Basketbal</option>
</select><br />
Domácí: <input type="text" name="domaci" size="20"><br />
Hosté: <input type="text" name="hoste" size="20"><br />
<input type="submit" value="Odeslat"><br /><br />

<?php
require "pripojeni.php";
if(!empty($_POST))
{
$sql = "INSERT INTO '".$_POST["sporty"]."'(domaci,hoste) VALUES('".$_POST["domaci"]."' , '".$_POST["hoste"]."')";
mysql_query($sql);
}
?>
</form>

Zkoušel jsem všechno možné a pořád nic :( Snad mi tu někdo poradí.

Re: SQL dotaz

Napsal: 03 bře 2012 10:38
od CZechBoY
existují tabulky Fotbal,Hokej,Tenis,Basketbal?
za mysql_query dej var_dump(MySQL_Error());, to ti vypíše chybu z MySQL pokud nějaká bude

jinak tam žádnou chybu (až na bezpečnostní) nevidim

jo už vidim :D
máš tam apostrofy u názvu tabulky, musí tam být ` nebo žádné v případě bezkonfliktního názvu

Re: SQL dotaz

Napsal: 03 bře 2012 10:48
od Schmutzky
Děkuju moc fakt že tam byla syntaktická hrubka :-D u toho $_POST["sporty"] jsem měl zbytečně 2x ' ' přesně jak říkáš :) - už to zapisuje ty hodnoty. Ježiši já jsem ale mimoň :-D Ještě jednou díky a docela useful command ten dump jsem celkem začátečník tak se nezlobte :( :-D Jinak k té bezpečnosti co tím myslíš? Login mám zašifrovanej přes SHA1 a na každé stránce např i u přidávání těch zápasů mám vždycky kontrolu session proměnné jestli jsem přihlášený. Jinak velmi rád si poslechnu nějakou tu radu. :))

Re: SQL dotaz

Napsal: 03 bře 2012 11:01
od CZechBoY
myslím SQL injection, dál jsem se radši nerozepisoval, pač nevim kde ten formulář je používanej a kdo do něj může přidávat
pak samozřejmě CSRF - dát ke každému formuláři kontrolní token, ale víc na netu ;)

SQL injection se zbavíš funkcí MySQL_Real_Escape_String (musíš být připojený k databázi)

Re: SQL dotaz

Napsal: 03 bře 2012 11:04
od Schmutzky
Okay díky moc, jj to už si vyhledám. Tak ještě jednou díky za pomoc :-) Moc jsi mi pomohl :-)

Re: SQL dotaz

Napsal: 03 bře 2012 12:20
od ecaha
Mám možná jen drobné doplnění/dotaz. Žiji v přesvědčení, že výše uvedený problém se:
a) řeší pomocí dvou tabulek - v jedné jsou uvedeny sporty, ve druhé výsledky a přes cizí klíč jsou spojeny
b) data vkládáme pomocí uložené procedury

Vyřeší se tím jak SQL injection, tak možnost, že nějaký sport přibude.

Re: SQL dotaz

Napsal: 05 bře 2012 15:11
od CZechBoY
ecaha: eh? jak můžeš vyřešit SQL injection pomocí dvou tabulek/procedury?
to jako že budeš odhadovat co bude uživatel vkládat?
radši si přečti co to vůbec je, prtže asi nevíš o čem píšeš

Re: SQL dotaz

Napsal: 05 bře 2012 17:32
od ecaha
Asi jsem se nevyjádřil dost jasně:
a) řeší chybný návrh databáze, tj. kdy pro stejnou věc o stejné struktuře použiji jinak pojmenované tabulky a rozšíření o další sport znamená zásah do databáze, což je nesmysl
b) vkládání dat pomocí parametrizované uložené procedury místo dynamického SQL patří k jedné za základních defenzivních technik (a vůbec technik jak dělit DB logiku od vyšší vrstvy) a v tomlhe případě by design řeší problematiku SQL injection ani se nemusím moc starat o obor hodnot (tady pravda hádám, že výsledky jsou int a programátor tuší, že pro ukládání čísel se používá číselný datový typ a i parametry jsou deklarovány jako int)

Pravda nebyl jsem dostatečně expresivní ve výrazivu. Čili ještě jednou znovu. Celý návrh DB je nesmysl, stejně tak použití dynamického SQL. DB pro tento problém má dvě tabulky. Jedna pro sporty, druhá pro výsledky. Sporty do ovládacího prvku doluji procedurou DejSporty(). Vysledky ukladam parametrizovanou procedurou UlozVysledek(sport int, domaci int, hoste int), nemám problém se SQL injection a do jisté míry ani se změnou schématu DB. Funkčnost v prvním postu uvedenou dodržím.

V případě, že domácí a hosté jsou názvy teamů, tak se opět jedná o zcela zmrvený návrh DB.

Nekladu si patent na rozum, ale přece jen jsem nějakou aplikaci sem tam viděl.

Re: SQL dotaz

Napsal: 05 bře 2012 18:07
od CZechBoY
SQL injection nezabráníš nějakou procedurou, ale escapováním.. to pořád nechápeš?

Re: SQL dotaz

Napsal: 05 bře 2012 19:13
od ecaha
Návrh aplikace dokáže zajistit bezpečnost před SQL injection a nemusím escapovat, pořád to nechápeš? Nepoužití dynamického sql je první krok, použití procedury která sletí na invalid parse exception když na vstupu bude cokoliv jiného než celé číslo je krok druhý. Je to odolné proti SQL injection a nemusím escapovat.

Netvrdím, že escapovat se nemá, ale neí to jediné, samospasitelné božstvo. Co jsem chtěl předvést je, že bezpečnost aplikace začíná jejím návrhem. IMO je prostě chyba nezamýšlet se nad tím, jak tu aplikaci udělat lépe, ale spokojit se s tím - escapuju, tak jsem v suchu a bezpečí ať je to bastl jakýkoliv.

Re: SQL dotaz

Napsal: 06 bře 2012 19:56
od CZechBoY
když můžeš změnit tvar SQL tak je to SQL injection, proto jsem psal, že si máš přečíst co to vůbec je

Re: SQL dotaz

Napsal: 06 bře 2012 21:03
od ecaha
Výborně už se blížíme k cíli. Píšeš:
"když můžeš změnit tvar SQL tak je to SQL injection, proto jsem psal, že si máš přečíst co to vůbec je"

No a to v mém návrhu nemůžeš, nijak. Safe by design.