PDA

View Full Version : سوال: امنیت این کد



saeed-71
سه شنبه 12 شهریور 1392, 07:46 صبح
سلام.
برای امنیت این کد چه تغییراتی بدم؟؟


if(isset($_POST['submit']))
{
$exp=strrchr($_FILES["img"]["name"], ".");
if ($exp==".jpg" or $exp==".JPG" or $exp==".png" or $exp==".png" or $exp==".gif" or $exp==".gif")
{
$random_digit=rand(00000000,99999999);
$new_file_name=$random_digit.$file_name;
$folder = "upload/".$new_file_name;
$target = $folder . $_FILES["img"]["name"];
move_uploaded_file($_FILES["img"]["tmp_name"], $target);
}
$mobile=$_SESSION['mobile'];
$result=mysql_query("INSERT INTO tblcarinfo (berand,ostan,tsakht,gheymat,karkard,bime, rang,silandr,sukht,otagh,rangin, girebox,img1,img2,img3,img4,img5,img6,tozih,name,m obile,tsabet,flag,tarikhsabt)
VALUES
('$_POST[berand]','$_POST[state]','$_POST[tsakht]','$_POST[gheymat]','$_POST[karkard]','$_POST[bime]','$_POST[rang]','$_POST[silandr]','$_POST[sukht]','$_POST[otagh]','$_POST[rangin]','$_POST[girebox]','$target','$_POST[img2]','$_POST[img3]','$_POST[img4]','$_POST[img5]','$_POST[img6]','$_POST[tozih]','$_POST[name]','$mobile','$_POST[tsabet]','0',now())");

if ($result)
$_SESSION['msg']='<font color="#00CC00" style="background:#c6ff00;padding-right:170px;padding-left:166px;margin:3px" >آگهی شما ثبت گردید.</font>';
else
$_SESSION['msg']='<font color="#ff0000" style="background:#ff4e4e;padding-right:170px;padding-left:166px;margin:3px" >آگهی شما ثبت نگردید.</font>';
}
header('location:allad.php');
?>

ابوذر محمودی
سه شنبه 12 شهریور 1392, 08:31 صبح
امنیت کجاش مد نظرتونه؟
درج اطلاعات تو دیتابیس؟
خب شما نباید مستقیماً اطلاعاتی که از Post گرفتینو تو کوئری قرار بدین ، قبلش از یک سری فیلتر ها باید ردشون کنی.
حتما از mysql_real_escape_string و htmlspecialchars استفاده کنید . میتونید از pdo هم برای اتصال به بانک استفاده کنید ، اینطوری امنیتش در مقابل اینجکشن بالاتر میره.
seassion هایی که مهم هستن ،بهتره مقادیری که توش قرار میدین رو کد کنین.

saeed-71
سه شنبه 12 شهریور 1392, 08:46 صبح
امنیت کجاش مد نظرتونه؟
درج اطلاعات تو دیتابیس؟
خب شما نباید مستقیماً اطلاعاتی که از Post گرفتینو تو کوئری قرار بدین ، قبلش از یک سری فیلتر ها باید ردشون کنی.
حتما از mysql_real_escape_string و htmlspecialchars استفاده کنید . میتونید از pdo هم برای اتصال به بانک استفاده کنید ، اینطوری امنیتش در مقابل اینجکشن بالاتر میره.
seassion هایی که مهم هستن ،بهتره مقادیری که توش قرار میدین رو کد کنین.
میشه این


mysql_real_escape_string و htmlspecialchars

رو رو یکی از اینا اعمال کنید؟

saeed-71
سه شنبه 12 شهریور 1392, 09:18 صبح
اقا من این کار رو کردم اما به جای اینکه ورودی رو وارد کنه خود کد رو وارد میکنه کجاش اشکال داره؟؟؟




<?php
ob_start();
session_start();
include('../config.php');
include_once('jdf.php');
mysql_query("set names utf8");
if(isset($_POST['submit']))
{
$exp=strrchr($_FILES["img"]["name"], ".");
if ($exp==".jpg" or $exp==".JPG" or $exp==".png" or $exp==".png" or $exp==".gif" or $exp==".gif")
{
$random_digit=rand(00000000,99999999);
$new_file_name=$random_digit.$file_name;
$folder = "upload/".$new_file_name;
$target = $folder . $_FILES["img"]["name"];
move_uploaded_file($_FILES["img"]["tmp_name"], $target);
}
$berand='$_POST[berand]';
$state='$_POST[state]';
$tsakht='$_POST[tsakht]';
$gheymat='$_POST[gheymat]';
$karkard='$_POST[karkard]';
$bime='$_POST[bime]';
$rang='$_POST[rang]';
$silandr='$_POST[silandr]';
$sukht='$_POST[sukht]';
$otagh='$_POST[otagh]';
$berand='$_POST[berand]';
$rangin='$_POST[rangin]';
$girebox='$_POST[girebox]';
$tozih='$_POST[tozih]';
$name='$_POST[name]';
$mobile='$_POST[mobile]';
$name='$_POST[name]';
$tsabet='$_POST[tsabet]';
$tarikhsabt='$_POST[tarikhsabt]';
$mobile=$_SESSION['mobile'];
$ip=$_SERVER['REMOTE_ADDR'];
$result=mysql_query("INSERT INTO tblcarinfo (berand,ostan,tsakht,gheymat,karkard,bime, rang,silandr,sukht,otagh,rangin, girebox,img1,tozih,name,mobile,tsabet,flag,tarikhs abt,ip)
VALUES
('".mysql_real_escape_string($berand)."','".mysql_real_escape_string($ostan)."','".mysql_real_escape_string($tsakht)."','".mysql_real_escape_string($gheymat)."','".mysql_real_escape_string($karkard)."','".mysql_real_escape_string($bime)."','".mysql_real_escape_string($rang)."','".mysql_real_escape_string($silandr)."','".mysql_real_escape_string($sukht)."','".mysql_real_escape_string($otagh)."','".mysql_real_escape_string($rangin)."','".mysql_real_escape_string($girebox)."','$target','".mysql_real_escape_string($tozih)."','".mysql_real_escape_string($name)."','".mysql_real_escape_string($mobile)."','".mysql_real_escape_string($tsabet)."','0',now(),'$ip')");

if ($result)
$_SESSION['msg']='<font color="#00CC00" style="background:#c6ff00;padding-right:170px;padding-left:166px;margin:3px" >آگهی شما ثبت گردید.</font>';
else
$_SESSION['msg']='<font color="#ff0000" style="background:#ff4e4e;padding-right:170px;padding-left:166px;margin:3px" >آگهی شما ثبت نگردید.</font>';
}
header('location:allad.php');
?>

ابوذر محمودی
سه شنبه 12 شهریور 1392, 10:12 صبح
خب کارتون اشتباس چون شما اومدین ورودی ها رو به صورت رشته تو متغیر ذخیره کردین:

$berand='$_POST[berand]';
اینطوری باید باشه :

$berand=mysql_real_escape_string($_POST["berand"]);

حالا از htmlspecialchars یا میتونی قبل از اضافه کردن به دیتابیس استفاده کنی و یا اینکه موقع نمایش مقادیری که از بانک میخونی.
اگه در مورد این دو تابع اطلاع چندانی ندارین این دو تا لینک رو مطالعه کنید:
http://php.net/manual/en/function.mysql-real-escape-string.php
http://php.net/manual/en/function.htmlspecialchars.php

saeed-71
سه شنبه 12 شهریور 1392, 11:05 صبح
"حالا از htmlspecialchars یا میتونی قبل از اضافه کردن به دیتابیس استفاده کنی و یا اینکه موقع نمایش مقادیری که از بانک میخونی."
اقا از این چجوری استفاده کنم؟
یه مثالم از این میزنی؟
ممنونم.

ابوذر محمودی
سه شنبه 12 شهریور 1392, 11:23 صبح
مثلا وقتی کاربر میاد مثلا اینو وارد میکنه <b> test</b> موقعی که اینو میخوای چاپ کنی متنت bold میشه , اینطوری همه تگ های html رو کاربر میتونه وارد کنه حتی اسکریپت.
شما میای با htmlspecialchars ، هر چی < یا > یا \ یا & هست رو به کد معادل تغییر میدی.
مثلا وقتی کاربر میاد <b>test</b> رو به عنوان ورودی میده خروجیش میشه &lt;b&gt;test&lt;b&gt;

echo htmlspecialchars('<b>test</b>'); //Output: &lt;b&gt;test&lt;b&gt;
حالا شما میتونید موقعی که دارین ورودی رو از کاربر میگیرین اونو از این فیلتر رد کنین بعد تو بانک ذخیره کنید و یا اینکه ورودی رو مستقیم ذخیره کنید و موقع چاپ اونو از این تابع بگذرونید.
مثلا اگه این دستوراتو قبل از کوئری بذارین ، قبل از اینکه بخواین ورودی رو تو بانک ذخیره کنین مقادیر ورودی رو فیلتر کردین .

$berand=htmlspecialchars($_POST["berand"]);
$berand=mysql_real_escape_string($berand);