Avatar billede kimox Nybegynder
12. juni 2007 - 17:42 Der er 12 kommentarer og
1 løsning

hjælp til mysql fejl

Hej eksperter.

hvad betyder denne 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 's motto er: "RETTE MEDARBEJDER PÅ RETTE PLADS..

min kode ser sådan herud:

      <?php
require "../db.php";
if (isset($_POST['redi'])) {
$tekst = stripslashes($_POST['FCKeditor1']);
$id = intval($_POST['id']);
mysql_query("UPDATE udland SET tekst='$tekst' WHERE id=1") or die(mysql_error());
    echo "<table width=\"366\"  border=\"1\" bordercolor=\"#000000\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">
  <tr><td width=\"366\">
  <table width=\"366\" cellpadding=\"0\" cellspacing=\"0\">
    <td width=\"10\" valign=\"middle\" bgcolor=\"#ebebeb\" class=\"god_txt\"><img src=\"images/godkend.gif\" width=\"23\" height=\"25\"></td>
      <td width=\"356\" valign=\"middle\" bgcolor=\"#ebebeb\" class=\"god_txt\">&nbsp;Siden blev opdateret.</td>
    </table>
    </td>
  </tr>
</table><br>";
}
$sql = mysql_query("SELECT * FROM udland WHERE id='1'");
$row = mysql_fetch_array($sql);
$tekst = $row['tekst'];
$id = $row['id'];
?></div></td>
  </tr>
  <tr>
    <td class="main_txt">
      <form name="redi" method="post" action="udland.php">
        <table width="580" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="90" valign="top" class="main_txt">Tekst:</td>
            <td width="490">&nbsp;</td></tr>
          <tr>
            <td colspan="2" valign="top" class="main_txt"><?php
include("fckeditor/fckeditor.php");

$oFCKeditor = new FCKeditor('FCKeditor1');
$oFCKeditor->BasePath = 'fckeditor/';
$oFCKeditor->Value = $tekst;
$oFCKeditor->Width  = '560';
$oFCKeditor->Height = '400';
$oFCKeditor->Create();
?>
              <input type="hidden" name="id" value="<?php echo $row['id']; ?>" />
              <input type="hidden" name="redi2" value="redi" /></td>
          </tr>
          <tr>
            <td colspan="2"><input name="redi" type="submit" class="ok_input" id="redi" value="Gem" />            </td>
          </tr>
        </table>
      </form>
      </td>
Avatar billede w13 Novice
12. juni 2007 - 17:55 #1
Som den selv foreslår, er der tilsyneladende noget galt med den tekst, som bliver lagt i db'en.

Kan du ikke lige skrive her, hvad hele teksten er, dvs. hvad der kommer før/efter:
's motto er: "RETTE MEDARBEJDER PÅ RETTE PLADS..
Avatar billede w13 Novice
12. juni 2007 - 17:58 #2
Umiddelbart gætter jeg på, det er fordi du bruger tegnet '
Det vil naturligvis skabe problemer her:
tekst='$tekst'

Når den indsætter $tekst, så indsættes også ' , og det lukker derved strengen. Du bør derfor erstatte tegnet ' med html-koden for tegnet &#39;

Du erstatter vist i PHP med:
str_replace("'","&#39;",$tekst)
Avatar billede kimox Nybegynder
12. juni 2007 - 18:03 #3
Aaah ja det er det som var galt.. mange tak for det ! smidt et svar
Avatar billede kimox Nybegynder
12. juni 2007 - 18:03 #4
skal den stå sådan her:

$id = intval($_POST['id']);
str_replace("'","&#39;",$tekst);
$tekst = stripslashes($_POST['FCKeditor1']);

?
Avatar billede w13 Novice
12. juni 2007 - 18:05 #5
Nej du skal gemme det erstattede i en string, sådan her:

$id = intval($_POST['id']);
$tekst = stripslashes($_POST['FCKeditor1']);
$tekst = str_replace("'","&#39;",$tekst);

:)
Avatar billede pidgeot Nybegynder
12. juni 2007 - 18:06 #6
Den betyder at du ved at fjerne slashes har gjort det umuligt at sætte en apostrof ind, og samtidigt har åbnet op for uhyre nem SQL injection.

Det er ganske vist fair nok at ikke bruge den normale magic quotes/addslashes til netop DB-indsættelse, da den ikke er optimal i alle tilfælde, men du *SKAL* så escape $tekst med den rette DB-specifikke escaping funktion - i dette tilfælde mysql_real_escape_string().

Samtidigt bør du egentligt ændre dit script så det ikke er afhængigt af at magic quotes er slået til, bl.a. fordi PHP 6 vil fjerne dette. Måden at gøre det på er ved at fjerne dem fra $_GET, $_POST, $_COOKIE og $_REQUEST i starten (såfremt det er slået til), og så escape dem med den DB-specifikke escaping-funktion når de bruges i queries.
Avatar billede pidgeot Nybegynder
12. juni 2007 - 18:07 #7
w13, du har teknisk set ret i at det omgår problemet, men det er ikke den korrekte måde at håndtere det på - specielt ikke hvis dataene pludselig skal bruges uden for HTML.
Avatar billede kimox Nybegynder
12. juni 2007 - 18:16 #8
det virker fint nok det som w13 har skrevet. men jeg ved ikke om det skal gøres på en anden måde?
Avatar billede pidgeot Nybegynder
12. juni 2007 - 18:23 #9
Der er stor forskel på om noget virker, og på om noget er lavet ordentligt. Alene det at du smider magic quotes væk og kun tænker på ', viser at der på ingen måde er tænkt på sikkerhed - det kan man godt argumentere for der heller ikke er blot ved at forlade sig på magic quotes, men det er langt bedre end det der.

Sagt på anden måde - hvis det er nok for dig at det virker, så SKAL du jo teknisk set ikke - men den dag du finder ud af at en eller anden har udnyttet det script til at slette alt i din database, vil du nok fortryde at du ikke fik lavet det ordentligt i første omgang.
Avatar billede kimox Nybegynder
12. juni 2007 - 18:45 #10
Jamen selvfølgelig vil jeg have det lavet ordentligt, men hvad skal jeg gøre ? dette er kun til et adminsystem, så der er ikke nogen andre end mig der kommer til at rette i det..
Avatar billede pidgeot Nybegynder
12. juni 2007 - 19:09 #11
Det første du skal gøre er at fjerne magic quotes hvis de er der, for at gøre dit script brugbart selvom det ikke er slået til.

Start med at fjerne den stripslashes du laver der i toppen. Den håndterer vi på en anden måde.

Lav et PHP-script der bliver brugt (inkluderet) på ALLE sider. Sandsynligvis sker det allerede med db.php., så du kan skyde en genvej ved enten at placere det i den, eller ved at inkludere en fil derfra. I dette PHP-script skriver du en funktion der
går igennem et array, kalder stripslashes på alt i det og sender arrayet tilbage - den funktion kalder du så . Eksempel 31.2 i PHP manualen kan benyttes direkte til formålet (http://www.php.net/manual/en/security.magicquotes.disabling.php) - der er enkelte uhensigtsmæssigheder mht. nøgler i multidimensionelle arrays, men det er kun i meget sjældne tilfælde det er relevant - hvis det er, kan du se funktioner til at klare det ned i kommentarerne.

Som det sidste skridt skal du i ALLE dine scripts bruge mysql_real_escape_string på de data du bruger i en SQL-sætning, og hvor det stammer fra $_GET, $_POST, m.v. Dvs. at du skal ændre det her:

mysql_query("UPDATE udland SET tekst='$tekst' WHERE id=1")

til det her:

mysql_query("UPDATE udland SET tekst='" . mysql_real_escape_string($tekst) . "' WHERE id=1")

Princippet skal konsekvent benyttes ALLE steder hvor GET, POST, m.v. benyttes - ellers udgør det et sikkerhedshul de steder hvor du IKKE gør det. Af den grund er det en rigtig god ide ikke at uploade noget før alt er rettet. ;)

Bemærk desuden at du KUN skal bruge mysql_real_escape_string inde i selve querien, ved at afbryde query-strengen og kalde funktionen - du skal ikke ændre selve variablen (så slipper du for at unescape igen hvis du skal vise den variabel længere nede i koden).

Man kan selvfølgelig sige at det ikke gør så meget hvis der ikke er andre end dig der skal bruge det, men så skal man ignorere den risiko der er for at andre måske finder vej derind - og når nu man alligevel skal lave det rigtigt alle de steder brugeren skal kunne se og/eller skrive noget, kan man lige så godt lave ALT rigtigt.
Avatar billede kimox Nybegynder
12. juni 2007 - 19:16 #12
ah okay, det lyder som en kæmpe omgang, men jeg kan godt se det er en nødvendighed, så det vil jeg da gå igang med i morgen. Mange tak for din kommentar og din hjælp. Så lærte jeg endnu mere i dag :D
Avatar billede w13 Novice
12. juni 2007 - 19:31 #13
Jaeh, jeg ved ikke meget om databasesikkerhed, men problemet blev i hvert fald løst. =)

Og tak for point!
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