PDA

View Full Version : مشکلات امنیتی این کد !



terrorhell
سه شنبه 19 آذر 1387, 02:29 صبح
سلام دوستان

آیا این کد از نظر امنیتی مشکل داره ؟؟
کد نیاز به توضیح نداره چون واضحه

ممنون دوستان



<?php
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="portal"; // Database name
$tbl_name="members"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// username and password sent from form
$username=$_POST['username'];
$password=$_POST['password'];
// To protect MySQL injection (more detail about MySQL injection)
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
if(isset($_POST['submit']) )
{
$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);
if(mysql_num_rows($result) > 0){
$userInfo = mysql_fetch_assoc($result);
$_SESSION['username'] = $userInfo['username'];
$_SESSION['permission'] = $userInfo['permission'];
echo '<meta http-equiv="REFRESH" content="0.1;url=index.php?user='.$userInfo[username].'" >';
}
else
{
?>
<script language="javascript">
var t=window.alert("نام کاربری و رمز عبور نادرست می باشد.");
if(t==true)
window.location="index.php?login";
</script>
<?php } } ?>

yaqubian
سه شنبه 19 آذر 1387, 11:16 صبح
دوست عزیز
خیلی خیلی هم مشکل داره:
بعنوان نمونه:

mysql_real_escape_string
ضعف امنیتی شدیدی داره!
موفق باشید

yaqubian
سه شنبه 19 آذر 1387, 11:22 صبح
دوست عزیز
نمونش رو قبلا گذاشتم.
http://barnamenevis.org/forum/showthread.php?t=134229
موفق باشید

narsic
سه شنبه 19 آذر 1387, 12:07 عصر
$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";

[/php]

با سلام
به جز گفته جناب یعقوبیان کار بررسی نام کاربری و کلمه عبور رو به صورت کامل به بانکتون محول نکنید این کار رو در دومرحله انجام بدید امنیتتون خیلی بالاتر میره .
موفق باشید

terrorhell
سه شنبه 19 آذر 1387, 13:29 عصر
ممنون دوستان

جناب یعقوبیان راجبه ضعف mysql_real_escape_string شنیدم یه چیزایی اما به نتیجه ای نرسیدم ، ممنون میشم راجبه کار mysql_real_escape_string و ضعفش توضیحی مختصر مفید بدید و راه حل جلوگیری از ضعفش هم بیان کنید .

جناب نارسیس من منظور شما رو متوجه نشدم ، ممنون میشم یکم بیشتر توضیح بدید!

terrorhell
سه شنبه 19 آذر 1387, 13:37 عصر
در مورد اون ضعف که گفتید مربوط به Magic Quotes هست :



; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

narsic
سه شنبه 19 آذر 1387, 14:26 عصر
با سلام
قبل از هرچیز نارسیک نه نارسیس .
این مثال رو ببینید



$sql=mysql_query("select password from $table where username='$username' limit 1;");



بعد از اجرای کد بالا ابن کد رو فراخوانی کنید



if (!$result)
echo 'name karbaru va ya kalamae obur eshtebah ast ';
else
if ($result==$password)
echo 'vorud movafaghiat amiz';


البته دوست عزیز این کد نیاز به دستکاری داره که باید خودتون انجامش بدید من فقط همین جا اینو براتون نوشتم .
موفق باشید

yaqubian
سه شنبه 19 آذر 1387, 17:54 عصر
دوست عزیز
بعضی از دستوراتی که شما در حال حاضر باهاشون کار می کنید مثل همین مورد اخیر اینقدر مشکل امنیتی دارن که تو manual خود سایت های تخصصی php نوشته شده که به دلایل ضعف های امنیتی در php نسخه 6 دیگه از این دستورات استفاده نمی شه!
موفق باشید

terrorhell
سه شنبه 19 آذر 1387, 18:19 عصر
این کد؟



I made a admin secure room


CODE
<?php
if( isset($_POST["login"]))
{
$query = mysql_query("select * from account where name='".$_POST["name"]."'");
$row = mysql_fetch_object($query);
$pass = md5($_POST["password"]);
if("password" == $row->password && $_POST["name"] == $row->name)
{
setcookie ("login", $_POST["name"],time()+3600*365);
echo "U bent ingelogt.";
echo "<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"1; URL=?p=home\">";
}
else
{
echo "Error.";
}
}
?>

This is the login aera it calls simply the database
And sets a cookie when you are logged in and calls error when you are not registered!


CODE
<?php
if( isset($_POST["reg"]))
{
if($_POST["name"] != "" && $_POST["email"] != "" && $_POST["name1"] != "" && $_password != "")
{
$telgb = mysql_query("SELECT gebruikersnaam FROM account WHERE name='".$_POST["name"]."'") or die($error[1]);
$numgb = mysql_num_rows($telgb);
if($numgb == "1")
{
echo"<center>Account allready exists</center>";
}
else
{
if(!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$", $_POST["email"]))
{
echo"<center>Error mail!</center>";
}
else
{
if($password != $_POST["password2"])
{
echo "<center>Password are not the same</center>";
}
else
{
echo"<center>You are registered.</center>";
$pass= md5($password1);
mysql_query("insert into account (name1,name,password,idate,email) values ('".$_POST["naam"]."','".$_POST["gebruikersnaam"]."','".$password."','".date."','".$_POST["email"]."')") or die(mysql_error());
}
}
}
}
else
{
echo "<center>Something is not ready.</center>";
}
}
?>


This is the register account name

And this you must copy on each page you want to secure

CODE
<?php
$query = mysql_query("select * from account where id='".$_GET["id"]."'");
$row = mysql_fetch_object($query);
$ex = mysql_num_rows($query);
if($ex == "0")
{
echo "Dit acountje bestaat niet.";
exit();
}
else
{here your tabel }
?>
After the else is your tabel when its a correct login

Yousha
سه شنبه 19 آذر 1387, 19:40 عصر
مشکل امنیتی کم، ولی بهینه سازی زیاد.

yaqubian
سه شنبه 19 آذر 1387, 20:29 عصر
دوست عزیز
نسبت به قبل خیلی خیلی بهتر شده.
موفق باشید

terrorhell
سه شنبه 19 آذر 1387, 23:06 عصر
راستی کد اولی رو یک تغییری دادم ، اما دلیل اون کلاسی که شما نوشتید رو زیاد متوجه نشدم

به این نگاه کنید :



// To protect MySQL injection (more detail about MySQL injection)
$username = stripslashes($username);
$password = stripslashes($password);
if(!get_magic_quotes_gpc())
{
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
}


برای بهینه سازی کدهای SQL

Yousha
سه شنبه 19 آذر 1387, 23:44 عصر
اگر قراره فقط در PHP +5 اجرا بشه که هیچ.
در غیر این صورت:

get_magic_quotes_gpc() ? $Str_Input= @stripslashes($Str_Input) : $Str_Input= @addslashes($Str_Input);

if(function_exists('mysql_real_escape_string')): @mysql_real_escape_string($Str_Input);
else: @mysql_escape_string($Str_Input);
endif;
اگر میتونید HTMLSpecialChars هم قرار بدید، خیلی عالیه.
موفق باشید.

yaqubian
چهارشنبه 20 آذر 1387, 09:43 صبح
دوست عزیز
نکته ای که دوست عزیزمون Yousha کدش رو زحمت کشیدن اینجا گذاشتن یکی از tip های اساسی مربوط به security هست که اخیرا تو تمام کلاس های المپیاد برنامه نویسی مطرح می شه.
یکی از بهترین سایت هایی که تو زمینه tip می تونه بهتون کمک کنه سایت talkphp.com هستش.
موفق باشید