Følgende er skrevet af Kurt Hansen:
> Den 05/12/12 23.25, Arne Vajhøj skrev:
>> On 12/5/2012 8:09 AM, Kurt Hansen wrote:
>>> Den 05/12/12 12.58, Leif Neland skrev:
>>>> Og hvis nogen skriver varenummeret "' or 1=1" får du opdateret hele
>>>> varelageret på een gang...
>>>
>>> Rent volapyk for mig.
>>
>> Prøv og google:
>> sql injection
>>
>>>> Læs op på prepared statements og mysqli eller PDO.
>>>
>>> Tak for henvisningen, men jeg vælger at afstå fra at kaste mig ud i et
>>> større studie. Scriptet så så simpelt ud, at jeg tænkte det måtte være
>>> en smal sag at tilrette til eget brug.
>>>
>>> Måske ikke overraskende, dukker der problemer op og så vælger jeg at stå
>>> af. jeg har ganske enkelt ikke tid til at fordybe mig i (åbenbart)
>>> fornøden grad.
>
>> Jeg har svært ved at se pointen i at få en dårlig løsning til at
>> "virke".
>
> Den er taget fra videoen her:
>
http://www.nemprogrammering.dk/Tutorials/MySQL/T7mysql.php. Jeg kunne jo ikke
> vide på forhånd, at det var en dårlig løsning.
>
Det er trist at en tutorial, der tilsyneladende er lavet i år, benytter
sig af mysql, der er "depreciated" i næste udgave af php, i stedet for
at bruge mysqli eller pdo.
Og bruger teknikker der i sikkert ti år har været kendte for at være
skyld i indbrud i databaser.
Din opdatering kan laves sikkert på denne måde:
try {
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
catch(PDOException $e) {
echo $e->getMessage();
die();
}
$tabeldata = $DBH->prepare(
"UPDATE products SET v_products_price = :pris
WHERE products_model = :varenr");
$tabeldata->execute(array('pris' => $_POST['pris'],
'varenr => $_POST['pris']));
Det bruger to sætninger i stedet for een, men er sikkert for
sql-injections, og er mere overskueligt, synes jeg.
Med hensyn til dine 30.000 records, ville jeg lave
opdateringsformularen til at man først skriver varenummer, og trykker
enter (submitter).
Så vises titel, og man kan skrive prisen, hvis det er den rigtige vare,
eller man kan gå tilbage og skrive en anden vare.
Lidt hastig pseudokode:
if (! isset($_FORM['varenr']) {
// Trin 1: Ingen inddata
echo "<form>Skriv varenr <input type=text name='varenr'></form>";
} else {
if (!isset($_FORM['pris']) {
// Trin 2: Varenr, ingen pris; spørg efter pris.
$vare_stmt=$dbh->prepare("select * from products where varenr=?");
$vare_stmt->execute(array($_FORM['varenr']));
$vare= $vare_stmt->fetch(PDO::FETCH_ASSOC);
echo "<form>Ny pris for ".$vare['products_model']."
".$vare['products_title']."<br>
<input type='hidden' name='varenr'
value='".$vare['products_title']."'>
Før ".$vare['products_price']."
Nu <input type='number' name='pris'></form>";
} else {
// Trin 3: Varenr og pris givet; opdater.
$tabeldata = $dbh->prepare(
"UPDATE products SET v_products_price = :pris
WHERE products_model = :varenr");
$tabeldata->execute(array('pris' => $_POST['pris'],
'varenr => $_POST['pris']));
echo "Vare opdateret<br>"
}
};