PDA

View Full Version : امنیت داده های ورودی



tux-world
شنبه 23 بهمن 1389, 12:08 عصر
سلام.
من یه فرم طراحی کردم.می خوام فرم تشخیص بده که نام کاربری یا حالا هر چی که وارد میکنه تشخیص بده که کدهای جاوا - html - php و اینها هست یا نه . اگه بود که شرط بذارم و اجازه ندم
کار این دوتا تابع رو جسته گریخته گفتن ولی متوجه نشدم منظورشون چیه؟
mysql_real_escape_string و htmlentities()
تابع htmlentities برای این دستور :
echo htmlentities('<p>salam</p>'); هیج نفاوتی قايل نمیشه یا این دستور :
echo htmlentities('<script>alert("a")</script>');

eshpilen
شنبه 23 بهمن 1389, 12:17 عصر
توی سورس صفحه نگاه کنی تفاوتش مشخص میشه، اما موقع رندر شدن تفاوتی دیده نمیشه.

tem988
شنبه 23 بهمن 1389, 12:35 عصر
سلام برای اینکه برای نام کاربری از html php و ... استفاده نکنه و عدد و حروف و حروف مجاز باشه باید از function زیر استفاده کنی




function CheckUsername(){
if (!document.getElementById('username').value.match (/^([A-Za-z0-9_\-\.])/)) {
alert("نام کاربری خود را صحیح وارد کنید");
return false;
}
else return true;
}

اینو باید برای فرمت فراخوانی کنی

اینم برای php




<?php
$username = strip_tags($_POST['username']);//Bardashtan Html Az Input Username
if (preg_match('/^([a-zA-Z0-9])(([-a-zA-Z0-9_])*([a-zA-Z0-9]))*$/i',$username)!=1){//Chek kardan Harfhaye KHeyr Mojaz Baraye Username
echo "نام کاربری را صحیح وارد کنید";
}else echo "OK";//ersal Query Bara Register
?>

tux-world
شنبه 23 بهمن 1389, 12:44 عصر
این کدی که نوشتید جاوا هستش چطوری از فرم بهش بفرستم و اینکه گفتید تو رندر مشخص نمیشه پس چطوری ازش استفاده بکنم؟ بدونم که درست عمل میکنه یا نه ؟

tem988
شنبه 23 بهمن 1389, 12:58 عصر
یک مثال کامل برات میزنم



<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">
function CheckUsername(){
if (!document.getElementById('username').value.match (/^([A-Za-z0-9_\-\.])/)) {
alert("نام کاربری خود را صحیح وارد کنید");
return false;
}
else return true;
}
</script>
</head>
<body>
<?php
$username = strip_tags($_POST['username']);//Bardashtan Html Az Input Username
if($_POST['subreg']){
//Chek kardan Harfhaye KHeyr Mojaz Baraye Username
if (preg_match('/^([a-zA-Z0-9])(([-a-zA-Z0-9_])*([a-zA-Z0-9]))*$/i',$username)!=1){
echo "نام کاربری را صحیح وارد کنید";
}else echo "OK";//ersal Query Bara Register
}
?>
<form name="frmnblog" method="post" action="" onsubmit="return CheckUsername(this)" >
<input type="text" value="" name="username" id="username" />
<input type="submit" name="subreg" value="Register" />
</form>
</body>
</html>

tux-world
شنبه 23 بهمن 1389, 13:42 عصر
ممنون اینطوری که فهمیدم شما تابع چک کردن رو هم با جاوا و هم با پی اچ پی نوشتین درسته ؟
این فایلی که نوشتم از نظر امنیتی چقدر افتضاحه ؟


<script type="text/javascript">
<!--
function delayer(){
window.location = "index.php"
}
//-->
</script>

<?php include('./load_header.php'); ?>
<div class="background">
<div class="wrapper">
<div class="page_border_box">
<?php
include ('./menu.php');
include ('./detect_b_o.php');
require_once('database.php');
if ( isset ($_POST['name']) && $_POST['password'] =='')
echo"
<div class=\"break_login\" >
<div align=\"center\" class=\"login_register_text\" ><span id=\"register_text\" class=\"font_yekan\">..:: بررسی صحت ورود اطلاعات ::..</span>
<span id=\"wellcome\"></span><hr></hr>
<div id=\"loginWindow\">
<span>لطفا در پر کردن فرم ورود به سایت دقت نمایید.<br />مجددا سعی نمایید.</span>
<form action=\"login.php\" method=\"post\" >
<input class=\"button_red\" style=\"width:90%;margin-top:15px;margin-right:8px\" type=\"submit\" id=\"login_btn\" value=\"ورود سریع جهت سعی مجدد\" />
</form>
</div>
</div>
</div>";
else
if ( isset ($_POST['name']) && $_POST['password'] !='')
{
if( !validate_email($_POST['name']))
echo'
<div class="break_login" >
<div align="center" class="login_register_text" ><span id="register_text" class="font_yekan">..:: بررسی صحت ورود اطلاعات ::..</span>
<span id="wellcome"></span><hr></hr>
<div id="loginWindow">
<span>لطفا آدرس ایمیل را درست وارد نمایید.<br />مجددا سعی نمایید.</span>
<form action="login.php" method="post" >
<input class="button_red" style="width:90%;margin-top:15px;margin-right:8px" type="submit" id="login_btn" value="ورود سریع جهت سعی مجدد" />
</form>
</div>
</div>
</div>';
else
{
$passwd=md5($_POST['password']);
$nm=md5($_POST['name']);
$sql = "SELECT * FROM `member` WHERE `username` ='".$nm."' AND `password`='".$passwd."'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$order= $row['order'] ;
if($result)
{
$count = mysql_num_rows($result);
if($count == 1)
{
echo"
<body onLoad=\"setTimeout('delayer()', 14000)\">
<div class=\"success_login\" >
<div align=\"center\" class=\"login_register_text\" ><span id=\"register_text\" class=\"font_yekan\">..:: ورود موفقیت آمیز به سایت ::..</span>
<span id=\"wellcome\"></span><hr></hr>
<div id=\"loginWindow\">
<span>ورود شما را به سایت تبریک می‌گوییم.<br />تا چند ثانیه دیگر به صورت اتومات وارد سایت خواهید شد.</span>
<form action=\"index.php\" method=\"post\" >
<input class=\"button_red\" style=\"width:90%;margin-top:15px;margin-right:8px\" type=\"submit\" id=\"login_btn\" value=\"ورود سریع به سیستم\" />
</form>
</div>
</div>
</div>
</body>";
$client = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['SERVER_NAME']);
$_SESSION['client'] = $client;
$_SESSION['login']=1;
$_SESSION['username']=md5($_POST['name']);
$_SESSION['order']=$order;
}
else
{
echo"
<div class=\"break_login\" >
<div align=\"center\" class=\"login_register_text\" ><span id=\"register_text\" class=\"font_yekan\">..:: عدم ورود موفقیت آمیز به سایت ::..</span>
<span id=\"wellcome\"></span><hr></hr>
<div id=\"loginWindow\">
<span>متاسفانه آدرس ایمیل/رمز عبور شناخته شده نیست<br />لطفا برای عبور مجددا سعی نمایید.</span>
<form action=\"login.php\" method=\"post\" >
<input class=\"button_red\" style=\"width:90%;margin-top:15px;margin-right:8px\" type=\"submit\" id=\"login_btn\" value=\"ورود سریع جهت سعی مجدد\" />
</form>
</div>
</div>
</div>";
}

}
}
}
else
echo'
<div class="break_login" >
<div align="center" class="login_register_text" ><span id="register_text" class="font_yekan">..:: بررسی صحت ورود به فرم اطلاعات ارسالی ::..</span>
<span id="wellcome"></span><hr></hr>
<div id="loginWindow">
<span>دسترسی به سایت فقط از آدرس‌ اینترنتی صحیح مجاز می‌باشد </span>
<form action="index.php" method="post" >
<input class="button_red" style="width:90%;margin-top:15px;margin-right:8px" type="submit" id="login_btn" value="ورود سریع جهت سعی مجدد" />
</form>
</div>
</div>
</div>';

include('./footer.php'); ?>
</div>
</div>
</div>


<?php
function validate_email($email) {
if( eregi("^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.[A-Za-z]{2,4})$", $email) ) {
return true; // Valid
} else {
return false; // Invalid
}
}

// Example
?>

eshpilen
شنبه 23 بهمن 1389, 14:04 عصر
راستی شاید خیلی افراد فکر کنن اینکه در نام کاربری یا پسورد و غیره کاراکترهای خاصی باشن مثل علامتهای تگ و حتی کد جاواسکریپت و کوتیشن و غیره، به خودی خودش خطرناک هست و خطرناکه که اینطور چیزا رو در دیتابیس درج کنیم. اما درواقع این تا وقتی که هروقت که میخوایم داده ها رو در کوئری بکار ببریم یا در صفحهء HTML نمایش بدیم و غیره، حواسمون باشه و از توابع Escape مناسب استفاده کنیم، هیچ خطری نداره تاجایی که میدونم. بخاطر همین بنده بطور مثال در سیستم رجیستر و لاگین خودم به کاربر اجازه دادم عملا هرچیزی رو بعنوان نام کاربردی و پسورد خودش انتخاب بکنه. بطور مثال <script>alert('hello world!')</script> میتونه نام کاربری یا پسورد طرف باشه. اما بهرحال خیلی افراد فکر میکنن به چنین انعطافی نیاز نیست. بهرحال این روش کار رو مقداری شاید پیچیده تر کنه و شاید گاهی بر اثر سهل انگاری و فراموشی ریسک بیشتری داشته باشه. اما میخواستم بگم به خودی خودش هیچ کدی خطرناک نیست؛ چون همه چیز ورودی متنی کاربر هست و متن هم میتونه هرچیزی باشه و بعضی جاها اصلا نیاز هست از طرف کاربر کدهایی رو دریافت بکنیم. فرض کنید مثلا یک کد مثال برنامه نویسی وب که بعدش در دیتابیس ذخیره میکنیم و هروقت لازم بود نمایش میدیم. دقیقا مثل همین فروم که شما هروقت بخواید میتونید هرکدی رو ارسال کنید و ذخیره و به کاربران دیگر نمایش داده میشه. یعنی دریافت و ذخیره و نمایش این داده ها به خودی خودشون هیچ خطری ندارن.
بنظر بنده توی یه چیزایی مثل پسورد اگر امکان چنین انعطافی رو بدیم ممکنه مفید باشه. چون انتخاب پسورد قوی و مناسب برای بخاطر سپردن، با محدودیت هایی که میذارن کار مشکلی هست. جالب اینکه خیلی وقتها روی طول پسورد هم محدودیت قابل توجهی هست. مثلا میگن حداقل ۶ کاراکتر، ولی حداکثر طول هم مثلا ۳۰ کاراکتر گذاشتن که اصلا درست نیست. مثلا وقتی بخوایم از PassPhrase استفاده بکنیم با این طول به مشکل میخوریم.

tux-world
شنبه 23 بهمن 1389, 14:38 عصر
ممنون از اطلاعات با ارزشی که ارائه کردین . حالا تو این کدی که گذاشتم فکرمیکنین کجاهاش مشکل داره ؟

eshpilen
شنبه 23 بهمن 1389, 19:34 عصر
$client = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['SERVER_NAME']);
این واسه چیه؟ :متفکر:

tux-world
یک شنبه 24 بهمن 1389, 00:20 صبح
این رو نوشتم تا بدونم آدرس و بقیه مواردی که در حین ارجاعاتی که به فایلهای دیگه میشه درسته یا نه

رضا قربانی
یک شنبه 24 بهمن 1389, 09:44 صبح
این رو نوشتم تا بدونم آدرس و بقیه مواردی که در حین ارجاعاتی که به فایلهای دیگه میشه درسته یا نه
من فکر می کنم برای دریافت آی پی باشه و یه سری اطلاعات دیگه

eshpilen
یک شنبه 24 بهمن 1389, 12:49 عصر
این رو نوشتم تا بدونم آدرس و بقیه مواردی که در حین ارجاعاتی که به فایلهای دیگه میشه درسته یا نه
خب ولی استفاده از $_SERVER['SERVER_NAME'] دیگه واسه چی؟

tux-world
یک شنبه 24 بهمن 1389, 13:31 عصر
اونو بر میدارم. مشکلات دیگه چی داره اسکریپتم

eshpilen
یک شنبه 24 بهمن 1389, 13:56 عصر
والا دقیق که بررسی نکردم و اشکال خاصی هم به چشمم نیامد. ظاهرا شما از تابع md5 برای بیشتر کارها استفاده کردی. مثل اینکه خیلی دوستش داری :لبخند:

eshpilen
یک شنبه 24 بهمن 1389, 14:40 عصر
البته این صفحه ای که شما گذاشتی فقط یک قطعه کد بحساب میاد درمقابل کل یه برنامه و سایت کامل. بنابراین تحلیل امنیتی اون فقط دربارهء کدهایی هست که دیده میشه. مثلا شما صفحات دیگری رو اینکلود کردی، ممکنه در اونها کارهایی انجام بشه و کدهایی باشه که حفره ای داشته باشن. یا مثلا بخش ثبت نام کاربر چی؟ من اصلا نمیدونم شما چی میخواستی و انگار خودت کار رو بلدی. بهرحال چیز زیادی با همین کد محدود نمیشه گفت. چون همهء عملیات و امکانات و بنابراین نکات و روشهای امنیتی که در همین چند خط کد نیست.

montazer12
دوشنبه 25 بهمن 1389, 01:04 صبح
یک مثال کامل برات میزنم



<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">
function CheckUsername(){
if (!document.getElementById('username').value.match (/^([A-Za-z0-9_\-\.])/)) {
alert("نام کاربری خود را صحیح وارد کنید");
return false;
}
else return true;
}
</script>
</head>
<body>
<?php
$username = strip_tags($_POST['username']);//Bardashtan Html Az Input Username
if($_POST['subreg']){
//Chek kardan Harfhaye KHeyr Mojaz Baraye Username
if (preg_match('/^([a-zA-Z0-9])(([-a-zA-Z0-9_])*([a-zA-Z0-9]))*$/i',$username)!=1){
echo "نام کاربری را صحیح وارد کنید";
}else echo "OK";//ersal Query Bara Register
}
?>
<form name="frmnblog" method="post" action="" onsubmit="return CheckUsername(this)" >
<input type="text" value="" name="username" id="username" />
<input type="submit" name="subreg" value="Register" />
</form>
</body>
</html>



سلام
1-میشه در مورد پارامتر های تابع match در جاوا اسکریپت و تابع preg_match در php توضیح بدین که دقیقا چه کار میکنن؟
2-چرا همه توابع را در جاوااسکریپت قرار نمیدید؟ تابع معادل preg_match در جاوااسکریپت نیست که در جاوا فراخوانی بشه؟

eshpilen
دوشنبه 25 بهمن 1389, 09:11 صبح
چرا همه توابع را در جاوااسکریپت قرار نمیدید؟ تابع معادل preg_match در جاوااسکریپت نیست که در جاوا فراخوانی بشه؟
چون جاوااسكريپت روي سيستم كلاينت/كاربر اجرا ميشه، به صحت و وجود اون نميشه اطمينان داشت. جاوااسكريپت ميتونه توسط كاربر غيرفعال بشه و يك هكر ميتونه با نرم افزارهاي مخصوص هك هرچيزي رو به سرور شما ارسال كنه. بنابراين شما حتما بايد در سمت سرور همه چيز رو چك كنيد. چك كردن در سمت كاربر هم بايد باشه بخاطر اينكه باعث مزايايي مثل راحتي كاربر و سرعت بيشتر كل عمليات و مصرف كمتر پنهاي باند ميشه.

tux-world
سه شنبه 26 بهمن 1389, 02:11 صبح
من وقتی از isset استفاده میکنم تو هر دو حالتیکه شرط برقرار باشه یا نه اجرا میشه جریان چیه ؟

if (isset($_POST['name'])
echo'yes';
else
echo'no';
_________________________

if (! isset($_POST['name'])
echo'yes';
else
echo'no';
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــ

if ( isset ($_POST['name']) && $_POST['password'] !='')

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

رضا قربانی
سه شنبه 26 بهمن 1389, 09:07 صبح
من وقتی از isset استفاده میکنم تو هر دو حالتیکه شرط برقرار باشه یا نه اجرا میشه جریان چیه ؟

if (isset($_POST['name'])
echo'yes';
else
echo'no';
_________________________

if (! isset($_POST['name'])
echo'yes';
else
echo'no';
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــ

if ( isset ($_POST['name']) && $_POST['password'] !='')

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

دوست من این اصلا اشتباه هست

شما اون else رو که برای اولین if گذاشتید همون خودش کفایت می کنه ( اون else یعنی اگر isset نبود دستورات اجرا بشه ) پس دیگه نیازی نیست دو تا شرط بذارید

MMSHFE
سه شنبه 26 بهمن 1389, 11:16 صبح
با سلام، دوست گرامي بايد دقت كنيد كه وقتي روي دكمه Submit كليك ميكنيد، اطلاعات واردشده براي صفحه مقصد ارسال ميشن و حتي فيلدهاي خالي هم بصورت يك رشته خالي ارسال خواهند شد. بنابراين در چنين شرايطي، اگه فقط از isset استفاده كنيد، مقدار true خواهد داشت (مقداردهي شده). isset به تنهايي فقط وقتي بكار ميره كه صفحه مقصد فرم، همون فايل فرم باشه و بخواين تعريف كنيد كه اگه اولين باره كه صفحه نمايش داده ميشه، فرم ظاهر بشه و در دفعات بعد فرم نياد! بهتره شرط رو اينطوري بنويسيد:


if(isset($_POST['name']) && $_POST['name']!='')
{
//statements
}

موفق و مؤيد باشيد.

tux-world
سه شنبه 26 بهمن 1389, 17:04 عصر
باز هم سپاسگذارم. چند تا مورد دیگه هم هستن
مثلا چطوری تو هر باری که به یه صفحه ارجاع داده میشه بفهمیم که کاربر چه هکر یا غیر اون چیز چرت و پرتی از جمله جاوا سوار سرور نمیکنه؟ منظورم آدرس صفحات سایتی هستش که طراحی کردیم. مثلا باگها xss و اینکه چطوری میشه یه inputرو محدود به کاراکترهای خاصی کرد. از a-A , A-Z و حروف الفبای فارسی فقط بتونه تایپ کنه و با اینکار بتونیم از ورود کاراکترهای تگ جلو گیری کنیم ؟

MMSHFE
چهارشنبه 27 بهمن 1389, 08:53 صبح
با سلام، راستشو بخواين من معمولاً سمت كلاينت كاربر رو محدود نميكنم چون به نظرم يك مقدار اذيت ميشه! البته توي قوانين سايت بهش اعلام ميكنم كه چه كاركترهايي غيرمجاز هستن و تأييد نخواهند شد. بعد سمت سرور يك تابع مينويسم كه يك رشته ميگيره و كاركترهاي غيرمجاز مثل < و > و / و... رو حذف ميكنه و رشته باقيمانده رو برميگردونه و نهايتاً رشته خروجي اين تابع رو ثبت ميكنم. اينطوري ميتونم توابع مختلفي هم بنويسم كه هر كدوم محدوديتهاي خاصي اعمال ميكنن. مثلاً يكي فقط حروف فارسي رو تأييد ميكنه، يكي فقط اعداد و الي آخر.
موفق و مؤيد باشيد.

montazer12
چهارشنبه 27 بهمن 1389, 10:07 صبح
با سلام، راستشو بخواين من معمولاً سمت كلاينت كاربر رو محدود نميكنم چون به نظرم يك مقدار اذيت ميشه! البته توي قوانين سايت بهش اعلام ميكنم كه چه كاركترهايي غيرمجاز هستن و تأييد نخواهند شد. بعد سمت سرور يك تابع مينويسم كه يك رشته ميگيره و كاركترهاي غيرمجاز مثل < و > و / و... رو حذف ميكنه و رشته باقيمانده رو برميگردونه و نهايتاً رشته خروجي اين تابع رو ثبت ميكنم. اينطوري ميتونم توابع مختلفي هم بنويسم كه هر كدوم محدوديتهاي خاصي اعمال ميكنن. مثلاً يكي فقط حروف فارسي رو تأييد ميكنه، يكي فقط اعداد و الي آخر.
موفق و مؤيد باشيد.

با تشکر.
میشه لطف کنید یه مثال کامل که حداکثر موارد امنیتی را رعایت کرده اینجا بذارید که هم شامل فیلدهای عددی و هم کاراکتری در فرم باشد؟

tux-world
جمعه 29 بهمن 1389, 23:01 عصر
من هم ممنون میشم طوری که بشه هرگونه چیز میز اضافه که منجر به تداخل و یا حداقل برداشتن راههای نفوذ رو بشه برداشت

MMSHFE
شنبه 30 بهمن 1389, 09:17 صبح
با سلام، به روي چشم، دارم يك نمونه كد آماده ميكنم كه حتي الأمكان شئ گرا باشه و بتونيد با استفاده از كلاس مربوطه، عمليات مختلف مثل چك كردن آدرس فرستنده فرم (يعني در صفحه مقصد چك كنيد كه صفحه فرستنده اطلاعات، همون فرم خودتون باشه نه فرمي كه توي سايت ديگه ايجاد شده باشه و به صفحه سايت شما اطلاعات رو ارسال كنه) و محدودكردن كاركترهاي مجاز و... رو انجام بدين.
موفق و مؤيد باشيد.