Avatar billede lesp Nybegynder
15. juli 2007 - 19:43 Der er 23 kommentarer og
1 løsning

Jeg får en underlig fejl

Hejsa Eksperter
Jeg får følgende fejl:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2

Her er min kode:

<?
    include('connect.php');
    $file=$_FILES['file']['name'];
    move_uploaded_file($_FILES['file']['tmp_name'], $file);
    mysql_query("INSERT INTO products (id,category,undercategory,overskrift,descr,price,varenr,billede) VALUES
    ('','$_POST[category]','$_POST[undercategory]','$_POST[item_title]','$_POST[item_desc]','$_POST[item_price]','$_POST[item_nr]',$file") or die(mysql_error());
    echo"Yes" or die(mysql_error());
?>

Hvad er det?
Avatar billede yHec Novice
15. juli 2007 - 19:44 #1
Er det ikke for du tildeler '' til id?
Avatar billede lesp Nybegynder
15. juli 2007 - 19:46 #2
Nej. Nu ser min kode således ud, og jeg får stadigvæk den samme fejl:

<?
    include('connect.php');
    $file=$_FILES['file']['name'];
    move_uploaded_file($_FILES['file']['tmp_name'], $file);
    mysql_query("INSERT INTO products (category,undercategory,overskrift,descr,price,varenr,billede) VALUES
    ('$_POST[category]','$_POST[undercategory]','$_POST[item_title]','$_POST[item_desc]','$_POST[item_price]','$_POST[item_nr]','$file'") or die(mysql_error());
    echo"Yes";
?>
Avatar billede nielle Nybegynder
15. juli 2007 - 19:52 #3
Prøv at lave en debug udskrift af din SQL-sætning. På den måde får man somregelæ en ide om hvor fejlen er kommet fra:

<?
    include('connect.php');
    $file = $_FILES['file']['name'];
    move_uploaded_file($_FILES['file']['tmp_name'], $file);

    $sql = "INSERT INTO products (category,undercategory,overskrift,descr,price,varenr,billede) VALUES
    ('$_POST[category]','$_POST[undercategory]','$_POST[item_title]','$_POST[item_desc]','$_POST[item_price]','$_POST[item_nr]','$file'";
    echo "DEBUG: " . $sql;

    mysql_query($sql) or die(mysql_error());
    echo "Yes";
?>
Avatar billede lesp Nybegynder
15. juli 2007 - 20:01 #4
DEBUG: INSERT INTO products (category,undercategory,overskrift,descr,price,varenr,billede) VALUES ('Elegance','Sammlerstück','df','her indtastes nyheden','fvb','123','68hardtop_thumb_02.jpg'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2
Avatar billede windcape Praktikant
15. juli 2007 - 20:03 #5
Nu er begge forslag også hul i hovedet, da enhver scriptkiddie kunne slette din side, og alt dit data uden problemer.

Derudover er der syntaxfejl mht. at bruge string keys uden quotes, og koden er utrolig grim pga. lange linjer, der mangler check om der overhovedet er lavet requests til siden osv.

Jeg vil anbefale noget ala. dette her istedet, det har da den mindste form for sikkerhed.

<?php

include_once 'connect.php';

if(isset($_FILES['file']['name'])) {
    $filename = $_FILES['file']['name'];
    move_uploaded_file($_FILES['file']['tmp_name'],$filename);
    $sql = "INSERT INTO
              products(
                  category,
                  undercategory,
                  overskrift,
                  descr,
                  price,
                  varenr,
                  billede
              )
            VALUES ('%s','%s','%s','%s','%s','%s','%s')";
    $sql = sprintf($sql,
        mysql_real_escape_string($_POST['category']),
        mysql_real_escape_string($_POST['undercategory']),
        mysql_real_escape_string($_POST['item_title']),
        mysql_real_escape_string($_POST['item_desc']),
        mysql_real_escape_string($_POST['item_price']),
        mysql_real_escape_string($_POST['item_nr']),
        mysql_real_escape_string($filename)
    );
    $res = mysql_query($sql);
    if(!$res) {
        die(mysql_error());
    }
    echo 'Done';

}

?>
Avatar billede windcape Praktikant
15. juli 2007 - 20:04 #6
Derudover bør du rette til de rigtige typer i sprintf() , go go tid til at læse !
Avatar billede yHec Novice
15. juli 2007 - 20:05 #7
Prøv:
INSERT INTO products (category,undercategory,overskrift,descr,price,varenr,billede) VALUES
    ("'".$_POST[category]."'","'".$_POST[undercategory]."'","'".$_POST[item_title]."'","'".$_POST[item_desc]."'","'".$_POST[item_price]."'","'".$_POST[item_nr]."'","'".$file."'"

/y
Avatar billede lesp Nybegynder
15. juli 2007 - 20:06 #8
Det må jeg sige windscape. Flot! Men vil du forklare mig følgende ting:

Hvordan ville en hacker kunne gå ind i mit system? Hvorfor er det svagt?
Avatar billede nielle Nybegynder
15. juli 2007 - 20:09 #9
Hvis vi lige vender tilbage til den oprindelige fejl så skyldes den at du mangler en afsluttende ) i dit values-led.

Derudover bør du nærlæse hvad windcape skriver om sikkerhed.
Avatar billede nielle Nybegynder
15. juli 2007 - 20:11 #10
lesp> Tag en søgning på Google på "SQL Injection". Dette er navnet på den sårbarhed der snakkes om.

Det er skræmmende læsning som enhver webudvikler bør være hjemmevandt i.
Avatar billede windcape Praktikant
15. juli 2007 - 20:18 #11
"Hvordan ville en hacker kunne gå ind i mit system? Hvorfor er det svagt?"

$_POST[item_title] = '; DELETE FROM products --

... og du kan vinke farvel til din produkt tabel :-) For den sags skyld kunne jeg have slettet hele databasen sådan.

Det er ret nemt, og der er mange artikler om hvordan man gør, fordi det gavner sikkerheden.
Avatar billede windcape Praktikant
15. juli 2007 - 20:20 #12
og måske skulle jeg så sige at

"'; DELETE FROM products --"
+
mysql_real_escape_string
=
"\'; DELETE FROM products --"

hvilket ikke giver nogen som helst problemer, blot et underligt produktnavn.

Derudover skal du jo alligevel escape hvis du vil have tegn som ' (singlequote) i dine titler.

"Foobar's holiday"
Avatar billede lesp Nybegynder
15. juli 2007 - 20:23 #13
""Hvordan ville en hacker kunne gå ind i mit system? Hvorfor er det svagt?"

$_POST[item_title] = '; DELETE FROM products --

... og du kan vinke farvel til din produkt tabel :-) For den sags skyld kunne jeg have slettet hele databasen sådan.

Det er ret nemt, og der er mange artikler om hvordan man gør, fordi det gavner sikkerheden."

Kan du vise mig nogle artikler? Det er noget jeg ikke ved ret meget om, som jeg gerne vil sætte mig mere ind i.
Avatar billede lesp Nybegynder
15. juli 2007 - 20:40 #14
Hvad er der så galt i denne linje?

    move_uploaded_file($_FILES['file']['tmp_name'], "images/" . basename ($filename));
Avatar billede windcape Praktikant
15. juli 2007 - 20:43 #15
plejer ikke at gemme links :) men shiflett er altid nem at huske

http://shiflett.org/articles/sql-injection , det er så specielt relateret til php.
Avatar billede lesp Nybegynder
15. juli 2007 - 20:51 #16
Jeg vil gerne nu flytte billedet til mappen "images"
Avatar billede windcape Praktikant
15. juli 2007 - 21:23 #17
Ser ikke ud til at være noget galt med den, men du skal nok gøre det lidt anderledes

$filename = $_FILES['file']['name'];
$filename = 'images/'.basename($filename);
move_uploaded_file($_FILES['file']['tmp_name'],$filename);

for at din database også får den rigtige værdi.
Avatar billede lesp Nybegynder
15. juli 2007 - 21:36 #18
Den uploader bare ikke billedet på serveren nu...
Avatar billede dkfire Nybegynder
15. juli 2007 - 21:47 #19
Mht. sikkerhed er der vel også brug for at tjekke om det virkelig er et billede som bliver uploaded. Enhver kan jo uploade filer med ondsindet kode med det script.
Avatar billede lesp Nybegynder
15. juli 2007 - 22:20 #20
Det skal være en administrator som uploader billeder, så det er ikke noget problem.
Avatar billede lesp Nybegynder
15. juli 2007 - 22:41 #21
Men som sagt virker følgende ikke:

$filename = $_FILES['file']['name'];
$filename = 'images/'.basename($filename);
move_uploaded_file($_FILES['file']['tmp_name'],$filename);
Avatar billede windcape Praktikant
16. juli 2007 - 09:44 #22
Nu er beskyttelse af den slags nu nemt nok :-)

$allowed = array('jpg','jpeg','gif','png');
$ext = substr($_FILES['file']['name'],strrpos($_FILES['file']['name'])+1);
if(!in_array($ext,$allowed)) {
    die('forkert filtype!');
}
Avatar billede lesp Nybegynder
21. juli 2007 - 12:36 #23
Det virker s*u ikke det med at uploade til images/

Og jeg forstår stadigvæk ikke, windscape, hvordan du kan slette det hele uden overhovedet at have adgang til FTP eller MySQL. Jeg har læst nogle artikler om MyAQL injection.
Avatar billede lesp Nybegynder
27. november 2007 - 13:12 #24
Jeg lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester