Just nu i M3-nätverket
Gå till innehåll

Säkerhet i PHP


Ume090

Rekommendera Poster

Hur ska jag skydda mot annan användare?

När annan person logga in så dom kan skriva

 

[log]

index.php?id=post&post=las&nr=2

[/log]

 

och läsa annans e-post. Låter inte bra!

 

Hur skydda man mot dom?

Har session så man kan utnytja session för att skydda men jag vet inte riktigt hur man ska skriva

 

<?
$connection = [color="#ff0000"]mysql_connect[/color]("$server", "$user", "$password");
$hamta = "SELECT * FROM [color="#ff0000"]mail[/color] WHERE id='{[color="#0000ff"]$[/color]_GET['nr']}'";
$result = [color="#ff0000"]mysql_query[/color]($hamta);
[color="#0000ff"]while[/color] ($row = mysql_fetch_[color="#0000ff"]array[/color]($result)) {
?>
      <table width="780" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td width="40" height="20" [color="#0000ff"]class[/color]="tillmork">&nbsp;</td>
          <td width="740" [color="#0000ff"]class[/color]="tillmork"><? [color="#0000ff"]echo[/color] "{$row['rubrik']}"; ?></td>
        </tr>
      </table>
      <table width="780" border="0" cellspacing="0" cellpadding="0">
        <tr [color="#0000ff"]class[/color]="tillmork20">
          <td width="40" height="20">&nbsp;</td>
          <td width="740"><? [color="#0000ff"]echo[/color] "{$row['msg']}"; ?></td>
        </tr>
	  <? } [color="#ff0000"]mysql_close[/color](); ?>
      </table>

 

Länk till kommentar
Dela på andra webbplatser

Nu vet jag inte exakt hur din databas ser ut, men om du sparar användarid i din session och sedan hämtar mailen med nåt liknande det här "SELECT * FROM mail WHERE id='{$_GET['nr']}' AND userid='{$_SESSION['userid']}'" så kommer användarna endast kunna läsa sina egna mail.

 

Länk till kommentar
Dela på andra webbplatser

Det normala när man vill skydda något är att man har någon form av inloggning och att vem man är inloggad som avgör vad man får läsa och inte läsa.

 

Bara att du gör en sån här sak:

$hamta = "SELECT * FROM [color="#ff0000"]mail[/color] WHERE id='{[color="#0000ff"]$[/color]_GET['nr']}'";

Utan att bry dig ett dugg om att undersöka vad som kommer in som "nr" tyder på att du förmodligen har betydligt större problem än du vet om.

Gör om, gör rätt. Det finns inga genvägar när det gäller säkerhet, man måste lära sig göra rätt från grunden.

 

 

Länk till kommentar
Dela på andra webbplatser

Säg gärna en exempel hur man ska göra

 

Och jag använder typ

<?[color="#0000ff"]php[/color] 
[color="#ff0000"]session_start[/color]();
[color="#0000ff"]if[/color] (![color="#0000ff"]isset[/color]([color="#0000ff"]$[/color]_SESSION['userid'])){ 
[color="#ff0000"]header[/color]("Location: index.[color="#0000ff"]php[/color]"); 
[color="#0000ff"]exit[/color]; 
} 
[color="#0000ff"]include[/color] "[color="#ff0000"]system[/color].[color="#0000ff"]php[/color]";
?>

 

 

Duger det inte?

 

[inlägget ändrat 2005-02-16 16:10:04 av Ume090]

Länk till kommentar
Dela på andra webbplatser

Jorå, det ser bra, ut så länge du ser till att när du sätter $_SESSION['userid'] att du gör det på ett säkert sätt.

 

Länk till kommentar
Dela på andra webbplatser

När det gäller att bygga sql-satser bör man använda sig av mysql_escape_string(). Hur du gör för att avgöra om inloggad användare ska få se mailet med id=2 beror helt på hur dina tabeller ser ut.

Vore jag du skulle jag antingen leta efter en grundkurs i PHP och databaser på nätet, eller köpa mig en bok som verkar vettig (jag har tyvärr inget bra förslag där).

 

På PHP:s egen webbsajt finns hur mycket som helst om php och des funktioner, vill du t.ex lära du hur sessions fungerar så kan det vara en bra idé att börja här:

http://se2.php.net/manual/sv/function.session-start.php

 

Länk till kommentar
Dela på andra webbplatser

Ok, det ska jag kolla lite mer om det, men jag tycker

if (!isset($_SESSION['userid'])){ räcker bra...

 

Och förresten en fråga,

 

Varför skriver några ungefär som här

<?

$connection = mysql_connect("$server", "$user", "$password");

$hamta = "SELECT * FROM mail;

$result = mysql_query($hamta);

BLA BLA BLA

?>

<tr>

<? echo "{$row['rubrik']}"; ?>

</tr>

<? } mysql_close(); ?>

 

och annan skriver som här

 

<?

$connection = mysql_connect("$server", "$user", "$password");

$hamta = "SELECT * FROM mail;

$result = mysql_query($hamta);

BLA BLA BLA

 

print '<tr>';

print '$rubrik';

print '</tr>';

?>

 

 

När man skriver

 

print '<tr>';

print '$rubrik';

print '</tr>';

 

låter jobbigt, man kan lika gärna att använda <? } mysql_close(); ?> mycket bekvämt.. Men varför använda några typ "print bla bla"?

 

Länk till kommentar
Dela på andra webbplatser

Nu vet inte jag hur din databas ser ut, men på nåt sätt så måste den ju innehålla vem mailet är till, då utformar du bara SQL satsen så att du hämtar mailet om det har rätt ägare.

 

Länk till kommentar
Dela på andra webbplatser

Det spelar ingen roll hur man gör, resultatet blir detsamma. Men förmodligen vill du inte ha enkla citattecken runt $rubrik, skriv bara echo $rubrik; eller liknande. Dessutom verkar du ha en förkärlek för onödiga dubbla citattecken:

 

 

$connection = mysql_connect("$server", "$user", "$password");

...

 

<? echo "{$row['rubrik']}"; ?>

 

Känns som att du bör läsa http://se.php.net/manual/en/language.types.string.php

http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40

[inlägget ändrat 2005-02-16 17:26:14 av zerblat]

Länk till kommentar
Dela på andra webbplatser

Nää, jag ska använda

<? echo "{$row['rubrik']}"; ?>

 

på grund av --> while ($row = mysql_fetch_array($result))

 

så är det väl inte onödiga?

 

 

Länk till kommentar
Dela på andra webbplatser

Du skulle lika gärna kunna skriva bara:

<?[color="#0000ff"]php[/color] [color="#0000ff"]echo[/color] $row['rubrik']; ?>

 

Länk till kommentar
Dela på andra webbplatser

SELECT * FROM mail WHERE id='{$_GET['nr']}' AND userid='{$_SESSION['userid']}'" verkar inte som fungerar... Hur ska jag göra då?

 

Länk till kommentar
Dela på andra webbplatser

Jorå, det ser bra, ut så länge du ser till att när du sätter $_SESSION['userid'] att du gör det på ett säkert sätt.
Nu vet jag inte vad de inkluderade filerna innehåller, men det kan finnas en risk att göra så där. Risken är om man inte tänker på att även ha en kontroll i filen system.php. Finns inte kontrollen även där så är det ingenting som hindrar att en användare surfar direkt till system.php (går ju att gissa sig till filnamn om inte annat).

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

SELECT * FROM mail WHERE id='{$_GET['nr']}' AND userid='{$_SESSION['userid']}'" verkar inte som fungerar... Hur ska jag göra då?
Hur ser dina tabeller ut?

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

egentligen är det

 

tillid='{$_SESSION['userid']} , men såg att det var inte smart!

På grund så kan jag inte läsa mail som jag har skickat.... Alltså "franid"

 

mail tabell ser ut som här

+----------+----------+----------+----------+----------+----------+

| id | tillid | franid | rubrik | msg | datum |

+----------+----------+----------+----------+----------+----------+

 

userid finns på annan tabell i "medlem" tabell

 

Länk till kommentar
Dela på andra webbplatser

I detta fall ska du inte bry dig om den andra tabellen var userid finns, då du redan vid inloggningskontrollen sparat denna userid som en sessionsvariabel.

 

För att en användare ska se sina e-mail så bör SQL-frågan vara:

$sql = "SELECT * FROM [color="#ff0000"]mail[/color] WHERE id='{[color="#0000ff"]$[/color]_GET['nr']}' [color="#0000ff"]and[/color] tillid='{[color="#0000ff"]$[/color]_SESSION['userid']}'";

 

Du måste dock tänka på säkerhet och använda antingen mysql_escape_string() eller add_slashes() på variablerna för att dessa inte ska innehålla farliga tecken.

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Tackar, det funkar!

 

Men hur ska man göra för att fixa fel meddelande" typ

 

""Du kan inte läsa meddelanden""

 

om någon försöker läsa annans mail..

 

om jag ha inte fixat mysql_escape_string() så vad kan dom göra med farliga tecken?

 

Länk till kommentar
Dela på andra webbplatser

Men hur ska man göra för att fixa fel meddelande" typ

""Du kan inte läsa meddelanden""

om någon försöker läsa annans mail..

Om du har användar-id:t i en sessionsvariabel (mao på servern) finns det inget rimligt sätta för en användare att försöka läsa andras mail.

 

om jag ha inte fixat mysql_escape_string() så vad kan dom göra med farliga tecken?
Typ vad som helst som php har rättigheter att göra med databasen (exempelvis tömma alla tabeller).

 

http://se.php.net/manual/en/security.database.sql-injection.php

http://dev.mysql.com/doc/mysql/en/security-guidelines.html

http://www.securityfocus.com/printable/infocus/1706

 

Länk till kommentar
Dela på andra webbplatser

Bifogar en länk till en annan artikel som beskriver SQL-injektioner och hur säkerhetshål kan utnyttjas:

 

http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a

 

 

Artikelns budskap ska ej uppfattas som "lär-mig-hacka-webbsidor", utan som en informativ artikel som enkelt beskriver och visar något som de flesta har svårt för att förstå.

 

_________

TicoRoman - Anfall är bästa försvar

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...