praegune kellaaeg 21.06.2025 14:40:32
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
kenkauksi
HV veteran
liitunud: 30.08.2009
|
11.10.2014 00:56:13
Piltide üleslaadimine PHP's |
|
|
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 |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
11.10.2014 09:25:40
|
|
|
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 |
|
 |
kenkauksi
HV veteran
liitunud: 30.08.2009
|
|
Kommentaarid: 178 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
158 |
|
tagasi üles |
|
 |
sigakoer
Kreisi kasutaja
liitunud: 23.01.2004
|
11.10.2014 20:45:34
|
|
|
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 |
|
 |
kenkauksi
HV veteran
liitunud: 30.08.2009
|
13.10.2014 17:05:38
|
|
|
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 |
|
 |
|
lisa lemmikuks |
|
|
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.
|