- Mattias Jonsson
- Medlem ●
- Stockholm
Säkerhetsmedveten som man är uppdaterade man ju PHP till 4.2.2 för ett tag sen - allt via entropy.ch.
Men - hur jag än försöker förstå så kan jag inte komma på varför följande inte funkar i 4.2.2 då det funkar perfekt i 4.1.2.
Vad är det som är ändrat i sättet en "IF" sats uttrycks?
Jag har en IF sats där jag kontrollerar om variabeln "Action" har ett visst värde, i detta fallet "New".
Hela alltet ligger på en sida vi kan kalla test.php.
code:<pre style="font-size:x-small; font-family: monospace;">
<HTML>
<HEAD>
<TITLE>Funkar i PHP 4.1.2 men inte i 4.2.2</TITLE>
</HEAD>
<?php IF ($Action == "New") {?>
Syns i 4.1.2...
<?php } ?>
</HTML>
</pre>
I detta fallet skulle en länk som leder till "test.php?Action=New" visa texten "Syns i 4.1.2..." när PHP 4.1.2 är aktivt men inte i PHP 4.2.2.
Jag behöver ju nödvändigtvis inte använda just detta sättet att kontrollera variabelns värde, men ett liknande är önskvärt. Huvudsaken är att jag kan lägga ren HTML mellan två "block" med PHP kod som ovan.
Någon som har lite mer koll på PHP än vad jag har?
/Mattias
Jag har! Från och med 4.2.0 så är default för PHP att register_globals är satt till off, därmed kan du inte accessa dom på samma sätt som tidigare. Läs mer här också (eller fråga om det är nåt du inte förstår):
http://www.php.net/manual/en/language.variables.predefined.php
Jupp, har läst en del på den sidan. Men, eftersom jag är en "försök så funkar det tillslut" PHP knackare så förstår jag inte mycket av den mumbojumbon...
Så, då har jag två frågor utifrån ditt svar.
1) Hur accessar jag då - dvs skrivs IF satsen på något anorlunda sätt nu då?
2) Kan jag ändra den flaggan till "on" och förenkla lite för mig? Vad är anledningen till att man valde att ändra detta?
/Mattias
quote:1) Hur accessar jag då - dvs skrivs IF satsen på något anorlunda sätt nu då?
if($HTTP_GET_VARS["Action"] == ´New´)
print "Detta borde fungera";
quote:Kan jag ändra den flaggan till "on" och förenkla lite för mig? Vad är anledningen till att man valde att ändra detta?
Gör det Anledningen till att det är Off som standard är säkerheten. Fast jag har inget konkret exempel på hur du kan göra för att använda en sådan säkerhetslucka.
//Patrick
quote:Skapades ursprungligen av: Patrick Lindgren:
if($HTTP_GET_VARS["Action"] == ´New´)
print "Detta borde fungera";
Yepp - tackar för det. Detdär var ju ganska smärtfritt. Funkar ju t.o.m att göra en Batch find&replace i BBEdit, kan inte bli bättre.
Hur gör jag för att sätta globals = on då? På A svarar jag PHP.INI och på B svarar jag att det kan man säkert läsa i manualen... Får jag poäng då?
/Mattias
quote:Skapades ursprungligen av: Mattias Jonsson:
quote:Skapades ursprungligen av: Patrick Lindgren:
if($HTTP_GET_VARS["Action"] == ´New´)
print "Detta borde fungera";
Yepp - tackar för det. Detdär var ju ganska smärtfritt. Funkar ju t.o.m att göra en Batch find&replace i BBEdit, kan inte bli bättre.
Hur gör jag för att sätta globals = on då? På A svarar jag PHP.INI och på B svarar jag att det kan man säkert läsa i manualen... Får jag poäng då?
/Mattias
Bara på A, manualen för php.ini är nämligen inte lika enkel att förstå sig på som resten av php.net Men det stämmer, du ska titta där. Annars kan du sätta php.ini värden i virtual host delen av httpd.conf.
//Patrick
Det är bättre att använda $_GET istället för $HTTP_GET_VARS eftersom det är nya sättet som dom rekommenderar. Men annars var nog Patricks exempel rätt. (Du kan även använda $_REQUEST - den kan vara bra om du inte vet om det är från en GET eller POST som din variabel kommer).
Den säkerhetslucka som register_globals innehär är att om du har ett PHP-script där du anropar en variabel som inte är tänkt att komma utifrån så kan man ändå påverka den utifrån genom att skriva en query string som t.ex. test.php?intern_variabel=1 och då kommer alltså att $intern_variabel att vara 1 även om det inte var tänkt så, om du har register_globals påslaget.
[ 04 Augusti 2002, 23:37: Meddelandet ändrat av: Adrian B ]
quote:Skapades ursprungligen av: Adrian B:
Det är bättre att använda $_GET istället för $HTTP_GET_VARS eftersom det är nya sättet som dom rekommenderar. Men annars var nog Patricks exempel rätt. (Du kan även använda $_REQUEST - den kan vara bra om du inte vet om det är från en GET eller POST som din variabel kommer).
Ahh, okej.
Så om jag inte vet är det $_REQUEST så får jag värdet på variabeln oavsett hur/var den skapats. Om jag använder Post för att skapa en variabel $A så kommer den inte att ha något värde om jag frågar efter den med $_GET men det satta värdet om jag använder $_POST. Okej.
För övrigt så var det inte direkt svårt att slå på globals i php.ini.
register_globals = on fick en egen rad, starta om apache och sen var det klart.
Det får bli den fixen tills jag hunnit ändra i mina script.
Tackar till er båda.
/Mattias
quote:Skapades ursprungligen av: Mattias Jonsson:
Så om jag inte vet är det $_REQUEST så får jag värdet på variabeln oavsett hur/var den skapats. Om jag använder Post för att skapa en variabel $A så kommer den inte att ha något värde om jag frågar efter den med $_GET men det satta värdet om jag använder $_POST. Okej.
Japp, det stämmer. Eller för att vara helt korrekt: $_REQUEST gäller för post, get och session, de tre osäkra sätten att ta in en variabel (osäkra i den meningen att användaren kan styra innehållet i dom och att de därmed inte är att lita på - man bör kontrollera innehållet i dom lite intelligent).
Kul att kunna hjälpa till! Råkade ut för en hel del fel när en sajt jag sköter om helt plötsligt började fungera väldigt konstigt. Det visade sig att dom uppdaterat PHP på webbhotellet och den sajten skrevs långt innan dom slog av register_globals. Som tur var slog dom på det igen så jag slapp skriva om hela sajten!
[ 05 Augusti 2002, 00:01: Meddelandet ändrat av: Adrian B ]
quote:Den säkerhetslucka som register_globals innehär är att om du har ett PHP-script där du anropar en variabel som inte är tänkt att komma utifrån så kan man ändå påverka den utifrån genom att skriva en query string som t.ex. test.php?intern_variabel=1 och då kommer alltså att $intern_variabel att vara 1 även om det inte var tänkt så, om du har register_globals påslaget.[/QB]
Fast det gäller väl bara om du har ändrat vilket av Get/Post/Internal som står högst i rangordningen? Som standard skriver variabler satta i scripten över värdet av en GET eller POST request.
//Patrick
Ah, underbart att som hobbyknackare snubbla över den här tråden. Har inte heller begripit hur fanken jag ska få mina sidor att funka i 4.2, så jag har stannat kvar i 4.1.2, men det är ju en lösning som inte håller i längden.
Men, man kanske kan få svar på en fråga jag grunnat på: var ska php.ini ligga om man någon dag får för sig att skapa den?
quote:Skapades ursprungligen av: ohennig:
Men, man kanske kan få svar på en fråga jag grunnat på: var ska php.ini ligga om man någon dag får för sig att skapa den?
i /usr/local/lib/
Om det inte finns...
code:<pre style="font-size:x-small; font-family: monospace;">sudo mkdir -p /usr/local/lib
sudo touch /usr/local/lib/php.ini</pre>
sedan, för att redigera php.ini
code:<pre style="font-size:x-small; font-family: monospace;">sudo pico /usr/local/lib/php.ini</pre>
Allt detta finns på www.entropy.ch där Marc L gjort livet fantastiskt mycket enklare för oss OS X människor.
Läste för övrigt att PHP 4.3 kommer vara första versionen som fullt stödjer Mac OS X. Ska bli intressant när den kommer.
/Mattias
quote:Skapades ursprungligen av: Patrick Lindgren:
Fast det gäller väl bara om du har ändrat vilket av Get/Post/Internal som står högst i rangordningen? Som standard skriver variabler satta i scripten över värdet av en GET eller POST request.
Jo, nog är det så. Det är ju ingen stor säkerhetsrisk. Men om man skulle glömma att sätta en variabel i scriptet eller kanske förlitar sig på att den är noll i och med att den inte är satt tidigare (vilket iofs inte är speciellt snyggt) så kan det vara en säkerhetslucka.
quote:Men, man kanske kan få svar på en fråga jag grunnat på: var ska php.ini ligga om man någon dag får för sig att skapa den?
Om ni trots Mattias eminenta svar inte får det att fungera, skapa en php fil och skriv
code:<pre style="font-size:x-small; font-family: monospace;"><? phpinfo() ?></pre>
och titta sedan på sidan genom en webbläsare så står det där var den ska ligga (det beror nämligen på hur man konfigurerat php vid kompilering)
//Patrick
quote:Skapades ursprungligen av: Patrick Lindgren:
code:<pre style="font-size:x-small; font-family: monospace;"><? phpinfo() ?></pre>
och titta sedan på sidan genom en webbläsare så står det där var den ska ligga (det beror nämligen på hur man konfigurerat php vid kompilering)
//Patrick
Ja, just. Mitt exempel bygger på att det är Marc L:s kompilering man använder. www.entropy.ch
/Mattias
code:<pre style="font-size:x-small; font-family: monospace;">Ja, just. Mitt exempel bygger på att det är Marc L:s kompilering man använder. www.entropy.ch</pre>
Misstänkte det Tänkte bara ge en lite mer allmän vinkling om man någon gång sitter framför en *NIX dator och stöter på problemet.
//Patrick
Installerade PHP & MySQL på burken igen efter de har varit borta ett tag... tänkte se till att jag blir PHP proffs igen som jag var för ett år sedan...
Med paketen från Marc går det hur lätt som helst!
Det tog inte mer än en halvtimme att installera och få det klart.
Så nu sitter jag här med utvecklingsdator igen.
PHP 4.2.x hade jag inte provat på innan igår. Senast jag höll på som mest var det 4.1.x.
Men med eran hjälp här med detta så var jag snart i full fart igen. Nu är jag tillbaka där jag var och jagar de små buggarna:
;
och stavfel...
Detta rockar verkligen!
Vad ska jag nu bygga? Hmmm en chatt har jag funderat på länge. Men först ska det bli till att lära mig att kontrollera MySQL från terminalen.
Hårdrock inget phpMyAdmin här inte.
Svettigt värre men med dokumentationen på mysql.com går det bra!
[ 06 Augusti 2002, 14:57: Meddelandet ändrat av: Mattias Hedman ]
quote:Detta rockar verkligen!
Vad ska jag nu bygga? Hmmm en chatt har jag funderat på länge. Men först ska det bli till att lära mig att kontrollera MySQL från terminalen.
Hårdrock inget phpMyAdmin här inte.
Svettigt värre men med dokumentationen på mysql.com går det bra!
Terminalen är klart överskattad vad gäller MySQL. Det går tusen gånger fortare att göra saker via phpadmin och man lär sig ändå hur man ska skriva kommandon eftersom du inte kan göra joins etc utan att skriva saker manuellt i phpadmin. Dessutom presenterar den resultatet på ett mer överskådligt sätt. Särskillt om du har tabeller med 30-40 fält. Det är inte så kul att läsa genom terminalen...
//Patrick
quote:Skapades ursprungligen av: Patrick Lindgren:
Terminalen är klart överskattad vad gäller MySQL. Det går tusen gånger fortare att göra saker via phpadmin och man lär sig ändå hur man ska skriva kommandon eftersom du inte kan göra joins etc utan att skriva saker manuellt i phpadmin. Dessutom presenterar den resultatet på ett mer överskådligt sätt. Särskillt om du har tabeller med 30-40 fält. Det är inte så kul att läsa genom terminalen...
Håller med. Kan inte säga att jag gett klientprogrammet mysql så särskilt många chanser, men PHPMyAdmin är ju himla smidigt. Själva SQL-språket måste man ju lära sig ändå, om man gör egna PHP-MySQL-projekt vill säga.
Jo jag har gett upp MySQL via Terminalen.
Det går så mycket fortare med phpMyAdmin.
Nåja. Jag håller på med en login lösning.
Jag pysslar med sessions. De är ju globala nu med under php 4.2.2.
Så... jag håller på att översätta mitt gamla system till att använda globals. Men...
Kan nån bara enkelt förklara för min trötta hjärna vilka kommandon som fungerar och inte samt vilka deras ersättare är i session hantring nu.
Hmmm detta kanske skulle vara en egen tråd...
Jag har faktiskt precis sysslat med sessionshanteringen. Har byggt ett litet distansutbildningssystem och häromdagen slutade allt fungera pga av uppdatering av PHP. Så jag fick skriva om alla anrop till servervariabler (som $REMOTE_ADDR till $_SERVER[´REMOTE_ADDR´]) och så la jag till import_request_variables("GP") (som jag tipsade om ovan) i en inkluderingsfil så jag kom runt problemet med globala variabler. Men då återstod en sak att fixa, sessionshanteringen.
Det var faktiskt lite småknepigt, framförallt för att det fungerar lite annorlunda. Förut så gjorde jag en session_register("SESSION") i början av varje dokument så jag fick den globala sessionvariabeln $SESSION tillgänglig. Men med den nya superglobala $_SESSION så behöver man inte (*ska* man inte) använda session_register() utan det är bara att använda $_SESSION direkt. Så i mitt fall tog jag bort session_register("SESSION") helt och samtidigt ändrade jag alla $SESSION till $_SESSION[´SESSION´]. Sen fungerade det (tror det var allt - men jag kan ju ha glömt nåt steg just nu).
Man behöver förstås fortfarande starta sessionshanteringen med session_start().
Hoppas det var hyfsat begripligt i alla fall...
[ 08 Augusti 2002, 12:26: Meddelandet ändrat av: Adrian B ]
He he, passa på nu i så fall, jag tycker det är skrämmande fort som man glömmer saker och ting när det gäller programmering, speciellt om det är nåt man bara gör en del av tiden. Man måste liksom ha det aktuellt i skallen, annars är det alltid en tröskel där som man måste ta sig över varje gång man ska dyka ner i det [träsket]...
Förresten glömde jag säga att när man använder $_SESSION så behöver man inte definiera den som global i t.ex funktioner, för den är *alltid* global av naturen (därav att de kallas för "suberglobala").
Grrr... okej kommit en bit men nu lyckas jag inte läsa av ifall en session är vid liv med hjälp av $_SESSION[´id´].
Den säger bara att det inte är vid liv.
Jag vet att jag gör någt löjligt enkelt fel.
Kan nån (Adrian B...) ge mig hela syntaxen för $_SESSION?
Är det en bool eller vad?
Jag har inte sysslat så mycket med just sessions-id, men du kanske kan använda dig av SID, en konstant som innehåller aktuellt sessions-id:
Predefined Constants
These constants are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.
SID (integer)
Constant containing the session name and session ID in the form of "name=ID".
Sen finns det en funktion för att plocka fram sessions-id: session_id()
Och allmänt om sessionshanteringen:
http://www.php.net/manual/en/ref.session.php
Det jag pysslar med är inte äkta session IDs.
Jag vill lägga in ett värde som heter id bara.
Sedan vill jag kunna kolla att denna session är igång och även hämta det värdet för att kolla att den användaren är värdig (
) att hålla med det det han gör.
Aha, ok. Jamen då ska det bara vara att tilldela ett värde och läsa av det precis som vanligt, såhär t.ex.:
$_SESSION[´id´] = 1;
echo $_SESSION[´id´];
Fungerar inte detta? I så fall, har du kört session_start() på varje sida som du använder?
Ja jag har session_start() på de sidor där jag ska använda $_SESSION.
På en sida tilldelar jag $_SESSION värdet av en anna variabel.
Alltså:
$_SESSION[´id´] = $id;
Sedan på en annan sida vill jag kolla om session är i gång.
if(isset($_SESSION[´id´]))
Men det lyckas inte. Den tror hela tiden att den inte är igång.
Jag vet att det något störtlöjligt fel. Men just nu har jag stirrat mig blind på koden och kan inte se vad det är. *suck*
[ 09 Augusti 2002, 15:52: Meddelandet ändrat av: Mattias Hedman ]