WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Säkerhet? (https://www.wn.se/forum/showthread.php?t=37196)

youheardit 2009-06-02 23:24

Hej gott folk!
Har en stor fråga:

Jag hade planerat att starta en rewardsite och vill ha en hög säkerhet i filerna,
Hur ska jag skydda filerna från hackers eller liknande (tex sQl-injections)
Ngt mer än sql-injections?

Tacksam för svar!

MvH
//Philip Andersson!

KarlRoos 2009-06-03 00:10

Kontrollera all indata, se till så att användaren inte kan komma åt dina "core" filer direkt i webbläsaren. Exempel, placera följande högst upp i varje fil..
Kod:

if(!defined('OK')) die();
Sedan så definerar du 'OK' när dessa "core" filer inkluderas. Bara ett exempel!

Lite mer: http://www.sitepoint.com/article/php-secur...urity-blunders/

elitasson 2009-06-03 01:01

addslashes();
htmlspecialchars();

Där har du några funktioner du bör ha koll på.

Jonas 2009-06-03 09:28

Kod:

function secure($value) { if ($value) { return mysql_real_escape_string($value); } else return false; }

$name = (isset($_GET['name'])) ? $_GET['name'] : false;

mysql_query("SELECT .... WHERE name='" . secure($name) . "'");


youheardit 2009-06-03 09:44

Tack för dessa svaren!
Ska hålla god koll på dem!

Johan_S 2009-06-03 10:17

Jag tycker det är vettigt att kolla ALL indata. Ska ett id anropas med hjälp av $_GET? Kör då en enkel koll att värdet verkligen är numeriskt etc.
Kod:

if (isset($_GET['variabel'])){
  //okej
} else {
  //någon blev fel
}

Funktion skriven av Malte tidigare på Phpportalen:

Kod:

// En funktion att anvndas nr magic_quotes_gpc inte r satt. Fr att frhindra SQL-injections, eller i lidrigare fall MySQl-fel.
function db_escape ($post)
{
  if (is_string($post)) {
  if (get_magic_quotes_gpc()) {
    $post = stripslashes($post);
  }
  return mysql_real_escape_string($post);
  }
 
  foreach ($post as $key => $val) {
  $post[$key] = db_escape($val);
  }
 
  return $post;
}

Anropas med till exempel:
Kod:

$_POST = db_escape($_POST);
$_GET = db_escape($_GET);


danjel 2009-06-03 10:29

Använd PDO för databas frågor, då blir det enklare att göra säkra frågor, du slipper addslashes motsvarande tex..utan använder prepared statements (eller vad det heter )

Fånga upp alla fel med set_error_handler() och visa en felsida då fel uppstår..hackers kan använda genererade fel för att få mer information om systemet
Logga felen i en fil som ligger utanför webbkatalogen. Om du inte kan spara loggen
utanför webbmappen, så kan man skriva in <?php exit; ?> för varje fel , då kan man inte surfa in till felloggen, se nedan för exempel..


Kod:

function error_handler ($type, $message, $file=__FILE__, $line=__LINE__) {
        global $ERR;

        if ($type == 8 || $ERR != '') return;
        $err = "<?php exit; ?>"; //secure
        $err .= date ("M d Y H:i:s"). "\n\nmess: " . $message ."\n\nfil: $file ";
        $err .= "\n\ntyp: " . $type ."\n\nline: " . $line . "\n\n" .'phpfil: ' .$_SERVER['PHP_SELF'] ."\n\n";
        $err .= "cookie: " .var_export($_COOKIE, true) ."\n\n";
        $err .= "REFERER: " . $_SERVER['HTTP_REFERER'];
        $err .= "\n----------------------- \n\n\n\n";
       
        error_log($err, 3, REAL_PATH . 'log/'. date("Ymd"). '_err.php');

        if(B_PROD && DEBUG == false){
 
 ob_end_clean();
 redir("scripts/error_page.php");
        }else{
 print nl2br("ERROR");
 $ERR=$err;
        }
       
}
if( ! defined("ERR_HANDLE_DISABLE")){       
        set_error_handler('error_handler');
}

Använd krypterade lösenord i databasen, obs att endast md5() hash inte är fullgott skydd.

Ha koll på Cross site scripting, XSS..
Använd inte <form action="<?php print $_SERVER['PHP_SELF']?>">, vilket öppnar för XSS attacker tex...


Ha koll på konfig filen med lösenord, så att den ej heter config..inc eller liknande utan .php , och gärna att den ligger utanför webbkatalogen

Draqir 2009-06-03 10:42

SQL - injections är ju ganska klassiskt. Men det finns ju en del fler hål i att komma in igenom, t.ex. $_SERVER['PHP_SELF']; Med lite intelligenta URLS som man matar in så kan man få till vacker XSS.

MD5 är bra om någon annan kommer över din databas. NOT! Finns rainbowtables för det.. Men om du hittar på någon skum funktion typ md5(strreverse(md5($password))) så tar det lite längre tid att leta på vad det nu är för lösenord m.h.a. rainbow tables.. Eller om du använder blowfish och något bra salt.

Att inkludera filer m.h.a. $_GET är också väldigt dumt.

taz76 2009-06-03 12:44

Man kan också lägga till en liten sökning på hela querysträngen, om den innehåller några fulingar som försök till sql-injections (or 1=1 t.ex) eller om den innehåller en adress (http|ftp) m.m. Om det hittas något så bara skicka iväg personen :P

Man kan enklast kolla sånt med ett reguljärt uttryck smidigast..

Ang lösenord så bör du spara det med kryptering plus ett salt.. =)

Strippa också all indata på html.. om du behöver formattering så kör med bbcode istället.

Jonas 2009-06-03 12:57

danjel > PDO är bra om man vill stödja flera olika databaser, tex. MySQL, MSSQL, Oracle mfl. Använder man bara MySQL och man har tillgång till PHP5 & MySQL 4.1 eller senare så är MySQLi ett starkt alternativ.

danjel 2009-06-03 13:41

OK har knappt hört talas om MySQLi. Finns det fördelar kontra PDO..?

eliasson 2009-06-03 16:00

Citat:

Originally posted by youheardit@Jun 2 2009, 21:24
Hur ska jag skydda filerna från hackers eller liknande (tex sQl-injections)
Ngt mer än sql-injections?
//Philip Andersson


Är det bara jag som reagerar på hans otroligt luddiga frågeställning?
Vad han skall skydda sig emot beror ju givetvis på vad han skall jobba med, kopplingar och vad han skall presentera.

Det framgår inte ens vilken plattform han kommer använda sig av, och ni förusätter att det handlar om PHP och MySQL.
Visst kan detta vara korrekt, men för att kunna ge han en bättre bild över vad som behöver tänkas på - så bör väl någon fråga om tekniska förutsättningar, och vad som skall användas.

Skall han t ex använda sig av LDAP (vilket dock inte är sannolikt i hans projekt) så kommer vi in på LDAP-injections, vilket är precis lika allvaligt som SQL-injections.

- Vidare så kanske det bör läsa om XSS?
- Han bör kanske stänga av känsliga felmeddelanden?
- Han bör se över övriga publika tjänster som snurrar på hans server som kan penetreras?
...osv

Kortfattad poäng: Att fråga "Hur ska jag skydda filerna från hackers eller liknande?" är lika dum fråga som "Hur långt är ett snöre?" när man inte specificerar - och speciellt när du hävdar att det är en "stor" fråga i ditt sammanhang.


Eller är det jag som har missat något?

Kay 2009-06-03 16:03

Jag har lite funderingar kring säkerhet också. Knackar ASP classic.

Formulärsfältet "kommentar" kollas med Regexp så det är exempelvis A-Z, a-z, 0-9. Om det replikerar True, är det lugnt att köra formulärsfältsvärdet ostrippat i en SQL-sträng eller är det möjligt att mata in data som går igenom regexpen men som ändå innehåller skräp som kan manipulera SQL-strängen?

Om jag sätter en session på en sida och vill skriva ut den på nästkommande utan Server.HTMLEncode() / htmlspecialchars(), kan jag vara säker på att den innehåller det jag själv angett den till eller kan andra manipulera session-innehåll ifall någon exempelvis vet en sessions namn?

Vilka tecken bör strippas bort ifall man vill använda en Form/QueryString-variabel i en SQL-sats? Räcker det med att ersätta enkelfnutt med två?

eliasson 2009-06-03 16:34

Citat:

Ursprungligen postat av Kay
Formulärsfältet kommentar kollas med Regexp så det är exempelvis A-Z, a-z, 0-9. Om det replikerar True, är det lugnt att köra formulärsfältsvärdet ostrippat i en SQL-sträng eller är det möjligt att mata in data som går igenom regexpen men som ändå innehåller skräp som kan manipulera SQL-strängen?

Om du anger en korrekt regex, och att övrig kod är korrekt - så kan ingen fulkod gå igenom. Den matchar helt enkelt dina regler du angivit.

Citat:

Ursprungligen postat av Kay
Vilka tecken bör strippas bort ifall man vill använda en Form/QueryString-variabel i en SQL-sats? Räcker det med att ersätta enkelfnutt med två?

Jag förstår inte frågan allts, men du bör läsa om "SQL Parameterized Query" - men dock vet jag inte om det finns i ASP Classic.

taz76 2009-06-03 16:35

Citat:

Originally posted by eliasson@Jun 3 2009, 16:00
- Vidare så kanske det bör läsa om XSS?
Det skrev jag lite om men du kanske bläddrade för fort ;)

eliasson 2009-06-03 16:39

Citat:

Ursprungligen postat av taz76
Citat:

Ursprungligen postat av eliasson
- Vidare så kanske det bör läsa om XSS?

Det skrev jag lite om men du kanske bläddrade för fort

Jag har egentligen inte läst något av Era inlägg, utan reagerade främst på att hans frågeställning kontra hans "stora fråga".

En "stor fråga" som kan summeras på 3 rader är verkligen ett skämt.

taz76 2009-06-03 16:40

Citat:

Originally posted by Kay@Jun 3 2009, 16:03
Jag har lite funderingar kring säkerhet också. Knackar ASP classic.

Formulärsfältet "kommentar" kollas med Regexp så det är exempelvis A-Z, a-z, 0-9. Om det replikerar True, är det lugnt att köra formulärsfältsvärdet ostrippat i en SQL-sträng eller är det möjligt att mata in data som går igenom regexpen men som ändå innehåller skräp som kan manipulera SQL-strängen?

Om jag sätter en session på en sida och vill skriva ut den på nästkommande utan Server.HTMLEncode() / htmlspecialchars(), kan jag vara säker på att den innehåller det jag själv angett den till eller kan andra manipulera session-innehåll ifall någon exempelvis vet en sessions namn?

Vilka tecken bör strippas bort ifall man vill använda en Form/QueryString-variabel i en SQL-sats? Räcker det med att ersätta enkelfnutt med två?

Om du inte behöver ha html så strippa allting - det är bäst.

Sen tycker jag att bara för att du har klientvalidering så skippa inte servervalideringen..

Vet inte hur asp classic är (har bara jobbat med asp.net 3.5 (ado).. men där finns funktioner så att man kan lägga in data till en query som parameter vilket är ett säkert sätt - iaf mot sql injections.

taz76 2009-06-03 16:42

Citat:

Ursprungligen postat av eliasson
Citat:

Originally posted by -taz76@Jun 3 2009, 14:35
Citat:

Ursprungligen postat av eliasson
- Vidare så kanske det bör läsa om XSS?

Det skrev jag lite om men du kanske bläddrade för fort


Jag har egentligen inte läst något av Era inlägg, utan reagerade främst på att hans frågeställning kontra hans "stora fråga".

En "stor fråga" som kan summeras på 3 rader är verkligen ett skämt.

Många som behöver lära sig mer om säkerhet och risker med webbprogrammering. Men man kan inte veta allting när man är nyfödd (eller ens när man har flera års erfarenhet) ;)

Jag menar.. när du började knacka kod haltande - visste du om alla säkerhetsrisker och fallluckor då? ;)

Det är bra att trådskaparen frågar ju :) Jag har sett många exempel på helt livsfarlig kod med massor av hål.

Johan_S 2009-06-03 18:58

Ju mer jag lär mig desto mer okunnig känner jag mig!

dAEk 2009-06-03 19:54

Citat:

Originally posted by taz76@Jun 3 2009, 16:40
Vet inte hur asp classic är (har bara jobbat med asp.net 3.5 (ado).. men där finns funktioner så att man kan lägga in data till en query som parameter vilket är ett säkert sätt - iaf mot sql injections.
Jodå, det finns stöd för det i gamla ASP (VBScript & JScript). Konstigt nog är eller verkar det inte vara något som används i särskilt stor utsträckning. Iaf är det min erfarenhet.

dAEk 2009-06-03 20:11

Citat:

Ursprungligen postat av Kay
Jag har lite funderingar kring säkerhet också. Knackar ASP classic.

Formulärsfältet "kommentar" kollas med Regexp så det är exempelvis A-Z, a-z, 0-9. Om det replikerar True, är det lugnt att köra formulärsfältsvärdet ostrippat i en SQL-sträng eller är det möjligt att mata in data som går igenom regexpen men som ändå innehåller skräp som kan manipulera SQL-strängen?

Det borde vara säkert om det sker på servern. Har man komplexa regex eller om man jobbar flera stycken i ett projekt, då är risken större att det kan uppstå luckor. Vad händer om mönstret ändras? Säkerställs det att det inte slinker igenom farlig info? Sånt är lätt att missa. Vem som helst kan klanta sig.

Citat:

Ursprungligen postat av Kay
Vilka tecken bör strippas bort ifall man vill använda en Form/QueryString-variabel i en SQL-sats? Räcker det med att ersätta enkelfnutt med två?

Inget bör filtreras. Man vill oftast inte ändra på informationen, speciellt inte när man inte behöver. Använd parameteriserade frågor istället!

taz76 2009-06-03 21:23

Citat:

Originally posted by Johan_S@Jun 3 2009, 18:58
Ju mer jag lär mig desto mer okunnig känner jag mig!
Man får bara inse att man inte kan kunna allting och definitivt inte komma ihåg allting :lol:

Jonas 2009-06-03 21:32

Citat:

Originally posted by danjel@Jun 3 2009, 13:41
OK har knappt hört talas om MySQLi. Finns det fördelar kontra PDO..?
Största nackdelen med PDO är hastigheten.

Andra Pro/Con är en google sökning iväg (http://www.google.se/search?q=PDO+mysqli)

Kay 2009-06-04 17:04

Får kika på parametriserade frågor då. Tack för svaren :)

etanders 2009-06-04 20:02

Citat:

Ursprungligen postat av dAEk
Citat:

Ursprungligen postat av Kay
Jag har lite funderingar kring säkerhet också. Knackar ASP classic.

Formulärsfältet "kommentar" kollas med Regexp så det är exempelvis A-Z, a-z, 0-9. Om det replikerar True, är det lugnt att köra formulärsfältsvärdet ostrippat i en SQL-sträng eller är det möjligt att mata in data som går igenom regexpen men som ändå innehåller skräp som kan manipulera SQL-strängen?

Det borde vara säkert om det sker på servern. Har man komplexa regex eller om man jobbar flera stycken i ett projekt, då är risken större att det kan uppstå luckor. Vad händer om mönstret ändras? Säkerställs det att det inte slinker igenom farlig info? Sånt är lätt att missa. Vem som helst kan klanta sig.

Ett bra tips är att använda enhetstester! Bryt ut funktionerna för att kontrollera och/eller strippa indata till en egen klass, och skapa en uppsättning enhetstester där du testar olika typer av indata, både sånt som ska gå igenom och sånt som ska stoppas. Varje gång du gjort en förändring t.ex. av regexp-kollarna så kör du enhetstesterna.

En stor del av wn-befolkningen verkar ju jobba med php, och jag vet inte riktigt hur enhetstester bäst läggs upp i ett php-projekt. Själv sysslar jag mest med ASP.NET och C# numera, och där är det väldigt smidigt, t.ex. med NUnit. För övrigt är det ju att rekommendera att använda enhetstester till fler delar av systemet än kontroll av indata...

taz76 2009-06-04 21:49

Har för mig det finns något som heter PHPUnit eller nått åt det hållet för enhetstester.. dock ej kikat på det.

dAEk 2009-06-09 00:03

Citat:

Originally posted by etanders@Jun 4 2009, 20:02
Ett bra tips är att använda enhetstester! Bryt ut funktionerna för att kontrollera och/eller strippa indata till en egen klass, och skapa en uppsättning enhetstester där du testar olika typer av indata, både sånt som ska gå igenom och sånt som ska stoppas. Varje gång du gjort en förändring t.ex. av regexp-kollarna så kör du enhetstesterna.

En stor del av wn-befolkningen verkar ju jobba med php, och jag vet inte riktigt hur enhetstester bäst läggs upp i ett php-projekt. Själv sysslar jag mest med ASP.NET och C# numera, och där är det väldigt smidigt, t.ex. med NUnit. För övrigt är det ju att rekommendera att använda enhetstester till fler delar av systemet än kontroll av indata...

Bra tips! Jag har använt det i Eclipse (JUnit) och har börjat kika på motsvarande funktionalitet i VS 2008. Det känns lite halvvingligt att utveckla utan.


Alla tider är GMT +2. Klockan är nu 04:26.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson