webForumDet fria alternativet

Hantera escape-tecken i MySQL

14 svar · 526 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 597 inlägg
#1

Hej,

Jag får ett felmeddelande när jag via ett formulär försöker skicka data som innehåller '-tecknet. Detta beror ju på att det tecknet är ett så kallat escape-tecken i databasen. Om magic_quotes nu är påslaget, ska inte den ta hand om dessa tecken?! Så verkar inte fallet vara just nu på min server eftersom jag får felmeddelanden.

GunnarDMedlem sedan juni 20014 290 inlägg
#2

Använd mysql_real_escape_string() på allt som kommer från ditt formulär.

MeleaMedlem sedan juli 20033 147 inlägg
#3

addslashes()

lillebrorMedlem sedan apr. 20041 597 inlägg
#4

Tack för snabbt svar!

Jag trodde att magic_quotes skulle ta hand om det om det var påslaget men så är det inte?!

mysql_real_escape_string() - den här kör jag i praktiken på alla ställen där en användare har angett information som används i en SQL-fråga?

addslashes() - i vilket skede kör jag denna?!

MeleaMedlem sedan juli 20033 147 inlägg
#5

php.net skrev:

An example use of addslashes() is when you're entering data into a database. For example, to insert the name O'reilly into a database, you will need to escape it. Most databases do this with a \ which would mean O\'reilly. This would only be to get the data into the database, the extra \ will not be inserted. Having the PHP directive magic_quotes_sybase set to on will mean ' is instead escaped with another '.

...

The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

Se verkligen till att du inte använder magic_quotes_gpc(), kan göras genom att köra en if-sats, såhär:

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}

mysql_real_escape_string() kan du läsa en hel del om här.

lillebrorMedlem sedan apr. 20041 597 inlägg
#6

Nu fick jag det att fungera med addslashes. Av någon outgrundlig anledning har jag använt mig at stripslashes när jag tagit emot informationen tidigare. Inte konstigt att det har blivit fel. Behöver jag använda stripsslashes när jag presenterar resultatet?

Se verkligen till att du inte använder magic_quotes_gpc()

Varför vill jag inte använda magic_quotes_gpc()?

lillebrorMedlem sedan apr. 20041 597 inlägg
#7

När jag skulle modda koden som presenterar artiklar fick jag följande felmeddelande:

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 åäö "test".' WHERE sessionID = 'dbd25630a29f65ec36618847c93efb0f'' at line 1

Detta felmeddelande får jag enbart då jag öppnar en testartikel som innehåller följande information:

<font color="red">Test's åäö "test"</font><hr>

PHP-koden när jag skriver ut ser ut så här:

<?php echo stripslashes(htmlspecialchars($array['headline'], ENT_QUOTES)); ?>

Vad är fel?

MeleaMedlem sedan juli 20033 147 inlägg
#8

Testa att stänga av magic_quotes_gpc() och byt ut stripslashes mot addslashes, vad händer då?

lillebrorMedlem sedan apr. 20041 597 inlägg
#9

Melea skrev:

Testa att stänga av magic_quotes_gpc()

Jag har inte möjlighet att ändra de inställningarna på servern där jag har sidan.

Melea skrev:

och byt ut stripslashes mot addslashes, vad händer då?

När jag lägger in informationen om artikeln i databasen låter jag magic_quotes_gpc() (utgår jag ifrån) göra jobbet. SQL-motorn klagar inte överhuvudtaget.

När jag gjorde samma procedur i några av forum-filerna så var det inga problem med alla dessa escape-tecken.

TroxyMedlem sedan mars 20041 505 inlägg
#10

* Tänkte fel

GunnarDMedlem sedan juni 20014 290 inlägg
#11

lillebror skrev:

mysql_real_escape_string() - den här kör jag i praktiken på alla ställen där en användare har angett information som används i en SQL-fråga?

Ja, kör det på alla php variabler som skall in i sql frågan.

lillebrorMedlem sedan apr. 20041 597 inlägg
#12

GunnarD skrev:

Ja, kör det på alla php variabler som skall in i sql frågan.

Ska jag köra mysql_real_escape_string() även fast magic_quotes_gpc() är påslaget?

stevenetMedlem sedan juni 20001 251 inlägg
#13

Ja, fast kör stripslashes på indatan innan. Addslashes förhindrar bara delvis SQL-injections.

lillebrorMedlem sedan apr. 20041 597 inlägg
#14

OK. Nu är det många varianter här :) Blir lite snurrig i huvudet!

Kan vi resonera oss fram till det mest "smakfulla" sättet att göra detta på för att minimera risken för SQL-injections och för att kunna tillåta ' " -tecken i inputen?

MeleaMedlem sedan juli 20033 147 inlägg
#15

Kan bara säga hur jag sparar och skriver ut min information.
När jag sparar informationen kör jag alla variablar som innehåller någon information som kommer från ett formulär genom en loop:

foreach($data as $key => $value) {
	$data[$key] = $this->func->eString($value);
}

Vilket i sin tur kör all data genom en funktion:

function eString($string) {

	return (!get_magic_quotes_gpc() ? mysql_safe_escape_string(trim($string)) : trim($string));

}

Vilket helt enkelt kollar om magic_quotes_gpc() är påslaget, och om så inte är fallet körs mysql_safe_escape_string() och trim(), annars endast trim().
Eftersom du har magic_quotes_gpc() påslaget i php.ini får du nog experimentera lite med hur outputen blir från if-satsen i funktionen "eString".

När jag sedan ska skriva ut all information kör jag informationen genom en annan funktion som ser ut såhär.

function parser($string) {

	...en massa andra funktioner här som inte är relevanta

	return nl2br(htmlspecialchars(stripslashes($string), ENT_QUOTES));

}

Förlåt om jag gjort allting lite "messy" innan. Skyller på min feber. :)

135 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)