PDA

View Full Version : چک امنیت یک لاگین



saeedizade
چهارشنبه 20 مرداد 1395, 23:36 عصر
سلام دوستان من تازه php و طراحی یادگرفتن رو شروع کردم یک صفحه لاگین درست کردم کد رو یه نگاه بندازد اگه راه نفوذ داره خیلی لطف میکنید بگید و یاد بدید
این ادرس سایته http://saeedizade.zgig.in/bootstrap/index.php من یک سری یوزر داخل سایت تعریف کردم (username = saeedizade password = 1234) کلا همه اطلاعات رو گفتم بهتون قصد ندارم پسوورد حک کنید فقط در مورد راه های نفوذ به همچین سیستم ساده و را ه های بستنش کمک میخام (سایت کلا تمرینیه)


<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<style>
.left1{
float: right;
}
</style>
</head>
<body>

<div class="container">
<div class = left1>
<h2>ورود به سیستم</h2>
</div>
<br><br>
<form class="form-horizontal" role="form" method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<div class="form-group">
<label class="control-label col-sm-2" for="name"><br>username:</label>
<div class="col-sm-10">
<input type="name" class="form-control" name= "username" placeholder="username">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="pwd">Password:</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="pwd" name= "password" placeholder="Enter password">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">ورود</button>
</div>
</div>
</form>
<?php
$username ="";
$password ="";
if ($_SERVER["REQUEST_METHOD"] == "POST") {


$username = $_POST["username"];
$password = $_POST["password"];
}
$servername = "mysql.zgig.in";
$serverusername = "u890853761_stu";
$serverpassword = "123456789";
$databasename = "u890853761_stu";
$conn = new mysqli($servername, $serverusername, $serverpassword, $databasename);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully" . "<br>";

$sql = "SELECT stnumber,stname,stusername , stpassword FROM student where stusername='$username' and stpassword = '$password'";

$result = $conn->query($sql);

if ($result->num_rows >= 1) {

while($row = $result->fetch_assoc()) {
session_start();

$_SESSION['st'] = $row;

header("Location: /bootstrap/student.php");
exit;
}
} else {
echo "ورود نا موفق نام کاربری یا رمز اشتباه";
}
?>
</div>
</body>
</html>

sedamorde
جمعه 29 مرداد 1395, 03:09 صبح
سلام،
دوست عزیز کد شما مشکلاتی داره:

1 - ورودی‌های کاربر (مثل username و password) باید حتماً فیلتر بشه. اگر ار یک فیلتر قوی استفاده نکنید راه را برای خرابکاری هکرها کاملاً باز گذاشته‌اید.
من چند مورد ذکر می‌کنم که به شما کمک می‌کنه، البته تأکید می‌کنم؛ کدهای من فقط جهت مثال است و به موارد و کار بیشتری نیاز دارد.

تابع trim :
این تابع فضای خالیِ قبل و بعد از ورودی را حذف می‌کند، شاید کاربر در انتهای Username خود یک Space زده باشد!


$username = trim( $_POST['username'] );
//'username ' => 'username'


تابع addslashes :
این تابع کاراکتر ' را به صورت \' در می‌آورد. اگر کاراکتر ' یا " در Query قرار بگیرد می‌تواند خطرات بسیار جدی‌ای ایجاد کند. امنییت این مسئله برای پایگاه داده و Query ها بسیار مهم است.


$username = addslashes( $_POST['username'] );
//addslashes("'username") => \'username


تابع htmlentities :
این تابع کدهای HTML را غیر فعال می‌کند. مطمئن شوید که کدهای HTML و جاوا اسکریپت (JavaScript)‌ در ورودی‌ها فیلتر شود.


$username = htmlentities( $_POST['username'] );
//'<div>username</div>' => &lt;div&gt;username&lt;/div&gt;gt;


توابع دیگری هم وجود دارد که هر کدام را بهر کاری ساختند، مثل :‌ htmlspecialchars , strip_tags و ...


2 - لازم نیست result را در یک حلقه قرار بدهید.
حلقه‌ها، مثل while‌ برای زمانی است که نتیجه‌ی متغیرهای ما دربرگیرنده‌ی بیش از یک مقدار باشد. در اینجا شما فقط داده‌های یک کاربر را از پایگاه داده می‌گیرید نه بیشتر، پس حلقه لازم نیست.


3 - در PHP تمام Header ها باید قبل از نمایش خروجی چاپ شود، قبل از نمایش کدهای HTML‌. در غیر این صورت با خطا مواجه می‌شوید. این قانون در مورد session_start هم صدق می‌کند.


4 - اولاً بهتر است کدهای PHP را در یک فایل جداگانه از HTML بنویسید. اگر اینکار را نمی‌کنید حداقل کدهای PHP را در ابتدای صفحه بنویسید.


5 - فراموش نکنید Password ها را حتماً به صورت Hash (یا همان رمز شده) در پایگاه داده ذخیره کنید.
در همین تاپیک امنییت، موارد بسیار خوبی مثال زده شده است.

6 - لازم و شاید عاقلانه هم نباشد که بررسی Password کاربر در داخل Query انجام شود.
ابتدا اطلاعات کاربر را مطابق با username از پایگاه داده بگیرید، اگر کاربر وجود داشت سپس رمز آن را بررسی کنید.

7 - برای کار با پایگا‌ه‌های داده SQL از PHP PDO استفاده کنید بهتر است. آموزش‌های زیادی در این‌باره وجود دارد.


امیدوارم راهنمایی‌های اندک من به شما کمک کند.
موفق باشید.

Vidico
سه شنبه 02 شهریور 1395, 15:15 عصر
سلام،
دوست عزیز کد شما مشکلاتی داره:

1 - ورودی‌های کاربر (مثل username و password) باید حتماً فیلتر بشه. اگر ار یک فیلتر قوی استفاده نکنید راه را برای خرابکاری هکرها کاملاً باز گذاشته‌اید.
من چند مورد ذکر می‌کنم که به شما کمک می‌کنه، البته تأکید می‌کنم؛ کدهای من فقط جهت مثال است و به موارد و کار بیشتری نیاز دارد.

تابع trim :
این تابع فضای خالیِ قبل و بعد از ورودی را حذف می‌کند، شاید کاربر در انتهای Username خود یک Space زده باشد!


$username = trim( $_POST['username'] );
//'username ' => 'username'


تابع addslashes :
این تابع کاراکتر ' را به صورت \' در می‌آورد. اگر کاراکتر ' یا " در Query قرار بگیرد می‌تواند خطرات بسیار جدی‌ای ایجاد کند. امنییت این مسئله برای پایگاه داده و Query ها بسیار مهم است.


$username = addslashes( $_POST['username'] );
//addslashes("'username") => \'username


تابع htmlentities :
این تابع کدهای HTML را غیر فعال می‌کند. مطمئن شوید که کدهای HTML و جاوا اسکریپت (JavaScript)‌ در ورودی‌ها فیلتر شود.


$username = htmlentities( $_POST['username'] );
//'<div>username</div>' => &lt;div&gt;username&lt;/div&gt;gt;


توابع دیگری هم وجود دارد که هر کدام را بهر کاری ساختند، مثل :‌ htmlspecialchars , strip_tags و ...


2 - لازم نیست result را در یک حلقه قرار بدهید.
حلقه‌ها، مثل while‌ برای زمانی است که نتیجه‌ی متغیرهای ما دربرگیرنده‌ی بیش از یک مقدار باشد. در اینجا شما فقط داده‌های یک کاربر را از پایگاه داده می‌گیرید نه بیشتر، پس حلقه لازم نیست.


3 - در PHP تمام Header ها باید قبل از نمایش خروجی چاپ شود، قبل از نمایش کدهای HTML‌. در غیر این صورت با خطا مواجه می‌شوید. این قانون در مورد session_start هم صدق می‌کند.


4 - اولاً بهتر است کدهای PHP را در یک فایل جداگانه از HTML بنویسید. اگر اینکار را نمی‌کنید حداقل کدهای PHP را در ابتدای صفحه بنویسید.


5 - فراموش نکنید Password ها را حتماً به صورت Hash (یا همان رمز شده) در پایگاه داده ذخیره کنید.
در همین تاپیک امنییت، موارد بسیار خوبی مثال زده شده است.

6 - لازم و شاید عاقلانه هم نباشد که بررسی Password کاربر در داخل Query انجام شود.
ابتدا اطلاعات کاربر را مطابق با username از پایگاه داده بگیرید، اگر کاربر وجود داشت سپس رمز آن را بررسی کنید.

7 - برای کار با پایگا‌ه‌های داده SQL از PHP PDO استفاده کنید بهتر است. آموزش‌های زیادی در این‌باره وجود دارد.


امیدوارم راهنمایی‌های اندک من به شما کمک کند.
موفق باشید.
بسیار جامع بود، مفید واقع شد.. (http://kimkala.com).

میشه خودتون یک صفحه فوق امن برای لاگین بنویسید؟ ارائه بدین همه راحت بشن

IamOverlord
جمعه 12 شهریور 1395, 06:33 صبح
سلام دوست عزیز!
در کنار گفته های دوستمون این رو بگم که صفحه ی شما باگ SQL Injection (https://en.wikipedia.org/wiki/SQL_injection) داره و عملا می شه برای نفوذ این کارو کرد:
برای نام کاربری admin رو زد و برای گذرواژه این عبارت رو:
' OR '1'='1