YourWBB


yourWBB » yourWBB Misc * » Das Proggen » MySQL und PHP » Fragen zu $_Post » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag 4.188 Views | | Thema zu Favoriten hinzufügen

Neues Thema erstellen Antwort erstellen

Zum Ende der Seite springen Fragen zu $_Post
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Didito
Mitglied


Dabei seit: 30.11.04
Beiträge: 442
Fähigkeiten: WBB2 Profi
Forenversion: 2.3

 Fragen zu $_Post Antworten Zitieren Editieren Melden       UP

Ich wollte mal wissen was der Unterschied ist zwischen

$_Post[username]

und

".$_Post[username]."

Ich sehe das immer anders.

Zum Beispiel:

code:
1:
2:
3:
mysql_query("UPDATE ".$conf['db_prefix']."_user SET premium = '1' WHERE username='".$_POST['username']."'");


oder

code:
1:
2:
3:
mysql_query("UPDATE ".$conf['db_prefix']."_user SET premium = '1' WHERE username='$_POST[username]'");


Was ist der Unterschied?
Was sollte man nutzen?

Mir ist auch aufgefallen, dass wenn ich $_POST weglasse, also zum Beispiel
... WHERE username='$username'");
mache, dass es nicht auf allen Webspaces Funktioniert.
Ich habe nämlich ein kleines Script gemacht und bei mir geht das und bei meinem Freund nicht.

Liegt das an den register_globals ?

Und wie sieht es aus, wenn man viele Werte in die Datenbank eingeben muss und nach jedem Wert ein Zeilenumbruch macht? Wie muss man dann das $_Post schreiben?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Didito: 17.11.08 23:36.

17.11.08 23:30 Didito ist offline Finden Als Freund hinzufügen
Dizzy.w3 Dizzy.w3 ist männlich
Brain Damage


images/avatars/avatar-5617.jpg

Dabei seit: 18.07.07
Beiträge: 1.431
Herkunft: Österreich
Forenversion: 3.0

Antworten Zitieren Editieren Melden       UP

Hallo,

a really short introduction:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// es folgt ein String, eine Zeichenkette, eine Array - Ansammlung - an Chars (Buchstaben)
"Ich bin ein String alias Zeichenkette"

// in PHP lassen sich Zeichenketten wie folgt verketten (verkettet wird unter PHP mit einem Punkt.
"String1"."String2"

// dies entspricht 1:1 folgendem String
"String1String2"

// $_POST['username'] gibt nicht anderes zurück, als einen String:
"String1".$_POST["username"]


Wie man nun leicht erkennen kann, ist auch in $_POST["username"] ein String vorhanden. Nämlich

php:
1:
"username"
.

$_POST ist ein Array, welches assoziativ angesprochen werden kann. Sprich, der Index muss keine Zahl sein, es darf auch ein eindeutiger String angegeben werden, was hier sogar Pflicht ist, weil den einzelnen Objekten in diesem Array nie ein numerischer Index zugewiesen wird.

In deinem Beispiel ist $conf auch nichts anderes als ein assoziatives Array.

Strings müssen immer unter Anführungszeichen angegeben werden, wobei man " und ' unterscheidet. Wie das genau ist, zeigt sich im folgenden Beispiel:

php:
1:
2:
3:
4:
5:
6:
7:
<?php
$foo 'bar'// entspricht $foo = "bar";

echo "$foo"// Ausgabe: bar
echo '$foo'// Ausgabe: $foo
echo $foo// Ausgabe: bar
?>


Ich hoffe dein Verständnis weit genug gepusht zu haben, sodass du deine Frage selbst beantworten kannst.


Wegen dem Problem bzgl dem Weglassen:
Das ist abhängig von den Einstellungen, mit denen PHP läuft.

$username lässt sich in diesem Fall auf POST-Werte anwenden, wenn register_globals aktiviert ist. Aus Sicherheitsgründen ist dies selten gegeben.

$_POST['username'] ist immer legitim, weil es einen näheren Namespace angibt.

Sauber ist, um nicht immer den langen Text eingeben zu müssen via

php:
1:
$username $_POST['username'];


das ganze umzuschichten.


Das mit dem Zeilenumbruch geht schon in Richtung Coding-Stil. Zeilenumbrüche macht man laut Standards erst - afaik wegen Schriftstandards und DIN A4, wenn die Zeile länger als 80 Zeichen ist bzw wird.

Ich hab leider keine Ahnung, wie das unter PHP praktisch umgesetzt wird, weil ich es so noch nie angewandt habe, aber ich denke, dass sich das als ganz leserlich darstellt.

php:
1:
2:
3:
4:
5:
$query "INSERT INTO tabelle VALUES("
    $variable1
    $variable2
    $variable3
    ")";


Edit:
Kleiner Tipp Punkto Sicherheit

Eventuell für dich noch nicht so relevant, aber für die Sicherheit bestimmt: Um einer SQL-Injection vorzubeugen eignen sich mysql_real_escape_string() und addslashes()

__________________
Gruß Dizzy

the rest is silence

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Dizzy.w3: 18.11.08 00:10.

18.11.08 00:00 Dizzy.w3 ist offline E-Mail Finden Als Freund hinzufügen Füge Dizzy.w3 in deine Kontaktliste ein MSN Passport-Profil von Dizzy.w3 anzeigen
Didito
Mitglied


Dabei seit: 30.11.04
Beiträge: 442
Fähigkeiten: WBB2 Profi
Forenversion: 2.3

Themenstarter Thema begonnen von Didito
Antworten Zitieren Editieren Melden       UP

OK

Verstanden werden jetzt immer

$_Post['username']

machen

Und sollte man das immer machen

'".addslashes($_POST['title'])."'

'".intval($_POST['id'])."'

oder kann man das addslahes und intval auch weglassen?
18.11.08 00:16 Didito ist offline Finden Als Freund hinzufügen
Dizzy.w3 Dizzy.w3 ist männlich
Brain Damage


images/avatars/avatar-5617.jpg

Dabei seit: 18.07.07
Beiträge: 1.431
Herkunft: Österreich
Forenversion: 3.0

Antworten Zitieren Editieren Melden       UP

Hi,

addslashes und intval nutzte nur, wenn der Benutzer eine Eingabe getätigt hat, und du diese Eingabe weiter verwendest, zB in einer WHERE-Bedingung.

__________________
Gruß Dizzy

the rest is silence

18.11.08 00:31 Dizzy.w3 ist offline E-Mail Finden Als Freund hinzufügen Füge Dizzy.w3 in deine Kontaktliste ein MSN Passport-Profil von Dizzy.w3 anzeigen
[kamui]
~


images/avatars/avatar-4963.gif

Dabei seit: 27.04.05
Beiträge: 2.992

Antworten Zitieren Editieren Melden       UP

Dizzy deins ist nicht ganz richtig.

Auch Arrays werden innerhalb der Hochkommata erkannt. Sollte man aber der Schönheit des Programmiercodes Willen vermeiden Augenzwinkern

Bei MySQL bietet sich im übrigen mysql_real_escape_string anstelle von addslashes an.
18.11.08 16:41 [kamui] ist offline Finden Als Freund hinzufügen
Didito
Mitglied


Dabei seit: 30.11.04
Beiträge: 442
Fähigkeiten: WBB2 Profi
Forenversion: 2.3

Themenstarter Thema begonnen von Didito
Antworten Zitieren Editieren Melden       UP

Also ich mache es jetzt immer so

code:
1:
2:
3:
mysql_query("UPDATE ".$conf['db_prefix']."_user SET premium = '$_PSOT[premium]' WHERE username='$_POST[username]'");


Ist das so ok?

Oder vorher übergeben

code:
1:
2:
3:
4:
5:
6:
$premium = $_POST['premium'];
$username = $_POST['username'];

mysql_query("UPDATE ".$conf['db_prefix']."_user SET premium = '$premium' WHERE username='$username'");


Gehen doch beide Beispiele bei register_globals on und off oder ?
18.11.08 17:47 Didito ist offline Finden Als Freund hinzufügen
[kamui]
~


images/avatars/avatar-4963.gif

Dabei seit: 27.04.05
Beiträge: 2.992

Antworten Zitieren Editieren Melden       UP

Du kannst es vorher übergeben, dann würde ich aber auf jeden Fall addslashes oder mysql_real_escape_string einbauen.

php:
1:
2:
3:
4:
$premium mysql_real_escape_string($_POST['premium']);
$username mysql_real_escape_string($_POST['username']);

mysql_query("UPDATE ".$conf['db_prefix']."_user SET premium = '$premium' WHERE username='$username'");
18.11.08 22:29 [kamui] ist offline Finden Als Freund hinzufügen
ChrisGross
Mitglied


Dabei seit: 18.01.06
Beiträge: 25
Fähigkeiten: WBB2 Profi; WBB Lite 1 Profi

Antworten Zitieren Editieren Melden       UP

Zitat:
Original von Dizzy.w3
Hi,

addslashes und intval nutzte nur, wenn der Benutzer eine Eingabe getätigt hat, und du diese Eingabe weiter verwendest, zB in einer WHERE-Bedingung.


Muss übrigens noch nicht mal angegeben werden. Ips, Cookies, Referer etc. können alle manipuliert werden. Alles was Klient seitig ist muss gesichert werden. Und nicht nur in SQL sondern auch gegen z.B. HTTP Response Splitting Attacken.
19.11.08 06:49 ChrisGross ist offline E-Mail Finden Als Freund hinzufügen
Didito
Mitglied


Dabei seit: 30.11.04
Beiträge: 442
Fähigkeiten: WBB2 Profi
Forenversion: 2.3

Themenstarter Thema begonnen von Didito
Antworten Zitieren Editieren Melden       UP

Mir ist noch aufgefallen das manche eine Variable so deklarieren

$username = $_POST['username'];

und manche so

$username = $_POST["username"];

Was ist nun richtig?

' oder " in der eckigen Klammer?

Oder ist das ab einer bestimmten php Version egal.
24.11.08 20:24 Didito ist offline Finden Als Freund hinzufügen
[kamui]
~


images/avatars/avatar-4963.gif

Dabei seit: 27.04.05
Beiträge: 2.992

Antworten Zitieren Editieren Melden       UP

Das ist immer egal. Solltest aber darauf achten, dass du überhaupt Hochkommata einsetzt und nicht $_POST[username] schreibst.

Gilt bloß das übliche bzgl. der Variablen.
24.11.08 20:40 [kamui] ist offline Finden Als Freund hinzufügen
Didito
Mitglied


Dabei seit: 30.11.04
Beiträge: 442
Fähigkeiten: WBB2 Profi
Forenversion: 2.3

Themenstarter Thema begonnen von Didito
Antworten Zitieren Editieren Melden       UP

Hier mal eine Datei von mir.

Ist der Quellcode so in Ordnung?
Also der PHP Code mit dem $_POST überall

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:

<?php
##### Auf benötigte Rechte prüfen #####
$result mysql_query("SELECT can_admin_user FROM ".$sql_prefix."_admin_user WHERE user_id = '".$_SESSION['user_id']."'");
$row mysql_fetch_array($result);

if(!$row['can_admin_user'])
{
    echo("<div align=\"center\"><b>Fehler:</b> Keine Berechtigung!</div>");
    exit;
}
##### Auf benötigte Rechte prüfen - Ende #####

if($action == 'speichern')
{
    if($_POST['username'] == "")
    {
        $message "<b>Bitte geben Sie einen Usernamen an!</b>";
    }
    elseif($_POST['passwort'] == "")
    {
        $message "<b>Bitte geben Sie ein Passwort an!</b>";
    }
    elseif($_POST['passwort_wiederholen'] == "")
    {
        $message "<b>Bitte wiederholen Sie das Passwort!</b>";
    }
    elseif(strlen($_POST['passwort_wiederholen']) < 5)
    {
        $message "<b>Das Passwort muss aus mindestens 5 Zeichen bestehen!</b>";
    }
    elseif($_POST['passwort'] != $_POST['passwort_wiederholen'])
    {
        $message "<b>Die Passwörter müssen identisch sein!</b>";
    }
    else
    {
        mysql_query("INSERT INTO ".$sql_prefix."_admin_user (username,passwort,can_admin_user,can_design,can_logo_upload,can_home,can_news,can_newsletter,can_spielplan_tabelle,can_spielberichte,can_spieler,can_trainerstab,can_trainingszeiten,can_statistik,can_news_intern,can_termine,can_mannschaftskasse,can_strafenkatalog,can_impressum,can_disclaimer,can_sponsoren,can_link_us,can_ankuendigung,can_ticker,can_schon_gewusst,can_modus,can_gaestebuch,can_shoutbox,can_counter,can_loginlog,can_datenbank) VALUES ('".$_POST['username']."','".md5($_POST['passwort'])."','".$_POST['can_admin_user']."','".$_POST['can_design']."','".$_POST['can_logo_upload']."','".$_POST['can_home']."','".$_POST['can_news']."','".$_POST['can_newsletter']."','".$_POST['can_spielplan_tabelle']."','".$_POST['can_spielberichte']."','".$_POST['can_spieler']."','".$_POST['can_trainerstab']."','".$_POST['can_trainingszeiten']."','".$_POST['can_statistik']."','".$_POST['can_news_intern']."','".$_POST['can_termine']."','".$_POST['can_mannschaftskasse']."','".$_POST['can_strafenkatalog']."','".$_POST['can_impressum']."','".$_POST['can_disclaimer']."','".$_POST['can_sponsoren']."','".$_POST['can_link_us']."','".$_POST['can_ankuendigung']."','".$_POST['can_ticker']."','".$_POST['can_schon_gewusst']."','".$_POST['can_modus']."','".$_POST['can_gaestebuch']."','".$_POST['can_shoutbox']."','".$_POST['can_counter']."','".$_POST['can_loginlog']."','".$_POST['can_datenbank']."')");

        $message "<b>".$_POST['username']." erfolgreich hinzugefügt!</b>";

        header("Location: index.php?site=admin_user_show&message=$message");
    }
}
?>

<html>

<head>

<script type="text/javascript">
<!--
function selectAll()
{
    var c = document.forms[0].selAll.checked;

    for (i=0; i<document.forms[0].elements.length; i++)
    {
        if (document.forms[0].elements[i].type == "checkbox" && document.forms[0].elements[i].name != document.forms[0].selAll.name)
        {
            if (c == true) document.forms[0].elements[i].checked = true;
            else document.forms[0].elements[i].checked = false;
        }
    }
}
//-->
</script>

</head>

<body>

<h1>Admin User hinzufügen</h1>

<div align="center">

<?=$message;?>

<form action="index.php?site=admin_user_add" method="POST">
<input type="hidden" name="action" value="speichern">
<table class="border" bordercolor="<?=$design_tabellenrahmen;?>" width="50%" cellpadding="2" cellspacing="0">
<tr>
<td class="border" width="38%"><b>&nbsp;Username:</b></td>
<td class="border">&nbsp;<input type="text" name="username" value="<?=$username;?>" style="width:98%"></td>
</tr>
<tr>
<td class="border" width="38%"><b>&nbsp;Passwort:</b></td>
<td class="border" >&nbsp;<input type="password" name="passwort" value="" style="width:98%"></td>
</tr>
<tr>
<td class="border" width="38%"><b>&nbsp;Passwort wiederholen:</b></td>
<td class="border">&nbsp;<input type="password" name="passwort_wiederholen" value="" style="width:98%"></td>
</tr>
<tr>
<td class="border" valign="top" width="38%"><b>&nbsp;Rechte:</b></td>
<td class="border">
&nbsp;<input class="checkbox" type="checkbox" name="selAll" value="1" onClick="selectAll()"><b> Alle Rechte</b><br>
&nbsp;<input class="checkbox" type="checkbox" name="can_admin_user" value="1"> Admin User<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_design" value="1"> Design<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_logo_upload" value="1"> Logo-Upload<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_home" value="1"> Home-Site<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_news" value="1"> News<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_newsletter" value="1"> Newsletter<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_spielplan_tabelle" value="1"> Spielplan & Tabelle<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_spielberichte" value="1"> Spielberichte<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_spieler" value="1"> Spieler<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_trainerstab" value="1"> Trainerstab<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_trainingszeiten" value="1"> Trainingszeiten<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_statistik" value="1"> Statistik<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_news_intern" value="1"> Interne News<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_termine" value="1"> Termine<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_mannschaftskasse" value="1"> Mannschaftskasse<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_strafenkatalog" value="1"> Strafenkatalog<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_impressum" value="1"> Impressum<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_disclaimer" value="1"> Disclaimer<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_sponsoren" value="1"> Sponsoren<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_link_us" value="1"> Link Us<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_ankuendigung" value="1"> Ankündigung<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_ticker" value="1"> Ticker<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_schon_gewusst" value="1"> Schon gewusst?<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_modus" value="1"> Modus<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_gaestebuch" value="1"> Gästebuch<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_shoutbox" value="1"> Shoutbox<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_counter" value="1"> Counter<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_loginlog" value="1"> Loginlog<br>
&nbsp;<input class="checkbox" type="checkbox" name="can_datenbank" value="1"> Datenbank<br>
</td>
</tr>
<tr>
<td class="border" colspan="2" align="center"><input type="submit" class="button" value="Speichern"><input class="button" type="reset" value="Zurücksetzen" onClick="return confirm('Möchten Sie die Angaben wirklich zurücksetzen?')"></td>
</tr>
</table>
</form>

</div>

</body>

</html>

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Didito: 24.11.08 22:24.

24.11.08 21:44 Didito ist offline Finden Als Freund hinzufügen
[kamui]
~


images/avatars/avatar-4963.gif

Dabei seit: 27.04.05
Beiträge: 2.992

Antworten Zitieren Editieren Melden       UP

Es gibt hier nicht umsonst PHP-Tags =D

Du hast kein mysql_real_escape_string oder addslashes drin, wenn du die Werte in line37 einfügst.
24.11.08 22:09 [kamui] ist offline Finden Als Freund hinzufügen
Didito
Mitglied


Dabei seit: 30.11.04
Beiträge: 442
Fähigkeiten: WBB2 Profi
Forenversion: 2.3

Themenstarter Thema begonnen von Didito
Antworten Zitieren Editieren Melden       UP

Es funktioniert aber mit register_globals on und off
24.11.08 22:23 Didito ist offline Finden Als Freund hinzufügen
Agi Agi ist männlich
TEAM - PHP Freak

images/avatars/avatar-5240.gif

Dabei seit: 22.11.04
Beiträge: 2.628
Fähigkeiten: WBB3 Profi
Forenversion: 3.1

Antworten Zitieren Editieren Melden       UP

Das spielt hierfür keine Rolle ... Du hast ne gravierende Sicherheitslücke drinnen, wenn du kein addslashes bzw. mysql_real_escape_string verwendest ...

__________________

25.11.08 00:01 Agi ist offline Finden Als Freund hinzufügen
Baumstruktur | Brettstruktur
Gehe zu:

Neues Thema erstellen Antwort erstellen

yourWBB » yourWBB Misc * » Das Proggen » MySQL und PHP » Fragen zu $_Post