Just nu i M3-nätverket
Jump to content

Formulärproblem


ambassaden

Recommended Posts

Hur gör man för att ett formulär ska kunna skicka till varierande mottagare (mail eller fil) genom att välja ur en drop-list?

 

Link to comment
Share on other sites

Då krävs en JavaScript och lite finurlig programmeringsteknik!

 

Skippa submitknappen och gör en vanlig knapp som kastar in användaren i en JavaScript och hämta destinationen ur din droplist. Argumenten får du plocka ihop själv från formuläret.

 

Link to comment
Share on other sites

Nejnej! Det finns ingen som helst anledning att ta till javascript för den saken om jag förstår frågan rätt!

 

Ambassaden, är det så att du vill maila om det står mail i en dropdown box och spara ner i en fil om det står fil i dropdownboxen?

 

Säg att dropdown boxen heter type och du kör metoden POST i ditt formulär:

 

<?[color="#0000ff"]php[/color] 

[color="#0000ff"]if[/color] (![color="#0000ff"]empty[/color]([color="#0000ff"]$[/color]_POST)) {
[color="#0000ff"]switch[/color] ([color="#0000ff"]$[/color]_POST['type']) {
	[color="#0000ff"]case[/color] '[color="#ff0000"]mail[/color]':
		[color="#006400"]// Skriv kod för att mail[/color]
	[color="#0000ff"]break[/color];
	[color="#0000ff"]case[/color] 'fil':
		[color="#006400"]// Skriv kod för att spara ner till fil[/color]
	[color="#0000ff"]break[/color];
}
}

?>

Koden du behöver för att mail eller skriva ner till fil får du skriva själv! :)

 

Lite hänvisningar till manualen kan dock vara bra att ha till hands:

 

http://se.php.net/mail

http://se.php.net/fwrite

http://se.php.net/filesystem

 

--

Some say I am crazy.. but the voices in my head disagree...

 

Stoppa mjukvarupatenten nu! http://www.ffii.se/

 

Link to comment
Share on other sites

Kanske jag som är förvirrad?

 

Jag sitter med formulär som ska ha olika utgångar till olika script beroendes på vilken knapp man trycker på så jag tänker nog för mycket.

 

Tänk bara på några saker!

 

Att aldrig visa några mailadresser eller filnamn i ditt formulär för då kan folk skicka spam och sabotera ditt system rätt kraftigt!

 

$fp = fopen($_POST["filnamn"],"w");

 

är ett stort NONO!

 

Eller mail($_POST["mottagare"],"blabla",....

 

är också NONO!

 

Om filnamn då är /etc/passwd och servern inte är uppsäkrad kan man byta ut passwordfilen och få full root-access på maskinen.

Skoj tycker hackern men inte sysadmin...

 

 

Link to comment
Share on other sites

Om filnamn då är /etc/passwd och servern inte är uppsäkrad kan man byta ut passwordfilen och få full root-access på maskinen.

Skoj tycker hackern men inte sysadmin...

Jag håller helt och hållet med i dina varningar, men du tar nog i lite! :)

 

/etc/passwd ägs och kan bara ses av root, apache ska inte kunna skriva till den filen om man inte har gjort ett gravt fel då man har installerat webbservern. (Dessutom är kanske exemplet felaktigt då användaren kanske inte kör under *nix :)

 

I övrigt kan man inte säga det nog ofta, se ALLTID till att checka ditt indata. All data som en användare kan hantera ska anses farlig, som MÅSTE parsas innan man gör någonting med det.

 

--

Some say I am crazy.. but the voices in my head disagree...

 

Stoppa mjukvarupatenten nu! http://www.ffii.se/

 

Link to comment
Share on other sites

Måste bara pedantiskt påpeka att: /etc/passwd *måste* kunna läsas av alla användare på systemet (för att kunna mappa uid->användarnamn). Av det skälet brukar man inte ha (de krypterade) lösenorden i /etc/passwd, utan ha dem separat i en fil som bara root kan läsa (t ex /etc/shadow).

 

 

 

Link to comment
Share on other sites

BjOrn, ditt antagande är rätt. Jag vill alltså kunna välja att skriva till olika filer genom att välja detta från en drop-list.

 

Om vi utgår från nedanstående snutt undrar jag hur jag ska anpassa din kod?

<?
$filename = "fil1.txt";


[color="#0000ff"]if[/color] ($name) {
$message = [color="#ff0000"]str_replace[/color]("<", "&lt;", $message);
$message = [color="#ff0000"]str_replace[/color](">", "&gt;", $message);
$message = [color="#ff0000"]str_replace[/color]("\n", "<br>\n", $message);

[color="#0000ff"]if[/color] (!([color="#ff0000"]substr[/color]($url, 0, 7) == "http:[color="#006400"]//"))[/color]

$url = "http:[color="#006400"]//" . $url;[/color]


[color="#0000ff"]if[/color] ($fd = ([color="#ff0000"]fopen[/color]($filename, "a"))) {

[color="#ff0000"]fwrite[/color]($fd, "Från: <b>$name</b><br>\n");
[color="#ff0000"]fwrite[/color]($fd, "E-post: <a href=\"mailto:$email\">$email</a><br>\n");
[color="#ff0000"]fwrite[/color]($fd, "URL: <a href=\"$url\">$url</a><p>\n");
[color="#ff0000"]fwrite[/color]($fd, $message);
[color="#ff0000"]fwrite[/color]($fd, "\n<br>\n");
[color="#ff0000"]fclose[/color]($fd);
} [color="#0000ff"]else[/color] {
[color="#0000ff"]print[/color]("<B>FEL: kan inte öppna $filename för att skriva\n");
}

}

?>

 

Förresten så är det linux och apache, men säkerheten är inte det primära då filerna ändå läses av alla.

 

Link to comment
Share on other sites

Någonting såhär skulle du kunna göra:

 

[log]

<?[color="#0000ff"]php[/color]


$filepath = './';

[color="#006400"]/[/color]*
Om selectboxen ser ut såhär:

<select name="[color="#ff0000"]file[/color]">
<option value="fileOne">
<option value="fileTwo">
<option value="fileThree">
</select>
*/

[color="#0000ff"]switch[/color] ([color="#0000ff"]$[/color]_POST['[color="#ff0000"]file[/color]']) {
[color="#0000ff"]case[/color] 'fileOne':
	$filename = $filepath . 'fileOne.txt';
[color="#0000ff"]break[/color];
[color="#0000ff"]case[/color] 'fileTwo':
	$filename = $filepath . 'fileTwo.txt';
[color="#0000ff"]break[/color];
[color="#0000ff"]case[/color] 'fileThree':
	$filename = $filepath . 'fileThree.txt';
[color="#0000ff"]break[/color];
}

$name = [color="#ff0000"]htmlentities[/color]([color="#0000ff"]$[/color]_POST['name']);
$message = [color="#ff0000"]nl2br[/color]([color="#ff0000"]htmlentities[/color]([color="#0000ff"]$[/color]_POST['message']));
$email = [color="#ff0000"]htmlentities[/color]([color="#0000ff"]$[/color]_POST['email']);
$url = [color="#ff0000"]htmlentities[/color]([color="#0000ff"]$[/color]_POST['url']);
$name = [color="#ff0000"]htmlentities[/color]([color="#0000ff"]$[/color]_POST['name']);

[color="#0000ff"]if[/color] ($name) {
[color="#006400"]/[/color]*	$message = [color="#ff0000"]str_replace[/color]("<", "&lt;", $message);
$message = [color="#ff0000"]str_replace[/color](">", "&gt;", $message);
$message = [color="#ff0000"]str_replace[/color]("\n", "<br>\n", $message);*/



[color="#0000ff"]if[/color] (!([color="#ff0000"]substr[/color]($url, 0, 7) == "http:[color="#006400"]//"))[/color]
	$url = "http:[color="#006400"]//" . $url;[/color]


[color="#0000ff"]if[/color] ($fd = ([color="#ff0000"]fopen[/color]($filename, "a"))) {
	[color="#ff0000"]fwrite[/color]($fd, "Från: <b>$name</b><br>\n");
	[color="#ff0000"]fwrite[/color]($fd, "E-post: <a href=\"mailto:$email\">$email</a><br>\n");
	[color="#ff0000"]fwrite[/color]($fd, "URL: <a href=\"$url\">$url</a><p>\n");
	[color="#ff0000"]fwrite[/color]($fd, $message);
	[color="#ff0000"]fwrite[/color]($fd, "\n<br>\n");
	[color="#ff0000"]fclose[/color]($fd);
} [color="#0000ff"]else[/color] {
	[color="#0000ff"]print[/color]("<B>FEL: kan inte öppna $filename för att skriva\n");
}

}

?>

[/log]

Det finns en anledning till att jag gör switch satsen där. Och det är säkerhet. Även om du inte tycker att det behöver vara så säkert så är det det viktigaste du SKA tänka på i alla fall! :) Speciellt i det här fallet då du verkar göra ett forum/gästbok.

 

Switch satsen tar hand om filsäkerheten. Om man direkt tar $_POST['file'] och skriver till den filen så kan användaren få en fil att skrivas ner var som helst i filsystemet där apache har rättighet att skriva, och det är inte bra.

 

Just i det fallet är det även viktigt att tänka på XSS (Cross Site Scripting) vilket faktiskt är rätt så obehagligt i vissa situationer. Det tar jag hand om genom att använda mig av htmlentities. Detta gör jag istället för att använda mig av str_replace, dessutom använder jag funktionen nl2br för att få <br> av nya rader i meddelande texten.

 

Du verkar inte heller använda dig av superglobalerna $_POST eller $_GET då du tar emot datat, det bör du göra för att öka på säkerheten ännu lite mer. Varför man ska göra det kan du läsa lite om här: http://se.php.net/manual/en/security.globals.php

 

Här kan du läsa lite mer om filsystemssäkerhet: http://se.php.net/manual/en/security.filesystem.php

 

--

Some say I am crazy.. but the voices in my head disagree...

 

Stoppa mjukvarupatenten nu! http://www.ffii.se/

 

Link to comment
Share on other sites

Istället för att använda switch så är det i mitt tycke smidigare att göra typ:

$valid_files = [color="#0000ff"]array[/color]('filnamn0.fil', 'filnamn1.fil', 'filnamn2.fil');
[color="#0000ff"]if[/color] (in_[color="#0000ff"]array[/color]([color="#0000ff"]$[/color]_POST['[color="#ff0000"]file[/color]'], $valid_files))
{
 $filename = $filepath . [color="#0000ff"]$[/color]_POST['[color="#ff0000"]file[/color]'];
}

Då kan man dessutom använda $valid_files för att generera listboxen.

 

Link to comment
Share on other sites

  • 10 months later...

Och hur gör man förresten om man ska byta ut det mot mailadresser? Selectboxen heter maila och value = adress0, adress1 osv...

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...