Alle meine unsicheren PHP Scripte....

bensky

Erfahrenes Mitglied
...versuche ich gerade sicher zu machen aber mit fehlen zwei Ideen die man einfach nur wissen muss.

1. Ich lege User immer(Sie sich selber), dumm wie ich bin, über autoincrement meiner mySQL Datenbank an. Also user1 = 1 user2 = 2 etc.....

Wie mache ich das besser/wie macht ihr das? Zusätzlich mit ner random Funktion um dann statt User_id = "1" // User_id ="Z2sj(k" stehen zu haben?

Ziel soll sein, sich nicht irgendwie die Proifile ansehen zu können wenn man mal statt 1 ne 2 eingibt. Mir is klar das das nicht so einfach bei sessions geht aber ich will das später auch für Artikel oder Bilder machen, dass man nicht einfach die "1" bei Post_id=1 durch ne 2 ersetzt und den zweiten post sieht. oder 1.jpg // 2.jpg etc....
Wie macht Ihr das? Brauch nurn kurzen Tip ;=)

2. Ich benutze derzeit immer billige und schlechte SQL funktion wie diese Beiden:

PHP:
$INSERT = "INSERT INTO posts SET

DATE    ='$DATE',
NAME    ='$NAME',
WWW     ='$www',
TEXT    ='$TEXT' WHERE user_id = $user_id AND post_theme = $posttheme";

if(@mysql_query($INSERT))
 {
echo "bla";
 }

Sollte ich zusätzlich noch für die inserts und updates htmlenties oder so benutzen?

Hier die lösch Geschichten:
PHP:
<?
if($del == "loeschen")
{

//Datenbank & Connection

include('sqlconnect.php');

// Zusatzdaten
					   
$del = "DELETE FROM post WHERE user=$user AND artikel =$artikel AND group=$group";

if(@mysql_query($INSERT))
 {
 echo('ok');
 }
  else
 {
 echo("<p>FEHLER" .
 mysql_error() ."</p>");
 }
}
?>

Die Werte $user , $post etc. werden natürlich in der Browserzeile angezeigt und so könnte man ganz billig einfach andere Zahlen auf gut glück einsetzen und versuchen irgendwelche Post zu löschen/updaten oder per insert vollzuspammen.

Wie geht ihr mit hocher Sicherheit an solche Sachen dran?
Mit generierten Werten(ID's) oder was macht man da?
Dank im Voraus
 
sensible Daten nie über die Browserzeile weitergeben. Entweder POST verwenden oder Sessions. Diese Daten dann natürlich auch gegen SQL Injection schützen (mysql_real_escape_string())

Zu dem Autoincrement...ist doch ne super Sache. Somit ist jeder User einzigartig. Also imho ist das auch die allgemeine Vorgehensweise bei Daten die Unique sein müssen. Eine ID ist immer einzigartig wenn auto_increment im Spiel ist. Für Usernamen würd ich ohnehin ein seperates Feld nehmen.
 
Zuletzt bearbeitet:
Ich hab da mal ein script geschrieben gegen sql injections.

in der zu schützenden Datei:
PHP:
require ("database/sql_secure.php");

sql_secure.php:

PHP:
<?
$forbidden="Union Select";

if (!isset($_GET[$forbidden])) {
echo "Hacking attempt";
exit;
}

?>

kA ob es noch funktioniert also bei mir klappts immer noch sehr gut.

mfg
nom
 
Erstmal Danke, das mit dem POST ist zwar schon ne schöne sache aber sobald ich mit der maus über einen link fahre(sieht man ja unten in der Statuszeile) bsp.: xxx.php?del_post=1&post_id=2.

So, nun darf ja nur der User den Post löschen der entweder Admin ist oder den geschrieben hat. Ich würde jetzt per PHP die Session(user_id) abfragen und per SQL checken "del xxx FROM xx where "dasund das" AND user_id = SESSION['$USER_ID'].

Kann jetzt nicht einfach jemand ne ANDERE user_id mit in die browserzeile schreiben und dann wie die Axt im Wald wild rumlöschen? Habt ihr vielleicht ein paar scripte im Kopf(oder in den favs) wo ich mal sehen kann wie man sowas elegant löst?

Danke ;)
 
hol dir doch aus der DB die User ID vom Poster und vergleiche die mit der User ID vom User. Also:

PHP:
$sql="Select User_id from posts where post_id=2
$daten=mysql_querry($sql);

if ($daten==User_ID) {
lösche das und das.
} else {
if (User==Admin) {
lösche das und das
}
}
 
Erstmal Danke, das mit dem POST ist zwar schon ne schöne sache aber sobald ich mit der maus über einen link fahre(sieht man ja unten in der Statuszeile) bsp.: xxx.php?del_post=1&post_id=2.

Das mit Post hast du falsch verstanden. Das was im Link Angezeigt wird mit Get übergeben.Bei Post sieht man nix im Link und wird Bei Formularen verwendet.

Nach Abschicken des Formular holt man die Daten Mittels.
PHP:
$Post_id=trim($_POST['Post_id']);

Post_id bezieht sich dann auf den Deklarierten Namen im Formula (name="Post_id")
Der Befehl Trim sorg dafür das vorne und hinten alle Leerzeichen entfernt werden.
Im Formular muß dann method="post" angeben sein.

Willst du aber Daten ohne Formula übermitteln dann komste an einer Session nicht vorbei die ist da noch am Sichersten.
Bei Get übergabe wird man die Werte immer beim Link sehen.
 
Hi

Du hast ja sicher ein Login. Prüfe doch beim Login einfach ob der User der sich einloggt Adminrecht hat und falls ja kannst du ein Cookie ( setcookie ) aktivieren:

PHP:
setcookie("userinfos", "admin", time()+3600);

Und dann beim Beitrag der gelöscht werden sollte:

PHP:
if($_COOKIE['userinfo'] == "admin"){echo'<a href="URL.de?del=id">löschen</a>';}

Und dann beim löschen überprüfst du nochmal ob der User ein Admin ist:

PHP:
if($_COOKIE['userinfo'] == "admin"){ LOESCHEN }
 
Zuletzt bearbeitet:
Das ist ja kein ding, danke schon mal für deine Antwort aber ich hatte an sowas gedacht?!

PHP:
<?php
function req_url($url, $para) {
  $sep = "?";

  if (! is_array($para))
    return $url;

  foreach ($para as $k => $v) {
    $url .= sprintf("%s%s=%s",
      $sep,
      $k,
      urlencode($v)
    );
    $sep = "&amp;";
  }

  return $url;
}

$p = array(
  "a" => "b",
  "c" => "d"
);

$url = req_url("beispiel.php", $p);
?>
Klicke auf das <a href="<?php print $url ?>">Beispiel</a>.

Es das nicht sicherer?

Aber wie kann ich denn automatisch bei solchen scripten mit urlencode werte verschlüseln ohne vorher im array anzugeben was was ist?
 
1)
bensky hat gesagt.:
So, nun darf ja nur der User den Post löschen der entweder Admin ist oder den geschrieben hat. Ich würde jetzt per PHP die Session(user_id) abfragen und per SQL checken "del xxx FROM xx where "dasund das" AND user_id = SESSION['$USER_ID'].

Kann jetzt nicht einfach jemand ne ANDERE user_id mit in die browserzeile schreiben und dann wie die Axt im Wald wild rumlöschen?
Du sagst ja selbst, dass die ID des Users aus der Session kommt und nicht aus der Browserzeile. Also kann ein böser Mensch auch keine andere User-ID in die Browserzeile eingeben und dir in deiner Datenbank rumholzen...

2)
ICPUI hat gesagt.:
Du hast ja sicher ein Login. Prüfe doch beim Login einfach ob der User der sich einloggt Adminrecht hat und falls ja kannst du ein Cookie ( setcookie ) aktivieren
Ansatz o.k., Umsetzung schlecht! Den Admin-Status kannst du gern in deiner Session speichern, aber um Himmel's Willen bitte nicht in einem Cookie (das ja beliebig gefälscht werden könnte um so Admin-Rechte zu erlangen!)
Du könntest z.B. einfach $_SESSION["is_admin"] = true/false setzen.

3)
bensky hat gesagt.:
Es das nicht sicherer?

Aber wie kann ich denn automatisch bei solchen scripten mit urlencode werte verschlüseln ohne vorher im array anzugeben was was ist?
Mal abgesehen davon, dass deine Funktion nur zum Erstellen einer URL ist und mit dem Thema Sicherheit herzlich wenig zu tun hat...
urlencode ist keine Funktion zur Verschlüsselung! Eine URL zu verschlüsseln macht in deinem Fall auch wenig Sinn!

Jetzt noch ein paar Worte zu den Themen SQL-Injection und Cross-Site-Scripting:

- Der SQL-Injection-Schutz von nom funktioniert nicht wirklich.

- Um sich vor SQL-Injection zu schützen, muss man Werte, bevor sie in einem SQL-Query verwendet werden, mit mysql_real_escape_string() behandeln (wurde aber schon gesagt). Ist in der php.ini magic_quotes_gpc aktiviert, ist dies allerdings nicht nötig. Ob diese Funkton aktiviert ist, findet man mittels get_magic_quotes_gpc() heraus.
Anmerkung: Zahlenwerte sollte man nicht escapen sondern in richtige Zahlentypen casten ($_POST["id"] = (int)$_POST["id"]), da in manchen SQL-Dialekten um Zahlenwerte keine Anführungszeichen/Hochkommata gemacht werden dürfen!

- Um Cross-Site-Scripting zu verhindern, muss man Werte, wenn sie als HTML ausgegeben werden mittels htmlentities() [beste Möglichkeit] oder wenigstens mittels htmlspecialchars() schützen. Dabei werden u.a. die Charakter < und > kodiert. strip_tags() wäre auch eine Möglichkeit. Natürlich kann (und sollte man in den meisten Fällen auch) diese Funktionen bereits beim Einfügen in die Datenbank anwenden.
 
Mal abgesehen davon, dass deine Funktion nur zum Erstellen einer URL ist und mit dem Thema Sicherheit herzlich wenig zu tun hat...

Ja stimmt schon aber eigentlich wollte ich ja mit dem teil meiner frage bewirken das links keine Wert die über variablen gesetzt worden sind in der Browserzeile zeigen.

Uuuuund ich glaube ich habe jetzt ne ganz gute Lösunge gefunden um jediglich die Werte- übergabe zu verschlüsseln. Damit kann ich auch sicher sein das keiner sich z.B. alle Userprofile ansehen kann wenn er nur die User_ID verändert. Oder liege ich da flasch?! Hier meine Idee:

DATEI1.php

<?
$array = array(
"wert1" => "Nicht sichtbarer Wert 1",
"wert2" => "Nicht sichtbarer Wert 2");

$coded_array = base64_encode(serialize($array));
?>


<a href="i2.php?do=<?=$coded_array;?>">Sicherer Link</a>


DATEI2.php

<?
$coded_array = $_GET["do"]; // or $_POST off course
$array = unserialize(base64_decode($coded_array));

echo $array["wert1"];
echo '<BR>';
echo $array["wert2"];

?>

Sollte doch so gehen oder?

Weiß jemand wie ich den 64'er link vielleicht auf 7- 8 zeichen runterbrechen kann? Bzw ne funktion die vielleicht kürzer als base64_decode ist ?
 
Zurück