PDA

View Full Version : تامین امنیت در فرم ثبت نام



weblox
چهارشنبه 23 بهمن 1392, 20:52 عصر
سلام خدمت دوستان و اساتید محترم

برای تامین امنیت لازم برای فرم ثبت نام PHP که قرار است کاربر در آن نام کاربری ، رمز عبور و ایمیل و .... را وارد کند مطالبی را مطالعه کردم اما متاسفانه نتونستم به جمع بندی درستی برسم.

تا جایی که فهمیدم دو مسئله در زمینه پر کردن فرم ها توسط کاربر مطرح است اول اینکه کاربر را مجاب کنیم که در قالب دلخواه ما عبارات را وارد کند مثلا اینکه پسورد حتما 8 کاراکتر باشد و دیگری جلوگیری از استفاده از کاراکترهایی است که موجب حملاتی از قبیل تزریق به دیتابیس می شود.

توابع مختلفی وجود دارد که بنده را به هدف می رساندند اما نتوانستم ترکیبات درست را برای استفاده پیدا کنم.

لطفا ترکیبات درست استفاده صحیح از توابع و فیلترهای مناسب را که بتواند امنیت فرم ثبت نام را تا حد مطلوبی فراهم کند معرفی کنید.

با تشکر

weblox
چهارشنبه 23 بهمن 1392, 20:59 عصر
مطالب دیگر که به ذهنم می رسد :



باید نام کاربری و ایمیل در بانک اطلاعاتی جستجو شود تا کاربر نتواند از نام کاربری تکراری و ایمیل تکراری برای ثبت نام استفاده کند.
فرمت نام کاربری باید بررسی شود تا کاربر نتواند از کاراکترهای خاص استفاده کند.
باید ایمیل وارد شده از نظر فرمت صحیح نوشته شود.
هر گونه فاصله (اسپیس) باید از نام کاربری و ایمیل حذف شود.
رمز عبور باید با توابع مناسب کد شود. ( گویا اضافه کردن نمک یا نمک پاشی روش مناسبی برای این کار است).

weblox
جمعه 25 بهمن 1392, 01:43 صبح
گمان می کنم سوالم را خیلی کلی پرسیدم. بنظر دوستان امنیت این کد برای فرم ثبت نام چقدر مناسب است؟


<?php
session_start();

// حذف بک اسلشهایی که به صورت خودکار توسط Magic Quotes به اطلاعات ارسال شده افزوده شده اند
function UnEscape($string) {
if (get_magic_quotes_gpc()) {
return stripslashes($string);
} else {
return $string;
}
}

$errors = array();
$min_length = 4;
$max_length = 20;
$min_length_pass = 6;
$max_length_pass = 20;

// اجرای اسکرپت ثبت نام در صورتی که اطلاعات با متد پست به صفحه ارسال شده باشند
if($_SERVER['REQUEST_METHOD'] == "POST") {
$username = UnEscape($_POST['username']);
$password = UnEscape($_POST['password']);
$email = mysql_real_escape_string($_POST['email']);


// چک کردن اطلاعات وارد شده توسط کاربر
if(strlen($username) < $min_length) {
$errors[] = "حداقل طول نام کاربری $min_length حرف است";
}
if(strlen($username) > $max_length) {
$errors[] = "حداکثر طول نام کاربری $max_length حرف است";
}
if(strlen($password) < $min_length_pass) {
$errors[] = "حداقل طول کلمه عبور $min_length حرف است";
}
if(strlen($password) > $max_length_pass) {
$errors[] = "حداکثر طول کلمه عبور $max_length حرف است";
}
if($_POST['password'] !== $_POST['retype_pass']) {
$errors[] = "کلمه عبور با تکرار کلمه عبور مطابقت ندارد";
}

if (empty($_POST["email"]))
{$errors[] = "لطفا ایمیل خود را وارد کنید";}
else
{
$email = ($_POST["email"]);
// check if e-mail address syntax is valid
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$errors[] = "لطفا ایمیل خود را بصورت صحیح وارد کنید ";
}
}


// وارد کردن اطلاعات کاربر در صورتی که اطلاعات معتبر باشند
if(empty($errors)) {
// اتصال به سرور
mysql_connect('127.0.0.1', 'root', '') or die(mysql_error());
// اتصال به دیتابیس
mysql_select_db('myDB') or die(mysql_error());

// اسکیپ کردن داده های وارد شده توسط کاربر
$username = mysql_real_escape_string(htmlentities($username, ENT_QUOTES, 'UTF-8'));
$password = mysql_real_escape_string($password);

// به دست آوردن تعداد سطرهایی که نام کاربری مشابه نام کاربری انتخاب شده کاربر دارند
list($count) = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM user WHERE username = '$username';"));

if($count) {
// قطع عملیات در صورتی که نام کاربری وارد شده قبلاً ثبت شده باشد
mysql_close();
$errors[] = "نام کاربری مورد نظر قبلاً ثبت شده است!";
} else {
// ثبت اطلاعات و ریدایرکت کردن کاربر برای جلوگیری از ارسال مجدد اطلاعات در صورت رفرش شدن صفحه
mysql_query("INSERT INTO user SET username = '$username', email='$email', password = (SHA1(MD5($password)));") or die(mysql_error());
mysql_close();

$_SESSION['registeration_completed'] = true;

header("Location: $_SERVER[PHP_SELF]");
exit();
}
}
}


?>

<html>
<head>
</head>

<body>

<form id="form1" name="form1" method="post" action="<?php print $_SERVER['PHP_SELF'] ?>">

<?php
if(!empty($errors)) {
echo "<ul>";
foreach($errors as $error) {
echo "<li>$error</li> \n";
}
echo "</ul>";
} elseif (isset($_SESSION['registeration_completed'])){
echo "<h3>ثبت نام شما با موفقیت انجام شد.</h3>";
unset($_SESSION['registeration_completed']);
}
?>
<p>
<label for="username">نام کاربری : </label>
<input name="username" type="text" id="username" value="<?php echo UnEscape(isset($_POST['username'])); ?>" "maxlength="8" />

<label for="email">ایمیل : </label>
<input type="text" name="email" id="email" />

<label for="password">رمز عبور : </label>
<input type="password" name="password" id="password" />

<label for="retype_pass">تکرار رمز عبور : </label>
<input type="password" name="retype_pass" id="retype_pass" />


<input name="sign-up" type="submit" value="ثبت نام" />

</form>


</body>
</html>

tux-world
شنبه 26 بهمن 1392, 08:55 صبح
سلام دوست عزیز. چرا از یه فریم ورک استفاده نمیکنید که اینقدر ذهنتون رو مشغول نوشتن صحیح کدها نکنید و درگیری ذهنی از بابت.امنیت کارایی پرفرومنس نداشته باشید؟ این فرمی که شما نوشتید ممکنه امنیت بالایی از نظر شما داشته باشه ولی از لحاظ فقط یه درصدی این امر تححق پیدا میکنه چون شما موارد بسیار زیاد دیگه رو ممکنه هیچ وقت بهش پی نبرید که اونها رو لحاظ کنید

weblox
شنبه 26 بهمن 1392, 12:06 عصر
سلام دوست عزیز. چرا از یه فریم ورک استفاده نمیکنید که اینقدر ذهنتون رو مشغول نوشتن صحیح کدها نکنید و درگیری ذهنی از بابت.امنیت کارایی پرفرومنس نداشته باشید؟ این فرمی که شما نوشتید ممکنه امنیت بالایی از نظر شما داشته باشه ولی از لحاظ فقط یه درصدی این امر تححق پیدا میکنه چون شما موارد بسیار زیاد دیگه رو ممکنه هیچ وقت بهش پی نبرید که اونها رو لحاظ کنید

سلام خدمت شما

با این حساب بنظر می رسد استفاده از فریم ورک ها اجناب نا پذریر است. درست است؟
شما چه فریم ورکی را پیشنهاد می کنید؟

godofphp
شنبه 26 بهمن 1392, 12:49 عصر
من که با فریمورکها کار کردم بهترین و سریعترین و ایمن ترین فریمورک به نظر من Yii هست و همچنین فریمورک های زیاد دیکه ای که موجوده و توی همین انجمن وارد تالار PHP بشید فریمورکها رو میتونید ببینید