php : kan man manipulere med post/server vars?

Tags:    php mysql webserver

<< < 12 > >>
Hey udviklere!
Jeg har et spørgsmål angående sikkerhed, kan man nok godt sige. Jeg kører en hjemmeside hvorpå jeg har nogle kontaktforms og den slags. Derudover ligger tekst fra hjemmesiden i en database. OK. Tekstmæssigt bruger jeg:

Fold kodeboks ind/udPHP kode 


Disse kan selvfølgeligt manipuleres gennem urlen, feks. side.com?parameter_navn = noget. Et alternativ er posts:

Fold kodeboks ind/udPHP kode 


Og mit første spørgsmål er: kan disse manipuleres ud over gennem en form? Lad os feks. sige at den ovenstående variabel er på en side der hedder senddata.php. Lad os sige at den ikke indeholder andet, altså at formen der tilgår den, er på en separat side. Kan jeg gå ind på senddata.php og på en eller anden måde injecte data til den givne variabel?

Mit andet spørgsmål er lidt i forlængelse af det første: den tredje mulighed er at sende data gennem XMLHttpRequest() i JS. Disse data kan feks. modtages med:


Fold kodeboks ind/udPHP kode 


Igen lad os sige at denne variabel findes på siden senddata.php der tilgås fra en anden side. Kan jeg sprøjte data ind i denne variabel ud over med XMLHttpRequest()?

Jeg har selvfølgeligt søgt lidt på google, men jeg har ikke rigtigt kunne finde noget. Mvh.



Indlæg senest redigeret d. 14.10.2017 12:01 af Bruger #21210
16 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Nu lægger du ord i munden på mig. (:
Intet sted siger jeg at det er "måden", jeg ret bogstaveligt siger "en af de bedste måder" ergo mange andre tilgange kan/skal tages. Så jo Robert det var en pointless besked i det, at du besvare et oplæg, uden nogen form for belæg for hvad du skriver. Så efter din besked var ingen blevet klogere på emnet.

"Perfekte løsninger findes svjv ikke". Hvilket var lige præcis min pointe fra start. Du kan aldrig sikre dig 100%, så alt du kan gøre er at tage visse forbehold, som gør det sværer. Et af de forbehold kunne fx. tokens. Intet sted blev der sagt at det var det eneste forbehold man skulle tage.

Så please lad være med at lægge ord i munden på mig, og se nu kom der pludselig lidt konstruktiv information med i den besked. Mission accomplished.
Jeg prøvede ikke at være træls, men at pointere at din besked på ingen måde var informativ, ergo ift. hans spørgsmål pointless.



Indlæg senest redigeret d. 29.10.2017 16:23 af Bruger #20949
Well, du siger at det er en af de bedste metoder...og det er det altså bare ikke. Det er en overkomplicering af problemet. At overholde GET/POST/PUT semantikken gør præcis det samme, da det pludselig kræver javascript at angribe, præcis ligesom det er tilfældet ved tokens, plus du er nu compliant med HTTP semantikken. Bloker derudover ulovlige Origins og så er du i hus med HTTP compliant browsere.

Hemmelige tokens hjælper dig ikke.



Nej. Det er fordi du vil have at jeg skal have sagt "Den bedste/eneste måde at gøre det på er sådan", men det har jeg bare ikke sagt. "En af de bedste måder" er langt derfra, og skulle tolkes som i at det ville være en solid start på et nyt problem. Han er her inde og spørger som relativt ny til området lyder det til, ergo er der ingen pointe i at smide en masse i hovedet på ham som han ikke forstår. Derved forslog jeg tokens, da det er en nem, og god start på en løsning. Ingen har sagt at det er en perfekt løsning, men det er nemmere at starte lavt end højt.

Jeg er absolut ikke uenig i det du beskriver, men det var jo lige præcis min pointe fra start. Hvis du nu bare havde haft alt det dejlige info der i den første besked. Så havde vi aldrig stået her nu. Fordi så havde det svar været dejlig informativt, Martin var blevet klogere, og beskeden ville ikke bare have været en random statement uden noget belæg.



Hey. Jeg vender lige tilbage her. Inden der bliver slagsmål :-D. Jeg har kikket på Curl. Det er præcist det program jeg har ledt efter. Med det kan jeg sætte alle de headere jeg vil. Jeg har prøvet at tilføje en ekstra side til at oprette en session der bliver videreført og bruges til validering. Men dette kan også nemt klares med Curl da sessioner kan gemmes. Problemet er stadig at jeg kan sætte headere og tilgå siden fra terminalen hvilket betyder at jeg kan skrive et loop i batch og på den måde bruteforce min login-side. Jeg tror den bedste løsning er at have et godt nok password. Den næstbedste er at sætte en timeout eller et antal forsøg. Dette skal bare gemmes i en database, sessioner kan jo lukkes igen fra client-siden, og det er besværligt. Det er et spændende emne - lidt ligesom strategispil hvor man hele tiden skal være et skridt foran sin modstander.



Måske har jeg misforstået spørgsmålet, men snakker vi opdatering og output af tekst fra fx MySql database er PHP's prepared statements eller PDO måden at hente og bringe tekst på. Giver gerne et eksempel herunedr..

Iøvrigt synes jeg selv at PHP headers / AJAX redirects afhængig af submit on form / button / a href er lidt af et mysterium, og måske endda browserspecifikt - oplever fx Chrome opfører sig anderledes end Firefox ved redirects via AJAX og PHP afhængigt af om der ligger en redirect i PHP-scriptet, AJAX på siden, om der er en preventDefault på form eller returnfalse ifht ændring af CSS......

Klart nok skal tekst via input i en form køres gennem mindst 1 tjek før det lagres i databasen - fx

// ..OMKRIV EVT HTML-TEGN FØR DE INDSÆTTES I MYQL
$text = htmlentities($text, ENT_QUOTES, "UTF-8");

// TIL AJAX - VISNING I DIV EFTER AT AJAX HAR KØRT
echo $text;

// FORBERED MYSQL
$insert = $conn -> prepare("UPDATE emne SET text = ? WHERE brugernavn = 'et eller andet brugernavn' ");
// vælg "string" OG VARIABEL FOR INPUT var text
$insert -> bind_param( "s", $text);
// INDSÆT DATA I MYSQL
$insert->execute();
// LUK CONN TIL MYSQL
$insert->close();

Bagefter hentes texten -

Ifht validering af user + pass akn man køre den her igen prepared statements - bruges hash validation af pass er der forskel på tidlig og sen PHP-versioner..

I forhold til sessions og login ja / nej kan man lave et spørgsmål "session - true / false"

if (isset($_POST['submit_login'])) {

// VARIABLER FRA FORM INPUT
$brugernavn = $_POST['brugernavn'];
$password_login = $_POST['password_login'];


// TRUE / FALSE CONDITION TIL HÅNDTERING AF ERRORS
$valid = true;

// VALIDATE BRUGERNAVN
if (empty($_POST['brugernavn'])) {
show_login_message("Du har ikke indtastet dit navn");
$valid = false;
} else { // END EMPTY BRUGERNAVN

// BRUGERNAVN - SØG I MYSQL.
$result = $conn -> prepare("SELECT brugernavn FROM artister WHERE brugernavn = ? LIMIT 1 ");
// TILFØJ FORM INPUT TIL SØGNINGEN I MYSQL..
$result -> bind_param( "s", $brugernavn);
// GENNEMSE MYSQL
$result -> execute();
// ..SÅ INDSÆT INDHOLDET I EN VAR OG NAVNGIV SOM
$result -> bind_result($brugernavn_database);
// OPBEVAR RESULTATET
$result -> store_result();

// HENT ALLE ROWS - HVIS DER IKKE (!=)) ER ET MATCH...
if ($result -> num_rows != 1) {
show_login_message("Kunstneren findes ikke");
$valid = false;
}


// VALIDATE PASSWORD
if (empty($_POST['password_login'])) {
show_login_message("Du har ikke indtastet dit password");
$valid = false;
} else {

// PASSWORD
$result = $conn -> prepare("SELECT password FROM artister WHERE brugernavn = ? ");

// TILFØJ FORM INPUT TIL SØGNINGEN I MYSQL..
$result -> bind_param( "s", $brugernavn);
// GENNEMSE MYSQL
$result -> execute();
// ..SÅ INDSÆT INDHOLDET I EN VAR OG NAVNGIV SOM "$password_database"
$result -> bind_result($password_database);
// OPBEVAR RESULTATET
$result -> store_result();

// HVIS DER FINDES ET PASSWORD HOS KUNSTNEREN..
if ($result -> num_rows == 1) {
// HENT INDHOLD
$result -> fetch();

// KONVERTER HASHED PASS TIL STRING OG TJEK OM "password_login" MATCHER "password_database"
if (password_verify($password_login, $password_database)) {
// ER KUNSTNERNAVN OK + MATCHER PASSWORD SÅ ACCEPTER SOM "VALID" OG EKSEKVER FUNKTIONER UNDER "if valid...."
$valid = true;
} else {
show_login_message("Forkert password");
$valid = false;
}

} // END OF "if ($result -> num_rows > 0) {..."
} // END OF } else { // END EMPTY PASSWORD
} // END OF } else { // END EMPTY BRUGERNAVN

// LUK CONN TIL MYSQL
$result -> close();


if ($valid) {

// START NY SESSION FOR BRUGERNAVN
$_SESSION['brugernavn'] = $brugernavn;

// REGISTERER AT BRUGER ER LOGGED IND VED AT OPRETTE EN NY POSITIV SESSION
$_SESSION['logged_in'] = true;

// LAV NOGET HER.....
}

} // END OF "submit_login"
// END OF SECTION LOGIN ------------------------------------------------------
?>



Indlæg senest redigeret d. 05.11.2017 22:09 af Bruger #21904
Hey Kenneth.
Tak for kommentaren! Jeg kender godt til prepared statements og bruger dem til det meste. Det er ikke så meget validering og sql-injections jeg er nervøs for. Det er mere det at man kan tilgå headervariable med andre programmer end en browser. Der er nævnt Curl. Men jeg har faktisk fundet ud af at python rimeligt nemt kan klare ærterne : How to use python.... Python kan også sætte sessions og gemme dem i en cookieJar. Mega smart! Udover at bruge den her slags til at hacke kan man feks. skrive en chat i php og tilgå den gennem en linux-terminal med python. Mega fedt!



<< < 12 > >>
t