سوال : چگونه می شه این سایت رو هک کرد؟

سلام
من یه سایت طراحی کردم که برای امنیت فقط از session استفاده کردم.(خیلی ابتدایی هستش چون بنده تازه کارم)

کد صفحه اول اینه :
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test.ir</title>
<script language="javascript"></script>

</head>
<body>

	<form action="login.php" method="post" name="login" target="_self" >
<table  dir="rtl" width="100%" border="1" cellpadding="0" cellspacing="1" bordercolor="#000000" class="block" >
<td height="22" class="table-head" style="vertical-align: middle;  ">login</td>
      </tr>
      <tr>
        <td width="180" class="links"><br />
            <label>user</label>
            <br />
            <input name="tfuser" type="text" class="textfeild" id="tfuser" size="11" />
            <br />
            <br />
          <label>password</label>
          <br />
            <input name="tfpass" type="password" class="textfeild" id="tfpass" size="11" />
            <br />
          <br />
 <button id="button" >login</button>
        </td>
</table>
</form>
</body>
</html>

وقتی یوزر و پسورد وارد شد، ادمین به صفحه login.php می ره با کد زیر:

PHP:
<?php
session_start();
$link = mysql_connect('localhost', 'root', '');
mysql_select_db('test', $link);

$username = $_POST['tfuser'];
$pass = $_POST['tfpass'];

$query = "select * from user where user_name='$username' and user_pass = '$pass'";
$result = mysql_query($query, $link);
$r = mysql_fetch_assoc($result);
		
if (isset($username))
{
	 if ($r['user_name'] != "1")
	{
		print'<script language="javascript">
		window.navigate("hamekare.php?error=1");
		</script>';
	}	
	else
	{
		$_SESSION['login']=1;
		print'<script language="javascript">window.navigate("admin.php");</script>';
} 
}
else
{
	print'<script language="javascript">window.navigate("index.php");</script>'; 
}	
?>

==================

کد ابتدای صفحه admin.php هم اینه :

PHP:
<?php
	session_start();
	if ($_SESSION['login']!=1) print'<script language="javascript">window.navigate("hamekare.php");</script>';
	
?>

============
حالا می خوام بدونم آیا می شه (شدنش که حتماً می شه) این سایت رو هک کرد؟
چطوری؟

و راه حلش رو هم بگین ممنون می شم
 

tabib_m

Member
از لحاظ منطق کار, کار نادرستی انجام ندادی. ولی خوب میشد یکم صاف و صوف تر نوشتش. مثلا بهتر بود به جای ریدایرکت کردن به وسیله ی javascript از php کمک میگرفتی و مسائل مشابه.

از لحاظ امنیتی حداقل من که ایرادی نمیبینم! اگر هم یه موقع سایتت هک شد, حتما هکر از راه دیگه ای وارد شده و این صفحه به حالش سوده نداشته :)

موفق باشید.
 
خيلي ازتون ممنونم

يعني به نظر شما من مي تونم اين سايت رو رو هاست قرار بدم؟؟؟

چيزي كم و كسر نداره از لحاظ امنيت؟

مي شه اون پيشنهادي رو كه گفتين مي شه بهتر انجام داد، بگين؟
 
ممنون دوست عزیز

دقیقا قبل از خوندن پیام شما برخوردم به یه مقاله در مورد همین sql injection

بعد اومدم دیدم شما هم همینو نوشتید:)

ببینید این راه حل مناسبه:

هنگام چک کردن در صفحه لاگین ابتدا چک می کنم که آیا کاراکتر های وارد شده توسط یوزر، کاراکتر های استاندارد هستن یا نه
(برای اینکه یوزر نتونه از کد های جاوا و html استفاده کنه ) .

برای همین ورودی رو می ریزم تو یه متغیر به این صورت :
PHP:
$Name  = htmlspecialchars($Name);

بعد دوباره کاراکتر ها رو چک می کنم که مبادا کاراکتر " ' " در بینشون موجود باشه
(برای اینکه مشکلی در mysql پیش نیاد) به این صورت :
PHP:
$Name  = str_replace("'", "", $Name);

حالا چی؟

می شه نظرتون رو بگین؟
 
قبل از اینکه نظرتون رو بگیم می شه خواهش کنم دستوری رو که ممکنه چنین سایت هایی رو تهدید کنه بنویسین.

دستورات SQL Injection منظورمه؟

چه چیزی در یوزر و پسورد وارد می کنه؟
 

irdavidnet

Banned
ببین عزیز ، اول اگه شما یه سیستم sign up و signin هست ، باید class بنویسی ، function ، و از کوکی و سشن استفاده کنی ، اینطوری ، درسته کارت درسته ولی حرفه ای نیست ، مشکل پیش میاد برات بعداً ...
 

maso

Member
بهترین راه اینه که پسورد ها را همیشه در دیتابیس با crypt نگه داری و آن سطر که یوزر داره ، ازش بگیری و در بیرون ، با php با چیزی که طرف به عنوان پسورد فرستاده با crypt مقایسه کنی ، حالا SQL Injection نکنه ، کل دیتابیس را حک کنه باز نمیتونه لاگ این بشه
 

alireza82

Well-Known Member
ممنون دوست عزیز

دقیقا قبل از خوندن پیام شما برخوردم به یه مقاله در مورد همین sql injection

بعد اومدم دیدم شما هم همینو نوشتید:)

ببینید این راه حل مناسبه:

هنگام چک کردن در صفحه لاگین ابتدا چک می کنم که آیا کاراکتر های وارد شده توسط یوزر، کاراکتر های استاندارد هستن یا نه
(برای اینکه یوزر نتونه از کد های جاوا و html استفاده کنه ) .

برای همین ورودی رو می ریزم تو یه متغیر به این صورت :
PHP:
$Name  = htmlspecialchars($Name);

بعد دوباره کاراکتر ها رو چک می کنم که مبادا کاراکتر " ' " در بینشون موجود باشه
(برای اینکه مشکلی در mysql پیش نیاد) به این صورت :
PHP:
$Name  = str_replace("'", "", $Name);

حالا چی؟

می شه نظرتون رو بگین؟
سلام
این توابعی که گفتی بیشتر بدرد جلوگیری از حملات xss و حملات مبتنی بر html یا js مناسب هست. برای جلوگیری از حملات sql injection تایع mysql_real_escape_string() مناسب هست! $Name = str_replace("'", "", $Name); رو زیاد جالب نمیدونم. بهتره ازش استفاده نکنی! خروجی
mysql_real_escape_string() رو برای ورودی های مشکوک ببین ، متوجه خواهی شد که خروجی این تابع و دستوری که تو نوشتی تا حدی متفاوتن که یه جورایی کارایی این دستوری که نوشتی رو برای من یکی زیر سوال میبره!
موفق باشید.
 
آخرین ویرایش:
آخه من چن تا دستو SQL Injection رو استفاده کردم
ولی تو سایتم جواب نداد:D
یعنی هک نشد

البته پسورد هم MD5 شده
 

jhoseini

Member
SQL Injection فقط در مواردی عمل میکنه که سرور ضعف داشته باشه، چون در حالت عاد روی سرور های نرمال پارامتر های دریافتی چک میشه
php.ini
PHP:
; ; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

قبلا از ارسال data به دیتابیس چک کنید اگه magic_quotes_gpc فعال هست دیگه نیاز به mysql_real_escape_string() برای جلوگیری از حملات SQL.Injection نیست فقط شاید xss ازیت کنه که اونم با htmlspecialchars حله

PHP:
$data=$_REQUEST['data'];
if((int)ini_get("magic_quotes_gpc") == 0){
  $data = addslashes($data);
}

------------------
پیشنهاد میکنم مقاله جناب alireza82 در مورد امنیت رو بخونی، حرف نداره : )
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا