Just nu i M3-nätverket
Gå till innehåll

SQLfråga


Cattas

Rekommendera Poster

Hej

 

När jag lägger in i min databas med hjälp av PHP så vill jag ju inte att man ska kunna lägga in tecken som ' eller andra tecken som inte kan vara så bra.

 

Nu undrar jag om kan göra ngn replace i sqlsatsen och hur man skriver den och vilka tecken är det som man ska undvika?

 

Tack på förhand!

 

Mvh C

 

Länk till kommentar
Dela på andra webbplatser

När jag lägger in i min databas med hjälp av PHP så vill jag ju inte att man ska kunna lägga in tecken som ' eller andra tecken som inte kan vara så bra.

Är det mysql använder du förslagsvis någon av de här:

http://se.php.net/manual/en/function.mysql-real-escape-string.php

http://se.php.net/manual/en/function.mysql-escape-string.php

 

Är det någon annan databas hittar du motsvarande i dokumentation av funktioner som används mot den.

 

 

Länk till kommentar
Dela på andra webbplatser

För att skriva in speciella tecken, behöver du använda en escape sats dvs du behöver skriva tecknet \ före det tecknet som du vill lägga in.

 

Låt säga att du vill skriva in tecknet ' så behöver du skriva \' istället.

 

 

 

Länk till kommentar
Dela på andra webbplatser

För att skriva in speciella tecken, behöver du använda en escape sats dvs du behöver skriva tecknet \ före det tecknet som du vill lägga in.

Vitsen med att använda de för ändamålet avsedda funktionerna istället för att göra det själv är att de gör rätt, alltid. Att bara byta ' mot \' är knappast tillräckligt, vill man göra SQL-injection går man lätt förbi en sådan sak genom att skriva \', sen kommer den ofullständiga koden att göra om det till ett \\' vilket är precis lika skadligt som att skicka in ' från början.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Har läst på lite och jag tror inte riktigt jag förstår. Skulle vara jätteglad om ngn hade tid att förklara lite.

 

Här har jag en insert och update fråga.

 

function Insert($namn,$adress,$text)

{

$SQL = "INSERT INTO {$this->TABLE_DISPLAYTEXT}

(namn, adress, text)

VALUES('" . $namn . "',

'" . $adress . "',

'" . $text . "')";

 

$retval=$this->_DoQuery($SQL,"Insert()");

return $retval;

}

 

 

function Update($namn, $adress,$text)

{

$SQL = "UPDATE $this->TABLE_DISPLAYTEXT

SET namn='" . $namn . "',

adress='" . $adress . "',

text='" . $text . "'

WHERE id= '" . $id . "'";

$retval=$this->_DoQuery($SQL,"Update()");

return $retval;

}

 

Om jag nu exempelvis vill kontrollera at det inte finns några ' i text, gör jag det innan jag sparar ner det i $SQL? Eller eller gör jag det i SET? Och vilka tecken är det man ska akta sig för egentligen?

 

Använder man sig av ex:

 

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",

mysql_real_escape_string($user),

mysql_real_escape_string($password));

 

Tar den bort de tecken som inte är bra då?

 

Tacksam för alla svar!

 

Mvh Catarina

 

Länk till kommentar
Dela på andra webbplatser

Tar den bort de tecken som inte är bra då?

Man tar inte bort några tecken alls.

Det mysql_real_escape_string() gör är att returnera en sträng där alla specialtecken har blivit "escapeade", dvs fått ett sk esacpe-tecken framför så att de tolkas som tecknet i fråga och inte som ett styrtecken till SQL.

 

Din kod:

$query = [color="#ff0000"]sprintf[/color]("SELECT * FROM users WHERE user='%s' [color="#0000ff"]and[/color] password='%s'",
mysql_[color="#0000ff"]real[/color]_escape_[color="#0000ff"]string[/color]($user),
mysql_[color="#0000ff"]real[/color]_escape_[color="#0000ff"]string[/color]($password));

Borde alltså fungera alldeles utmärkt, alterantivt så förenklar man den till ett vanligt uttryck;

$query = "SELECT * FROM users WHERE user='".mysql_[color="#0000ff"]real[/color]_escape_[color="#0000ff"]string[/color]($user)."' [color="#0000ff"]and[/color] password = '".mysql_[color="#0000ff"]real[/color]_escape_[color="#0000ff"]string[/color]($password)."'";

 

Din Update()-funktion blir enligt samma mönster nåt i stil med följande:

[color="#0000ff"]function[/color] Update($namn, $adress,$text)
{
$SQL = "UPDATE $this->TABLE_DISPLAYTEXT
SET namn='" . mysql_escape_[color="#0000ff"]string[/color]($namn) . "',
adress='" . mysql_escape_[color="#0000ff"]string[/color]($adress) . "',
text='" . mysql_escape_[color="#0000ff"]string[/color]($text) . "'
WHERE id= '" . mysql_escape_[color="#0000ff"]string[/color]($id) . "'";
$retval=$this->_DoQuery($SQL,"Update()");
[color="#0000ff"]return[/color] $retval;
}

 

[inlägget ändrat 2005-12-22 11:02:58 av fhe]

Länk till kommentar
Dela på andra webbplatser

Än en går det snabbt att få ett svar! Blir så imponerade!

 

Nu förstår jag. Nu har jag något att testa.

 

Tack ännu en gång!

 

Mvh C

 

Länk till kommentar
Dela på andra webbplatser

Kom på en fråga direkt.

 

Måste mysql_escape_string($xxx)vara med i alla frågor ex Select, Insert och update?

 

och varför använder man inte sprintf("... i update? Är den endast till för SQL?

 

Länk till kommentar
Dela på andra webbplatser

Måste mysql_escape_string($xxx)vara med i alla frågor

Du måste försäkra dig om att det inte skickas in några felaktigheter i alla sorters frågor.

Däremot finns det naturligtvis ingen som helst anledning att göra det om du t.ex readan kollat att en variabel är numerisk (t.ex vid ett årtal) med is_numeric() (http://www.php.net/is_numeric) eftersom något som betraktas som numeriskt naturligtvis inte kan innehålla några andra tecken än just sånt som är giltigt i ett tal.

 

och varför använder man inte sprintf("... i update

Klart du kan använda sprintf om du vill, eftersom PHP kan stränkonkatenering utan att behöva ropa på sprintf() brukar inte jag se någon anledning till det annat än om man vill använda någon sprintf()-specik funktion (som t.ex att skriva ut ett flyttal med max 5 decimaler ("%0.5g") eller motsv.

 

Att göra

  $[color="#0000ff"]var[/color]="hej ".$namn; 

eller:

  $[color="#0000ff"]var[/color]="hej $namn"; 

 

blir lixom samma sak som att göra:

  $[color="#0000ff"]var[/color]=[color="#ff0000"]sprintf[/color]("hej %s", $namn);

 

Och även om det senare förmodligen är knappt mätbart långsammare så handlar det nog mest om tycke och smak vad man använder.

 

Länk till kommentar
Dela på andra webbplatser

Nu har jag gjort min insertfråga och den verkar funka men jag hänger nog inte med i select.

 

För säg att jag skriver in hej'test och sparar så visas det hej'/test i min lista där innehållet radas upp. Och när jag sedan väljer den raden för att uppdatera och den då hämtas i från databasen och läggs i ett formulär. Då står det hej och inte hej'test.

 

Sen undrar jag om en selectfrågar ser ut så här.

 

$SQL ="SELECT d.id,d.textstring,d.created,d.removed,d.created_by,

d.show_text,d.info,d.cancel AS cancel

FROM $this->TABLE_DISPLAYTEXT d,$this->TABLE_TEXTBINDER b

WHERE d.id=b.displaytextID AND b.userID=$this->_userID

ORDER BY d.created";

 

Ska jag ha mysql_real_escape_string(... på exempel textstring?

 

Länk till kommentar
Dela på andra webbplatser

För säg att jag skriver in hej'test och sparar så visas det hej'/test i min lista där innehållet radas upp.

Gissning:

Datat har du fått in via ett fält som du postat till PHP, om du PHP är inställd på att göra sk magic quotes så kommer alla ' som kommer med POST, GET eller i en Cookie att bli utbytta mot \'. När du då gör mysql_escape_string() så kommer även \ att bli escapead så att det du skicar till databasen (vid insert eller update) blir "hej\\\' test", då kommer strängen "hej\'test" att lagras (och det vill du förmodligen inte).

 

För att motverka det måste du antingen stänga av magic_quotes eller lära dig hur get_magic_quotes_gpc() fungerar så att du kan motverka det:

 

Kort-URL för sökning på Eforum: http://surl.se/acxs

PHP-manualen: http://www.php.net/get_magic_quotes_gpc

 

Länk till kommentar
Dela på andra webbplatser

Har kollat om mitt webbhotell har magic quotes och det är på. Måste jag då ha mysql_escape_string() i min insertfråga? Eller är det magic quotes som har det "jobbet" att fylla den funktionen?

 

Men borde det inte då fixa sig med när man hämtar upp värdet oxå?

 

när jag läser php.net fattar jag rätt om man inte har magic quotes påslaget så lägger gör den addslashes() men det löser ju inte mitt problem?

 

För jag kan väl inte bara välja att slå av den?

 

Förlåt om jag tjatar om saker men jag är lite förvirrad. Det blev visst lite svårare än jag trodde!

 

Länk till kommentar
Dela på andra webbplatser

Jag hittade det här stripslashes() förresten. Men jag kan ju inte se ngnstans att det läggs till \ men jag kanske ska använda mig av det iallafall?

 

Måste jag ha det i sqlfrågorna? Blandar man ihop stripslashes() och mysql_escape_string()?

 

Länk till kommentar
Dela på andra webbplatser

Men jag kan ju inte se ngnstans att det läggs till \

Om du har magic_quotes på så kommer det att synas om du skriver ut det du får från en post (har du testat det?).

Får du dessutom extra backslashes i databasen tycker jag visst att det verkar som om du "ser någonstans" att det lägs till.

 

Måste jag ha det i sqlfrågorna?

Nej, dina SQL-frågor innehåller aldrig php-kod. SQL-frågor består av SQL.

 

mysql_escape_string() använder du när du bygger ihop din SQL-sats, om du råkar ha magic quotes påslaget så strippar du förslagsvis bort dem de första du gör när du får en POST, det här överst i filen som tar emot ett formulär borde fungera:

<?php
if ((strcasecmp($_SERVER['REQUEST_METHOD'], "POST")==0)
  && get_magic_quotes_gpc()) {
  foreach($_POST as $key => $value) {
    $_POST[$key]=stripslashes($value);
  }
}
?>

 

Det som redan ligger i databasen kommer naturligtvis fortfarande att vara fellagrat om du har skickat in en massa extra back slashes.

 

Länk till kommentar
Dela på andra webbplatser

Jag är jätteförvirrad så jag tror att jag ska ta det från början:

 

Nu är det så när jag lägger in exempelvis hej'test i ett formulär och sparar ner det i en databas. Så står det bara hej'test i databasen inga \. Har jag sedan en sida som löper igenom databasen så skriver den ut hej'test MEN när jag då trycker på hej'test för att editera den så skriver den bara ut hej i textfältet, alltså inget '\. Och då har jag inte använt ngt mysql_escape_string() ngnstans. Men ska jag använda mysql_escape_string() när jag skriver ut för att få med texten efter '

Hoppas verkligen att du förstår hur jag menar.

 

Tack för ditt tålamod.

 

Länk till kommentar
Dela på andra webbplatser

Har kollat om mitt webbhotell har magic quotes och det är på. Måste jag då ha mysql_escape_string() i min insertfråga? Eller är det magic quotes som har det "jobbet" att fylla den funktionen?

magic quotes gör jobbet "till nöd" så att de som är helt aningslösa inte ska öppna upp sina databaser för allmän tömning.

Förvisso klarar du dig förmodligen med det men då kommer din kod att vara helt vidöppen för vem som helst den dag som du hamnar på en server som inte har magic quotes så det är lixom bättre att göra stripslashes (om det behövs) och sen göra rätt (med mysql_escape_string()).

 

Men borde det inte då fixa sig med när man hämtar upp värdet oxå?

När du hämtar värdet kommer inget att hända. Det sker aldrig någon automatisk översättning av saker när man läser från en databas, det finns det ju ingen anledning till.

 

Länk till kommentar
Dela på andra webbplatser

Jag är jätteförvirrad så jag tror att jag ska ta det från början:

Jag föreslår att du gör det även i koden.

 

Om du gör ett formulär, vars innehåll du postar till en php sida där du gör din SQL-sats och skriver ut den (inte kör den) så kommer du ju att se vad du genererar för SQL, då blir det förhoppningsvis rätt uppenbart för dig vad du får för data in och vad du kommer att skicka för data till din databas.

 

Passa också på att läsa manualen för de i tråden tidigare nämnda funktionerna.

 

När du har förstått vad stripslashes(), mysql_escape_string() och för all del get_magic_quotes_gpc() gör för något så tycker jag du kan börja skicka saker till databasen, inte förr eftersom du förmodligen kommer att skjuta in felaktigt data om du inte har koll på vad du skjuter in.

 

Den rätta vägen är att göra ungefär som jag gjorde i kod-exemplet förut med POST-datat och sen använda mysql_escape_string(). Om du bara vill ha något som fungerar idag och som förmodligen går sönder så småningom kan du använda datat som du får av PHP och bara sätta ihop det till SQL-satser, det kommer nog att fungera hyffsat sålänge inte magic_quotes försvinner.

 

 

Länk till kommentar
Dela på andra webbplatser

okej

 

Så då borde jag om jag ska göra allt rätt när jag sparar ner i databasen:

 

Först kolla om magic quotes är på och är det det så ska man göra stripslashes() och sen efter det så lägger man in i databasen med

mysql_escape_string()? Ska mitt värde då sparas ned så det ser ut så här: hej\'du?

 

Men säg nu att jag ska hämta upp en mening ifrån databasen och det innehåller ett ' (finns inga \ idatabasen). Hur gör jag då så att det ska bli rätt? Utan att den klipper av min text?

 

Använder jag mig då av mysql_escape_string()? Att jag först hämtar upp mitt värde och om det nu ser ut så här: hej\'du, så ska jag använda mig av mysql_escape_string() när jag ska visa meningen?

 

Det är just det här med select jag inte fattar...

 

 

Länk till kommentar
Dela på andra webbplatser

Men säg nu att jag ska hämta upp en mening ifrån databasen och det innehåller ett ' (finns inga \ idatabasen). Hur gör jag då så att det ska bli rätt?

För sista gången: Absolut ingenting (om du är osäker på hur du ska göra det, läs raden igen :) )

 

Den ENDA anledningen till att du behöver använda mysql_escape_string() är att annars kan din SQL-sats bli felaktig om användaren matat in tecken som har en betydelse i SQL.

 

Tänk dig följande exempel:

 

Användaren loggar in med följande uppgifter:

user: admin

password: hej' OR password = password OR password='

 

SELECT * FROM users WHERE namn = 'admin' AND password = 'hej' OR password = password OR password=''

 

Har du slarvat i övrigt så har man rätt lätt lyckats logga in som admin.

 

Om du använder mysql_escape_string när du bygger din SQL-sats så blir ovanstående:

SELECT * FROM users WHERE namn = 'admin\' AND password = 'hej\' OR password = password OR password=\''

 

Och då kommer man inte att få några träffar med mindre att någon har exakt det jättelånga lösenordet.

 

Datat du får tillbaka får du ju inte tillbaka som SQL-satser och behöver naturligtvis då inte heller använda någon funktion för att escapea dem, ingen kommer att magiskt dela av data bara för att det råkar finnas en apostrof (eller något annat tecken) lagrad i databasen.

 

 

Länk till kommentar
Dela på andra webbplatser

Okej, men då tror jag att jag har gjort rätt.

 

Mitt problem är fortfarande (med risk att bli helt idiotförklarad) är att när jag sparar ner i databasen och hämtar upp det värdet i en textbox så har databasen kapat texten där den första ' befinner sig. Och jag förstår verkligen inte var det handlar om...

 

Så om vi skipar allt som har varit innan med att spara ner i databasen, för det är inte något problem längre. Har du ngt tips om vad det kan vara?

 

Säg till om det blir för jobbigt. Är tacksam för att du försöker att hjälpa mig.

 

Mvh C

 

Länk till kommentar
Dela på andra webbplatser

när jag sparar ner i databasen och hämtar upp det värdet i en textbox så har databasen kapat texten där den första ' befinner sig.

Ta reda på var någon kapat det hela, jag kan tänka mig två sätt:

 

1. Titta i något annat verktyg vad som finns i databasen, vad som helst utom kod du skrivit själv borde fungera.

2. Skriv ut SQL-satserna så att du kan se vad du skickar till databasen, skriv också ut vad du får tillbaka. Det går inte att gissa vad som händer baserat på nästan ingen information alls och som enbart är begränsad till vad du säger dig ha matat in och vad du säger dig få ut, allt som spelar roll på vägen är ju helt okänt i dagsläget.

 

Vad har ditt webbhotell för möjligheter? De flesta brukar antingen erbjuda möjlighet att köra t.ex phpMyAdmin för att titta på databasen eller att man loggar in och kör mysql-klienten från ett terminalfönster.

 

Länk till kommentar
Dela på andra webbplatser

jag har databasen (phpmyadmin) framför mig och i den ser jag att texten ser helt okej ut. Inga problem där inte.

 

Jag vet inte om jag har fokuserat fel men på min sida. Nu får du tänka dej så här. så finns det först ett formulär och nedan för så finns det en länk lista som visar upp databasen. I den här listan så kan man trycka på det så dyker den upp i formuläret så kan man ändra texten och så vidare.

 

I den här länklistan så blir det rätt men när man väljer en text så kapas texten av när man ser den i formuläret. Så egentligen så hämtar den väl rätt. Men jag har nog bara hackat upp på detta för att finns det inget ' så funkar allt perfekt.

 

Dessutom så har jag precis upptäckt att ' förstör mitt xmldokument.. f** vad jag bli trött.

 

Just nu vill jag bara slänga det i papperskorgen

 

/C

 

Länk till kommentar
Dela på andra webbplatser

I den här länklistan så blir det rätt men när man väljer en text så kapas texten av när man ser den i formuläret.

Aha, men då är det nog för att du gör HTML:en fel, hur ser din <input>-tag ut om du gör view source på en sida som är kapad?

apostrof är ju strängavgränsare i html också, om du inte satt värdet för value= inom "" utan inom enkelfnuttar/apostrofer så kommer ju enkelfnutten att vara strängavslut även där.

 

Dessutom så har jag precis upptäckt att ' förstör mitt xmldokument.

I XML är ' ett reserverat tecken, använd &amp; &lt; &gt; &apos; och &quot; för & < > ' och "

 

 

Länk till kommentar
Dela på andra webbplatser

Du är klok du! Och jag borde ha sett det där men jag var helt insnöad. Men nu känns det bättre och det funkade det där.

 

Men nu när jag har fått det där urskallen så undrar jag en grej:

 

Ok nu vet jag att min databas har magic quotes på. Och kör jag inte med mysql_escape_string() så funkar allt. Men jag vill gärna göra saker rätt från början. Då när jag nu gör min mysql_real_escape_string() på min textstring. Och då vet jag ju att det kommer in extra \ och då måste jag ju ta bort några \ och då gör jag så här:

 

if( get_magic_quotes_gpc() )
     stripslashes(textString);

 

Så det blir så här till slut:

 

function Insert($textString,$createdBy)
 {
  if( get_magic_quotes_gpc() )
     stripslashes(textString); 

   $SQL = "INSERT INTO $this->TABLE_DISPLAYTEXT
             (textstring,created,created_by)
           VALUES('" . mysql_real_escape_string($textString) . "','" .
                       date("Y-m-d G:i:s") . "'," .
                       $createdBy . ")";
  return $retval;           
 }

 

har jag tänkt rätt då?

 

Tänk vilken lektion det här blev till slut.

 

Det här med xmldokumentet. Gör jag då en kontroll av det jar har hämtat upp från databasen och dyker det upp ett ' så byter jag ut det mot &apos;?

 

/C

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...