Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Piltide üleslaadimine PHP's märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
kenkauksi
HV veteran

liitunud: 30.08.2009



Autoriseeritud ID-kaardiga

sõnum 11.10.2014 00:56:13 Piltide üleslaadimine PHP's vasta tsitaadiga

Ehitan siin vaikselt omale pokkerisaiti ja vaja custom avataride jaoks siis PHP skript teha. Olen PHP's täielik võhik ja olen tasapisi netist juppidest asja kokku pannud.

Hetkel skript teeb kõik vajaliku ära, aga olen just mures turvalisuse pärast.

Skript võtab vastu 48x48 pildi ja teeb sellest 2 muudetud pilti, originaali alles ei jäta.

Tahaks siis teada kas on võimalik kuidagi kellelgi midagi kahtlast üles laadida ja serverile ligi pääseda.

Kood:

<?php

include "C:/xampp/api/API.php";

if(isset($_COOKIE['username'])){
   
$username = $_COOKIE['username'];

$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
if(count($temp) !== 2)
{
  if($temp[1] == "php")
  {
    echo "Looks like you are trying to upload shell. This attempt has been logged.";
    exit;
  }
  else
  {
    echo "No periods allowed in filename, please try again.";
    exit;
  }
}

$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 10000)
&& in_array($extension, $allowedExts)) {
  if ($_FILES["file"]["error"] > 0) {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
  } else {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "images/avatars/" . $username);
  }
} else {
  echo "Invalid file";
  exit;
}

} else {
    echo 'You need to be logged in to upload files. This attempt has logged.';
    exit;
}

imagepng(imageCreateCorners("./images/avatars/" . $username, 20),"temp.png");

imageWaterMark('./images/watermark.png', './images/avatars/' . $username . '1.png');
imageWaterMark('./images/watermark2.png', './images/avatars/' . $username . '2.png');

$params = array("Command" => "AccountsEdit", "Player" => $username, "AvatarFile" => './images/avatars/' . $username . '1.png');
$api = Poker_API($params);

unlink('./images/avatars/' . $username);

echo "<meta http-equiv='refresh' content='0; url=http://127.0.0.1'>";

function imageWaterMark($src, $dest){
        $image_1 = imagecreatefrompng('temp.png');
        $image_2 = imagecreatefrompng($src);
        imagealphablending($image_1, true);
        imagesavealpha($image_1, true);
        imagecopy($image_1, $image_2, 0, 0, 0, 0, 100, 100);
        imagepng($image_1, $dest);   
}

function imageCreateCorners($sourceImageFile, $radius) {
    # test source image
    if (file_exists($sourceImageFile)) {
      $res = is_array($info = getimagesize($sourceImageFile));
      }
    else $res = false;

    # open image
    if ($res) {
      $w = $info[0];
      $h = $info[1];
      if($w != 48 || $h != 48){
          echo 'Image resolution must be 48x48px';
          exit;
      }
      $type = $_FILES["file"]["type"];
      switch ($type) {
        case "image/jpeg": $src = imagecreatefromjpeg($sourceImageFile);
          break;
        case "image/gif": $src = imagecreatefromgif($sourceImageFile);
          break;
        case "image/png": $src = imagecreatefrompng($sourceImageFile);
          break;
        default:
          $res = false;
        }
      }

    # create corners
    if ($res) {

      $q = 5; # change this if you want
      $radius *= $q;

      # find unique color
      do {
        $r = rand(0, 255);
        $g = rand(0, 255);
        $b = rand(0, 255);
        }
        //something to do with transparent edges
      while (imagecolorexact($src, $r, $g, $b) > 0 && imagecolorexact($src, $r, $g, $b) < 0);

      $nw = $w*$q;
      $nh = $h*$q;

      $img = imagecreatetruecolor($nw, $nh);
      $alphacolor = imagecolorallocatealpha($img, $r, $g, $b, 127);
      imagealphablending($img, false);
      imagesavealpha($img, true);
      imagefilledrectangle($img, 0, 0, $nw, $nh, $alphacolor);

      imagefill($img, 0, 0, $alphacolor);
      imagecopyresampled($img, $src, 0, 0, 0, 0, $nw, $nh, $w, $h);

      imagearc($img, $radius-1, $radius-1, $radius*2, $radius*2, 180, 270, $alphacolor);
      imagefilltoborder($img, 0, 0, $alphacolor, $alphacolor);
      imagearc($img, $nw-$radius, $radius-1, $radius*2, $radius*2, 270, 0, $alphacolor);
      imagefilltoborder($img, $nw-1, 0, $alphacolor, $alphacolor);
      imagearc($img, $radius-1, $nh-$radius, $radius*2, $radius*2, 90, 180, $alphacolor);
      imagefilltoborder($img, 0, $nh-1, $alphacolor, $alphacolor);
      imagearc($img, $nw-$radius, $nh-$radius, $radius*2, $radius*2, 0, 90, $alphacolor);
      imagefilltoborder($img, $nw-1, $nh-1, $alphacolor, $alphacolor);
      imagealphablending($img, true);
      imagecolortransparent($img, $alphacolor);

      # resize image down
      $dest = imagecreatetruecolor($w, $h);
      imagealphablending($dest, false);
      imagesavealpha($dest, true);
      imagefilledrectangle($dest, 0, 0, $w, $h, $alphacolor);
      imagecopyresampled($dest, $img, 0, 0, 0, 0, $w, $h, $nw, $nh);

      # output image
      $res = $dest;
      imagedestroy($src);
      imagedestroy($img);
      }

    return $res;
    }
Kommentaarid: 178 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 158
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 11.10.2014 09:25:40 vasta tsitaadiga

Ma pole just ka suuremasi PHP võlur, aga juba kohe alguses torkas silma, et Sa hoiad kasutajanime küpsises ja selle sama küpsisega antud kasutajanime järgi salvestad pildi ära. Sisuliselt tähendab see seda, et ma saan küpsist muutes suvalise kasutaja profiilile peeniseid laadida.

Siit tekib küsimus, et kas sa hoiad kogu oma rakenduse piires kasutajanime küpsises? See ei ole kindlasti turvaline eelpool nimetatud põhjusel, sest küpsis on kliendi brauseris ja seda saab väga lihtsalt muuta enne serverisse saatmist. Kõik kriitiline info peab olema hoitud serveri poolel sessioonis ja kliendi poolel on küpsises või URL-is ainult sessiooni ID, mis on juhuslik ja ära arvamine ei ole võimalik. Ühesõnaga, võta ette PHP dokumentatsioon näiteks siit: http://php.net/manual/en/book.session.php ja hakka kriitilise pilguga oma rakendust üle vaatama ja sessioonidele üle viima.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
kenkauksi
HV veteran

liitunud: 30.08.2009



Autoriseeritud ID-kaardiga

sõnum 11.10.2014 18:54:18 vasta tsitaadiga

Tänan, et sellele tähelepanu pöörasid. Eesmärk oli kuidagimoodi sait tööle saada ja siis hakata koodi üle vaatama ja parandama. Kindlasti viin kõik üle sessioonidele.
_________________
Cheap rotating residential proxies
Multichain cryopto payments made easy
Kommentaarid: 178 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 158
tagasi üles
vaata kasutaja infot saada privaatsõnum
sigakoer
Kreisi kasutaja

liitunud: 23.01.2004




sõnum 11.10.2014 20:45:34 vasta tsitaadiga

Sa pead ka kindel olema, et sessioonis usernamed ise punkte-slashe-tärne ei saa sisaldada.
Kommentaarid: 36 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 35
tagasi üles
vaata kasutaja infot saada privaatsõnum
kenkauksi
HV veteran

liitunud: 30.08.2009



Autoriseeritud ID-kaardiga

sõnum 13.10.2014 17:05:38 vasta tsitaadiga

Nii uus upload.php

<?php
if(isset($_COOKIE['SessionID'])){
    session_id($_COOKIE['SessionID']);
}

session_start();
   
include "C:/xampp/api/API.php";

if($_SESSION['loggedin']){
   
$username = strtolower ($_SESSION['username']);

$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
if(count($temp) !== 2)
{
  if($temp[1] == "php")
  {
    echo "Looks like you are trying to upload shell. This attempt has been logged.";
    exit;
  }
  else
  {
    echo "No periods allowed in filename, please try again.";
    exit;
  }
}

$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 10000)
&& in_array($extension, $allowedExts)) {
  if ($_FILES["file"]["error"] > 0) {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
  } else {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "images/avatars/" . $username);
  }
} else {
  echo "Invalid file";
  exit;
}

} else {
    echo 'You need to be logged in to upload files. This attempt has logged.';
    exit;
}

imagepng(imageCreateCorners("./images/avatars/" . $username, 20),"temp.png");

imageWaterMark('./images/watermark.png', './images/avatars/' . $username . '1.png');
imageWaterMark('./images/watermark2.png', './images/avatars/' . $username . '2.png');

$params = array("Command" => "AccountsEdit", "Player" => $username, "AvatarFile" => 'C:/xampp/htdocs/library/images/avatars/' . $username . '1.png');
$api = Poker_API($params);

unlink('./images/avatars/' . $username);

echo "<meta http-equiv='refresh' content='0; url=http://127.0.0.1'>";

function imageWaterMark($src, $dest){
        $image_1 = imagecreatefrompng('temp.png');
        $image_2 = imagecreatefrompng($src);
        imagealphablending($image_1, true);
        imagesavealpha($image_1, true);
        imagecopy($image_1, $image_2, 0, 0, 0, 0, 100, 100);
        imagepng($image_1, $dest);   
}

function imageCreateCorners($sourceImageFile, $radius) {
    # test source image
    if (file_exists($sourceImageFile)) {
         $res = is_array($info = getimagesize($sourceImageFile));
      } else {
         $res = false;
      }

    # open image
    if ($res) {
      $w = $info[0];
      $h = $info[1];
      if($w != 48 || $h != 48){
          echo 'Image resolution must be 48x48px';
          exit;
      }
      $type = $_FILES["file"]["type"];
      switch ($type) {
        case "image/jpeg": $src = imagecreatefromjpeg($sourceImageFile);
          break;
        case "image/gif": $src = imagecreatefromgif($sourceImageFile);
          break;
        case "image/png": $src = imagecreatefrompng($sourceImageFile);
          break;
        default:
          $res = false;
        }
      }

    # create corners
    if ($res) {

      $q = 5; # change this if you want
      $radius *= $q;

      # find unique color
      do {
        $r = rand(0, 255);
        $g = rand(0, 255);
        $b = rand(0, 255);
        }
        //something to do with transparent edges
      while (imagecolorexact($src, $r, $g, $b) > 0 && imagecolorexact($src, $r, $g, $b) < 0);

      $nw = $w*$q;
      $nh = $h*$q;

      $img = imagecreatetruecolor($nw, $nh);
      $alphacolor = imagecolorallocatealpha($img, $r, $g, $b, 127);
      imagealphablending($img, false);
      imagesavealpha($img, true);
      imagefilledrectangle($img, 0, 0, $nw, $nh, $alphacolor);

      imagefill($img, 0, 0, $alphacolor);
      imagecopyresampled($img, $src, 0, 0, 0, 0, $nw, $nh, $w, $h);

      imagearc($img, $radius-1, $radius-1, $radius*2, $radius*2, 180, 270, $alphacolor);
      imagefilltoborder($img, 0, 0, $alphacolor, $alphacolor);
      imagearc($img, $nw-$radius, $radius-1, $radius*2, $radius*2, 270, 0, $alphacolor);
      imagefilltoborder($img, $nw-1, 0, $alphacolor, $alphacolor);
      imagearc($img, $radius-1, $nh-$radius, $radius*2, $radius*2, 90, 180, $alphacolor);
      imagefilltoborder($img, 0, $nh-1, $alphacolor, $alphacolor);
      imagearc($img, $nw-$radius, $nh-$radius, $radius*2, $radius*2, 0, 90, $alphacolor);
      imagefilltoborder($img, $nw-1, $nh-1, $alphacolor, $alphacolor);
      imagealphablending($img, true);
      imagecolortransparent($img, $alphacolor);

      # resize image down
      $dest = imagecreatetruecolor($w, $h);
      imagealphablending($dest, false);
      imagesavealpha($dest, true);
      imagefilledrectangle($dest, 0, 0, $w, $h, $alphacolor);
      imagecopyresampled($dest, $img, 0, 0, 0, 0, $w, $h, $nw, $nh);

      # output image
      $res = $dest;
      imagedestroy($src);
      imagedestroy($img);
      }

    return $res;
    }


ja sessiooni saab username nii:


$username = filter_input(INPUT_POST, 'username');
$_SESSION['username'] = $username;


Saan aru, et aint teatud resolutsiooniga saab pilte laadida ja midagi ei logi veel aga need on irrelevant, tahan teada kas seda koodi saab veel kuidagi kurjalt ära kasutada.
Kommentaarid: 178 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 158
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Piltide üleslaadimine PHP's
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.