| | |
| Stránka: 1 z 1
| [ Príspevkov: 17 ] | |
Autor | Správa |
---|
Registrovaný: 23.04.08 Prihlásený: 31.08.08 Príspevky: 37 Témy: 10 |
Nazdarek.. Skusam si spravit skript kde by bola jednoducha ochrana pred SQL injection. Chcel by som vas poprosit, ci by ste sa nemohli mrknut na skript, ci som ho spravne zapisal, ci je to postacuje, popripade mi opravit chyby a vysvetlit..Dik za kazdu pomoc..
SKRIPT:
<?
session_start();
$link=mysql_connect("xxxxx", "xxxxx", "xxxx");
mysql_select_db("xxxx");
$name= addslashes(htmlspecialchars($_POST['nick'])) ;
$hes= MD5($_POST['pass'])) ;
$vysledek=mysql_query("select meno, heslo from users where meno='$name' and heslo='$hes' ");
$id = mysql_fetch_array($vysledek);
if ($id<>0) $_SESSION["nick"]=($_POST["nick"]);
$prihlas=true;
if (!empty($_POST["nick"]) || !empty($_POST["pass"]))
{
if (!isset($_SESSION["nick"])) echo "Uživatelské meno alebo heslo nesuhlasí";
else
{
$prihlas=false;
Header("Location: index.php");
}
}
if ($prihlas):?>
<form method="post" action="login.php">
<table>
<tr>
<td>Meno:</td>
<td><input name="nick" value="<?echo $_POST["nick"]?>"></td>
</tr>
<td>Heslo:</td>
<td><input name="pass" type = "password" value="<?echo $_POST["pass"]?>"></td>
</tr>
<tr>
<td colspan="2"><input type="Submit" name="odesli" value="Prihlásiť"></td>
</tr>
</table>
</form>
<?endif;?>
|
|
Registrovaný: 21.01.07 Prihlásený: 29.03.20 Príspevky: 660 Témy: 53 |
Kód: $name= addslashes(htmlspecialchars($_POST['nick'])) ; Toto nebude stačiť. Stlačilo by, ak by ti niekto vložil: Kód: voľačo\' a následne sa to zmení na: Kód: voľačo\\' Skús túto funkciu: Kód: function opravitchyby($vstup) {
global $link;
if (ini_get('magic_quotes_gpc')) { $vstup = stripslashes($vstup); } return mysql_real_escape_string($vstup, $link);
}
|
|
Registrovaný: 25.07.07 Prihlásený: 27.11.14 Príspevky: 217 Témy: 38 Bydlisko: Kálnica city | Napísal Matho: 09.06.2008 16:23 | |
|
do formularovych inputov si dopis hodnotu maxlength - ako moze byt dlhy nick/heslo.
|
|
|
Matho píše: do formularovych inputov si dopis hodnotu maxlength - ako moze byt dlhy nick/heslo.
Ano, niekto si vymysli vlastny form a posle mu 20000 znakov. Maxlenght nestaci ! Ked uz, tak aspon substr na nejakych 20 znakov. To uz tak lahko neobides
|
|
|
Numline1 píše: Ano, niekto si vymysli vlastny form a posle mu 20000 znakov. Maxlenght nestaci ! Ked uz, tak aspon substr na nejakych 20 znakov. To uz tak lahko neobides
Substr ?? Da sa to ano aj tak, ale podla mna je lepsie strlen.
Ok... pomylil som sa ... najlepsie je pouzit aj substr aj strlen
|
|
Registrovaný: 17.10.06 Prihlásený: 08.01.11 Príspevky: 1752 Témy: 17 | Napísal suchy: 09.06.2008 19:28 | |
|
pepek92: neviem aku verziu php pouzivas ale na 5.2.4 ide uplne v poho. vystup tvojho prikladu vyzera takto: aaa\\\\\\\' a ak si to spocitas tak zistis, ze je to vyescapovane spravne
_________________ A Real Programmer might or might not know his wife's name. He does, however, know the entire ASCII code table. |
|
Registrovaný: 21.01.07 Prihlásený: 29.03.20 Príspevky: 660 Témy: 53 |
Aha, tak potom sorry, asi som sa mierne sekol. Ospravedlňujem sa.
|
|
Registrovaný: 23.04.08 Prihlásený: 31.08.08 Príspevky: 37 Témy: 10 |
No priznam sa ze nejako moc nechapem pouzitie tej funkcie.. Pozeral som k tomu nieco na nete, ale dopracoval som sa skor k tomu, ze funkcia mysql_real_escape_string bola pouzita v samotnom dopyte.. Cize nieco take:
$vysledek=mysql_query("select meno, heslo from users where meno = '".mysql_real_escape_string($_GET['nick'])."' and heslo='$hes' ");
Tak teraz neviem..ci aj toto je postacujuce riesenie.a ci to nahradi addslashes, htmlspecialchars...Alebo ak by mi mohol niekto ukazat pouzitie tej funkcie na mojom prihlasovaciom skripte a troska vysvetlit..
|
|
Registrovaný: 23.04.08 Prihlásený: 31.08.08 Príspevky: 37 Témy: 10 |
No takze som trocha patral po tych ochranach proti SQL a narazil som na nieco take:
$input = Vstupny input
$is_sql = Kontrola ci nahodou $input nie je sql query
$username = sterilize($_POST['username']);
$query = "SELECT * FROM users WHERE username = '$username'";
*/
function sterilize ($input, $is_sql = false)
{
$input = htmlentities($input, ENT_QUOTES);
if(get_magic_quotes_gpc ())
{
$input = stripslashes ($input);
}
if ($is_sql)
{
$input = mysql_real_escape_string ($input);
}
$input = strip_tags($input);
$input = str_replace("
", "\n", $input);
return $input;
}
Zaujimalo by ma vsak co presne znamena ta premenna $input . Ma to byt nadefinovane ako name z formulara?? Tzn:
$input = "odesli"
Je toto dobra ochrana pred SQL injection??
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
$input je lokalna premenna funkcie sterilize(), cize ked pouzijes
Kód: $username = sterilize($_POST['username']); tak $input bude obsahovat hodnotu z $_POST['username'], ktora bola zaslana vo formulari Kód: <form method="post"> <input type="text" name="username"> </form>
kedze sa jedna pravdepodobne o prihlasovacie meno, nebolo by odveci povolit len pouzitie alfanumerickych znakov - aj tak sa da chranit pred sql injection...
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 08.06.08 Prihlásený: 09.07.08 Príspevky: 39 Témy: 1 | Napísal k3tch: 11.06.2008 19:39 | |
|
dobra ochrana proti mysql injections je nepouzivat mysql ale v tom zmysle ze pouzijes krasne objektove mysqli. cize get parametre mozes osetrit takto:
najskor zavolas objekt mysqli
Kód: @$con = new mysqli(SERVER, LOGIN, PASSWORD, DB_NAME);
if (mysqli_connect_errno())
die("mysqli error");
$con->autocommit(FALSE); // a vypnes autocommit a takto selectujes z databazy podla ID Kód: $stmt = $con->prepare("SELECT t1, t2 FROM example WHERE id = ?;"); $stmt->bind_param("i", $_GET['id']); $stmt->execute(); $con->commit(); $stmt->bind_result($t1, $t2); while ($stmt->fetch()) { echo $t1 . " " . $t2; } $stmt->close(); cize postupne: select si "pripravis" tak ze co chces dosadit vymenis za ? pomocou bind_param presne podla postupnosti otazknikov predavas parametre tejto funkcii. ale hned prvy parameter definujes ako datovy typ parametru. cize ked mas parametre povedzme integer, integer, string, integer, tak das. Kód: $stmt->bind_param('iisi'); viac podrobnosti najdes na http://php.nettiez by som odporucal regularne vyrazy alebo jednoducho ked uz nechces pouzivat mysqli tak ako si nacitaj do premennej nejaky get napr takto. ked vies ze get id bude integer tak: Kód: $id = (is_numeric($_GET['id'])) ? $_GET['id'] : -1;
a to potom doplnis do mysql dopytu. je toho viac. staci si vybrat.
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
najlepsie je mozno osetrit vsetky hodnoty, ktore ziskas od uzivatela (post,get), naraz pomocou array_map a pod. Takto nemusis upravovat kazdu jednu hodnotu zvlast...
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 17.10.06 Prihlásený: 08.01.11 Príspevky: 1752 Témy: 17 | Napísal suchy: 11.06.2008 21:49 | |
|
neskusal som, ale nevidim dovod, preco by sa nedali prepare statements pouzit aj bez mysqli
_________________ A Real Programmer might or might not know his wife's name. He does, however, know the entire ASCII code table. |
|
Registrovaný: 08.06.08 Prihlásený: 09.07.08 Príspevky: 39 Témy: 1 | Napísal k3tch: 11.06.2008 22:09 | |
|
stenley píše: najlepsie je mozno osetrit vsetky hodnoty, ktore ziskas od uzivatela (post,get), naraz pomocou array_map a pod. Takto nemusis upravovat kazdu jednu hodnotu zvlast...
samozrejme. kazdy ma vlastnu metodu osetrovania sql. tazko povedat ktora je najlepsia. kazdy si bude tvrdit ze ta jeho jem mozne pouzit uz existujuce riesenia alebo nakodit si nieco vlastne. takze vyberat z coho je. staci si zvolit tu spravnu cestu. ktora to je uz zavysi od kazdeho zvlast.
Suchy: samozrejme mozes pouzit tiez vela variant. prepare statements v mysql. ale aj tak myslim ze mysqli ma oproti mysql dost navrch. napriklad kedze pracuje so sqlite je ju mozne synchronizovat napr s pysqlite2 alebo podobne vychytavky. ako som uz napisal. je to kazdeho osobna vec.
|
|
Registrovaný: 23.04.08 Prihlásený: 31.08.08 Príspevky: 37 Témy: 10 |
Nechcem zacinat novy topic, tak to hodim sem..ved v podstate sa to tyka SQL injection.
Zaujimalo by ma ako riesit resp. mate riesene zabezpecenie URL proti SQL injection.
Napr. V mailoch URL pre aktivaciu.
Povedzme ze mate takuto URL :
"Pre aktiváciu účtu kliknite na následujuci odkaz: http://www.pokus.com/registraciadokoncena.php?a=$meno"
Alebo v odkazoch:
<a href='www.pokus.com/info.php'>Pokus</a>"
Mozte mi poradit? Alebo hodit nejaky dobry link, kde je nieco k tejto problematike? Lebo co som nasiel cez google tak moc nefungovalo alebo bolo len rozpisane ako cez URL "napadnut" web..
PS: Dik za rady .
|
|
Registrovaný: 08.06.08 Prihlásený: 09.07.08 Príspevky: 39 Témy: 1 | Napísal k3tch: 12.06.2008 20:09 | |
|
no ved z url je to to iste ako napr z formualru ale nepouzivas POST premenne ale GET. cize ak mas to tvoje ?a=meno tak osetrujes premennu $_GET['a'];
sposobmi ake tu boli pouzite. napr htmlspecialchars(), addslashes() etc... pozri vyssie
_________________ XMPP(Jabber): k3tch@xmpp.sk
No money? No Credit? Eat shit! |
|
Registrovaný: 23.04.08 Prihlásený: 31.08.08 Príspevky: 37 Témy: 10 |
No to mam osetrene..Ale skor ma zaujima, ako spravit napr. to, aby v url nebolo vidiet ten skript registraciadokoncena.php. Da sa to??http://www.pokus.com/registraciadokoncena.php?a=$meno"
A este jedna vec.
Skusal som premenu $meno kodovat cez md5, no pri kliknuti na odkaz pre potvrdenie aktivacie mi to nezmenilo hodnotu, resp. neurobilo update v Tabulke. V com by mohol byt problem??
|
|
| Stránka: 1 z 1
| [ Príspevkov: 17 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|