PDA

View Full Version : سوال در مورد csrf



mamad_za
پنج شنبه 12 فروردین 1395, 16:16 عصر
می دونم خیلی تاپیک در این مورد زده شده اما این سوال در مورد نحوه استفاده از csrf در صفحاتم هست
من صفحاتم رو شبیه master page asp می نیوسم مثلا:


<div class="main">
<?php if ($_GET['main']==register){
include("register.php");
}
</div>



حالا چنتا سوال دارم اینکه من یه session تو صفحه index یا main استارت می کنم ، و تو تمام صفحاتم استفاده می کنم ،
1- اینکه من فقط برای صفحه هایی که نیاز دارم
<?php
session_start();
$token= md5(uniqid());
$_SESSION['delete_customer_token']= $token;
session_write_close();
?>
از این کد استفاده کنم یا اینکه نه تو صفحه index یه بار اینو بزارم و تو هر جایی که می خوام ازش اسفتاده کنم ، می خواستم بدونم مشکلی نداره؟ اگه مشکل داره معایبش چیه؟

Farshid007
جمعه 13 فروردین 1395, 16:10 عصر
من خوب متوجه نشدم
این تیکه کد دومیه تو همه صفحات هست یا فقط تو اندیکس هست؟؟؟

mamad_za
جمعه 13 فروردین 1395, 17:58 عصر
همین دیگه می خوام بدونم تو index یه بار بزارم کافیه یا اینکه تو تمام صفحاتی که علمیاتی دارم انجام می دم باید قرار بدم ؟ این الان واسم مهمه اگه باز هم مبهمه بگید بیشتر توضیح بدم

Farshid007
شنبه 14 فروردین 1395, 05:14 صبح
خب بهتره تو همه ی صفحات چک کنید که اگه ست نشده باشه بزارید
ممکنه ی کاربری مستقیم وارد ی صفحه دیگه بشه اصن وارد صفحه اندیکس نشه :)

mamad_za
شنبه 14 فروردین 1395, 12:09 عصر
متوجه حرف من نشدید انگار نگه کنید صفحه من مثل master page یعنی مثلا شما رو لینک تماس با ما کیلیک می کنید محتویات صفحه tellus.php میاد وسط تگ div من include میشه دیگه من تو هر صفحه تگای html و head ندارم فقط تو ایندکسم دارم , تمام کد هام وارد صفحه index میشه

mamad_za
شنبه 14 فروردین 1395, 13:16 عصر
الان اومدم تو اوون صفحه ای که دارم استفاده می کنمش صداش زدم: اما چنتا مشکل خوردم
اینکه با رفرش صفحه کد session ام عوض میشه و هیچ وقت این دوتا صفحه با هم مطابقت ندارن
$token= hash('sha256',uniqid().time());
$_SESSION['token_form']= $token;
session_write_close();
echo $_SESSION['token_form'];
echo '<br/>'.$_POST['hidtok'];
if(isset($_POST["reg"]) && !empty($_POST["reg"])){
if($_SESSION["captcha"]=== strtolower($_POST["captcha"])){
if($_SESSION['token_form']==$_POST["hidtoken"]){
if(isset($_POST["condition"])){
if(isset($_POST["skb"]) && $_POST["skb"]!="" && strlenutf8($_POST["skb"])<21 && strlenutf8($_POST["skb"])>15 && isDigit($_POST["skb"])){
if(isset($_POST["skm"]) && $_POST["skm"]!="" && strlenutf8($_POST["skm"])<11 && strlenutf8($_POST["skm"])>9 && isDigit($_POST["skm"])){
if(isset($_POST["fname"]) && $_POST["fname"]!="" && strlenutf8($_POST["fname"])<21 && validateform('fa',$_POST["fname"])){
if(isset($_POST["lname"]) && $_POST["lname"]!="" && strlenutf8($_POST["lname"])<31 && validateform('fa',$_POST["fname"])){
if(isset($_POST['ostan']) && $_POST["ostan"]!="" && isDigit($_POST["ostan"]) ){
if(isset($_POST['shahr']) && $_POST["shahr"]!="" && isDigit($_POST["shahr"]) ){
if(strlenutf8($_POST["bakhsh"])<21 ){
if(isset($_POST["address"]) && $_POST["address"]!="" && strlenutf8($_POST["address"])<300 ){
if(isset($_POST["tell1"]) && $_POST["tell1"]!="" && strlenutf8($_POST["tell1"])<12 && strlenutf8($_POST["tell1"])>10 && isDigit($_POST["tell1"])){
if(isset($_POST["tell2"]) && $_POST["tell2"]!=""){
$skb=clearxss($_POST['skb']);
$email=clearxss($_POST['email']);
if(validateuser($skb)==1){
$err="شماره بانکی وارد شده قبلاٌ ثبت شده است." ;
}if(validateemail2($email)==1) {
$err="ایمیل وارد شده قبلاً ثبت شده است." ;
}else{
$skm=clearxss($_POST['skm']);
$pass=hash('sha512',$skm);
$fname=clearxss($_POST['fname']);
$lname=clearxss($_POST['lname']);
$ostan=intval(clearxss($_POST['ostan']));
$shahr=intval(clearxss($_POST['shahr']));
$bakhsh=clearxss($_POST['bakhsh']);
$address=clearxss($_POST['address']);
$tell1=clearxss($_POST['tell1']);
$tell2=clearxss($_POST['tell2']);
$myarr=array('skb'=>$skb,'pass'=>$pass,'skm'=>$skm,'email'=>$email,'fname'=>$fname,'lname'=>$lname,'ostan'=>$ostan,'shahr'=>$shahr,'bakhsh'=>$bakhsh,'address'=>$address,'tell1'=>$tell1,'tell2'=>$tell2);
$r1=insertintoo('user',$myarr);
if($r1){
header("Location: http://localhost/srg/index.php?srg=showresult");
}else{
$err="خطا! لطفاً چند دقیقه صبر نمایید." ;
}
}
}else{$err="قسمت تلفن منزل را تکمیل کنید.";}
}else{$err="قسمت تلفن را تکمیل کرده و طول اعداد وارد شده باید 11 رقم باشد.";}
}else{$err="قسمت آدرس را تکمیل کنید.";}
}else{$err="تعداد حروف وارد شده باید کمتراز 20 حرف باشد.";}
}else{$err="شهر محل زندگی خود را وارد نمایید.";}
}else{$err="استان محل زندگی خود را وارد نمایید.";}
}else{$err="قسمت نام خانوادگی را تکمیل کنید و حروف فارسی وارد نمایید.";}
}else{$err="قسمت نام(اسم کوچک) را تکمیل نمایید و حروف فارسی استفاده نمایید.";}
}else{$err="شماره کارت ملی را تکمیل کنید و طول اعداد وارد شده باید حتما 10 رقم باشد.";}
}else{$err="شماره کارت بانکی باید حداقل 16 رقم و حد اکثر 20 رقم باشد.";}
}else{$err="شرایط و قوانین سایت را مطالعه کنید .";}
}else{//header("Location: http://localhost/srg/specialpage/fake.htm");
}
}else{$err="کد امنیتی وارد شده درست نمی باشد.";}
}

aaaaaaaa1
شنبه 14 فروردین 1395, 20:30 عصر
الان اومدم تو اوون صفحه ای که دارم استفاده می کنمش صداش زدم: اما چنتا مشکل خوردم
اینکه با رفرش صفحه کد session ام عوض میشه و هیچ وقت این دوتا صفحه با هم مطابقت ندارن
$token= hash('sha256',uniqid().time());
$_SESSION['token_form']= $token;
session_write_close();
echo $_SESSION['token_form'];
echo '<br/>'.$_POST['hidtok'];
if(isset($_POST["reg"]) && !empty($_POST["reg"])){
if($_SESSION["captcha"]=== strtolower($_POST["captcha"])){
if($_SESSION['token_form']==$_POST["hidtoken"]){
if(isset($_POST["condition"])){
if(isset($_POST["skb"]) && $_POST["skb"]!="" && strlenutf8($_POST["skb"])<21 && strlenutf8($_POST["skb"])>15 && isDigit($_POST["skb"])){
if(isset($_POST["skm"]) && $_POST["skm"]!="" && strlenutf8($_POST["skm"])<11 && strlenutf8($_POST["skm"])>9 && isDigit($_POST["skm"])){
if(isset($_POST["fname"]) && $_POST["fname"]!="" && strlenutf8($_POST["fname"])<21 && validateform('fa',$_POST["fname"])){
if(isset($_POST["lname"]) && $_POST["lname"]!="" && strlenutf8($_POST["lname"])<31 && validateform('fa',$_POST["fname"])){
if(isset($_POST['ostan']) && $_POST["ostan"]!="" && isDigit($_POST["ostan"]) ){
if(isset($_POST['shahr']) && $_POST["shahr"]!="" && isDigit($_POST["shahr"]) ){
if(strlenutf8($_POST["bakhsh"])<21 ){
if(isset($_POST["address"]) && $_POST["address"]!="" && strlenutf8($_POST["address"])<300 ){
if(isset($_POST["tell1"]) && $_POST["tell1"]!="" && strlenutf8($_POST["tell1"])<12 && strlenutf8($_POST["tell1"])>10 && isDigit($_POST["tell1"])){
if(isset($_POST["tell2"]) && $_POST["tell2"]!=""){
$skb=clearxss($_POST['skb']);
$email=clearxss($_POST['email']);
if(validateuser($skb)==1){
$err="شماره بانکی وارد شده قبلاٌ ثبت شده است." ;
}if(validateemail2($email)==1) {
$err="ایمیل وارد شده قبلاً ثبت شده است." ;
}else{
$skm=clearxss($_POST['skm']);
$pass=hash('sha512',$skm);
$fname=clearxss($_POST['fname']);
$lname=clearxss($_POST['lname']);
$ostan=intval(clearxss($_POST['ostan']));
$shahr=intval(clearxss($_POST['shahr']));
$bakhsh=clearxss($_POST['bakhsh']);
$address=clearxss($_POST['address']);
$tell1=clearxss($_POST['tell1']);
$tell2=clearxss($_POST['tell2']);
$myarr=array('skb'=>$skb,'pass'=>$pass,'skm'=>$skm,'email'=>$email,'fname'=>$fname,'lname'=>$lname,'ostan'=>$ostan,'shahr'=>$shahr,'bakhsh'=>$bakhsh,'address'=>$address,'tell1'=>$tell1,'tell2'=>$tell2);
$r1=insertintoo('user',$myarr);
if($r1){
header("Location: http://localhost/srg/index.php?srg=showresult");
}else{
$err="خطا! لطفاً چند دقیقه صبر نمایید." ;
}
}
}else{$err="قسمت تلفن منزل را تکمیل کنید.";}
}else{$err="قسمت تلفن را تکمیل کرده و طول اعداد وارد شده باید 11 رقم باشد.";}
}else{$err="قسمت آدرس را تکمیل کنید.";}
}else{$err="تعداد حروف وارد شده باید کمتراز 20 حرف باشد.";}
}else{$err="شهر محل زندگی خود را وارد نمایید.";}
}else{$err="استان محل زندگی خود را وارد نمایید.";}
}else{$err="قسمت نام خانوادگی را تکمیل کنید و حروف فارسی وارد نمایید.";}
}else{$err="قسمت نام(اسم کوچک) را تکمیل نمایید و حروف فارسی استفاده نمایید.";}
}else{$err="شماره کارت ملی را تکمیل کنید و طول اعداد وارد شده باید حتما 10 رقم باشد.";}
}else{$err="شماره کارت بانکی باید حداقل 16 رقم و حد اکثر 20 رقم باشد.";}
}else{$err="شرایط و قوانین سایت را مطالعه کنید .";}
}else{//header("Location: http://localhost/srg/specialpage/fake.htm");
}
}else{$err="کد امنیتی وارد شده درست نمی باشد.";}
}
دوست عزیز اگر از توابع اینکلود استفاده میکنید لازم نیست چندین بار سیشن استارت بکار ببرید دقت کنید اگر در صفحات جدا گانه از سیشن استارت استفاده کنید برنامه شما دچار اشکال میشود . یعنی سیشن عا به خوبی عمل نمیکنند و فقط در صفحاتی که استارت شده است عمل خواهد کرد.
مورد بعدی سعی کنید برای سهولت کار یک فایل هدر و یک فال فوتر قرار بدید .و از ایندکس انها را فراخانی کنید.
خب راجب سیشن فقط کافیست قبل کد های اچ تی ام ال فقط در صفحه ایندکس انها را فراخانی کنید. دقت کنید اگر بعد از اچ تی ام ال باشد ممکن است خطا بوجود اورد.
در ضمن کد های شما خیلی بهم ریخته است بجای این همه ایف و الس از کیس ها استفاده کنید.
امیدوارم کمک کرده باشم.
موفق باشید.

mamad_za
یک شنبه 15 فروردین 1395, 12:04 عصر
همینطوری که میگید استفاده کرده بودم و فقط تو صفحه index از session استفاده کردم. مشکل استفاده از csrf هم یه جورایی حل شد امیدوارم درست استفاده کرده باشم ،

این کدی که الان میبینید رو چطور میشه مرتبط تر نوشت و از case ها استفاده کرد؟ اگه راهنمایی کنید که ممنون میشم ،
خودم دارم جدیدآً کدایی که نوشتم رو می برم از function ها به کلاس تبدیل می کنم ، که اینقدر کد نویسی تو صفحهات سایتم نداشته باشم.

id1385
جمعه 20 فروردین 1395, 16:45 عصر
یا ابالفضل!!!
دوست عزیز اگه یه جا به مشکل بخوری دیگه پیدا کردن مشکل خیلی سخت میشه

شما باید همونطور که در کلمه csrf نیز موجود است r ابتدای کلمه request هستش، پس شما باید موقعی که ریکوئست رو دریافت میکنید اینکار رو انجام بدید یعنی اگر این مورد رو بصورت آپشنال بکنید در صورتی که فعال باشد در غیر اینصورت بایدبا دریافت هر ریکوئست این کار را انجام بدید.

در مورد ساختارتون هم بهتره یه کم (جسارتاً) تمریناتتون رو بیشتر کنید تا خوانایی کدتون و استاندارد بودنش بالا بره
مثلاً در کد بالا تکراری بودن ایمیل وسطهای ولیدیشنهای شماست، یعنی یه سری ولیدیشنها رو انجام میدید بعد یهو میگید ایمیل تکراریه یا موارد دیگه

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

مثلاً در همین مورد من برای یه سایتی (البته سایتش بر بیس وردپرس بود ) اینطوری کار کردم

برای ایجادش :

// start security
Security::init()->generateToken();



اینم کلاس سکوریتی:

/**
* generate security token
*/
public function generateToken()
{
if ($this->isAjax()) return;
$this->Encryption->splitter = '-';
$this->Encryption->min_char = 7;
$this->Encryption->max_char = 9;
$key = $this->Encryption->generate_rnd(35);
$this->token = $this->Encryption->protect($key);
$salt = $this->Encryption->getSalt();


// add sessions
$_SESSION[ $this->session_name ] = array(
'salt' => $salt,
'key' => $key,
);
}


حالا توی هد یه تریگری رو که خود وردپرس اجر میکنه رو هوکشو نوشتم که یه متا دیتا بهش اضافه کنه:

/**
* add meta tags on page header
*/
public function addMeta()
{
echo "<meta name=\"{$this->meta_name}-param\" content=\"_{$this->meta_name}\">";
echo "<meta name=\"csrf-token\" content=\"{$this->token}\">";
}



حالا به ازای هر ریکوئستی که انجام میشه اول می بینم که این ریکوئست قابل انجام هست یا خیر:

/**
* check and validate token
* @param $token
* @return bool
*/
public function isValidToken($token)
{
$token = sanitize_file_name($token);
$session = (isset($_SESSION[ $this->session_name ]) ? $_SESSION[ $this->session_name ] : array());
$key = (isset($session['key']) ? $session['key'] : NULL);
$salt = (isset($session['salt']) ? $session['salt'] : NULL);
return $this->Encryption->isValid($key, $token, $salt);
}


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


139946

موفق باشید

id1385
جمعه 20 فروردین 1395, 17:13 عصر
در مورد اینکه گفتین چطوری مرتب سازی کنم
باید به شما عرض کنم که این مورد نه به مدرک و نه به تحصیل آکادمیک و نه به چیز دیگری نیاز دارد و فقط به مرور زمان و با تمرین و تکرار کسب می شود.

مثلاً من نمیام بگم

if(isset($_get['X'])) {echo 'ok';} else{echo 'error';}


بلکه می نویسم :

echo get_input('X', false) ? 'ok' : 'error';


حالا برای این get_input یه فانکشن می نویسم

function get_input($name, $default = NULL, $all = FALSE)
{
$request = Yii::$app->request;
$get = $request->get($name);
$post = $request->post($name);


if (TRUE === $all) array_merge($get, $post);


if (isset($get)) return $get;
if (isset($post)) return $post;
return $default;
}



یا برای اینکه چک کنم آیا المنتی توی آرایه وجود داره
اینطوری می نویسم :


$meeting_date = extract_array('date', $meeting_details, 0);


و فانکشنش رو اینطوری می نویسم

function extract_array($key, array $array, $default = NULL, $strict = TRUE)
{
if (!is_array($array)) {
return $default;
}


if ($strict) {
return (isset($array[ $key ])) ? $array[ $key ] : $default;
} else {
return (isset($array[ $key ]) && !empty($array[ $key ])) ? $array[ $key ] : $default;




البته بازم اینا قابلیت اینو دارن که حرفه ای تر و بهتر نوشته بشن و پرفرمنس نیز در نظر گرفته بشه

موفق باشید

mamad_za
شنبه 21 فروردین 1395, 05:17 صبح
مرسی دوتس عزیز اینایی که گفته خوب به مرور زمان بدست میاد. منم تو هر پروژم سعی می کنم نسبت به پروژه قبلی خیلی از موارد رو بهتر و اصولی ترش کنم که الانم خیلی از کدام رو به صورت کلاس نوشتم ولی خوب خیلی کار دارم ، چون هنوز تازه کارم و راه زیاده واسه یاد گیری و بهتر شدن ،
ممنونم که پاسخ دادی تشکر

mamad_za
شنبه 21 فروردین 1395, 05:28 صبح
البته اینم بگم که من فرمم رو با Ajax و jquery دارم validate می کنم مثلاً در مورد ایمیل به محض وارد کردن ایمیل همونجا بهش نشون داده میشه که این ایمیل وجود داره یا نه

id1385
شنبه 21 فروردین 1395, 17:08 عصر
البته اینم بگم که من فرمم رو با Ajax و jquery دارم validate می کنم مثلاً در مورد ایمیل به محض وارد کردن ایمیل همونجا بهش نشون داده میشه که این ایمیل وجود داره یا نه

هیچ موقع به کاربر اعتماد نکنید و در هر دو سمت ولیدیشن رو انجام بدید، حتماً کاربر اون چیزی که شما گفتین رو وارد نمیکنه و حتماً هم از بروزر استفاده نمیکنه!

aaaaaaaa1
شنبه 21 فروردین 1395, 19:52 عصر
در مورد اینکه گفتین چطوری مرتب سازی کنم
باید به شما عرض کنم که این مورد نه به مدرک و نه به تحصیل آکادمیک و نه به چیز دیگری نیاز دارد و فقط به مرور زمان و با تمرین و تکرار کسب می شود.

مثلاً من نمیام بگم

if(isset($_get['X'])) {echo 'ok';} else{echo 'error';}


بلکه می نویسم :

echo get_input('X', false) ? 'ok' : 'error';


حالا برای این get_input یه فانکشن می نویسم

function get_input($name, $default = NULL, $all = FALSE)
{
$request = Yii::$app->request;
$get = $request->get($name);
$post = $request->post($name);


if (TRUE === $all) array_merge($get, $post);


if (isset($get)) return $get;
if (isset($post)) return $post;
return $default;
}



یا برای اینکه چک کنم آیا المنتی توی آرایه وجود داره
اینطوری می نویسم :


$meeting_date = extract_array('date', $meeting_details, 0);


و فانکشنش رو اینطوری می نویسم

function extract_array($key, array $array, $default = NULL, $strict = TRUE)
{
if (!is_array($array)) {
return $default;
}


if ($strict) {
return (isset($array[ $key ])) ? $array[ $key ] : $default;
} else {
return (isset($array[ $key ]) && !empty($array[ $key ])) ? $array[ $key ] : $default;




البته بازم اینا قابلیت اینو دارن که حرفه ای تر و بهتر نوشته بشن و پرفرمنس نیز در نظر گرفته بشه

موفق باشید

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

aaaaaaaa1
شنبه 21 فروردین 1395, 19:55 عصر
از این آدرس برای فیلتر کردن ورودی ها استفاده کنید..
http://www.w3schools.com/php/php_ref_filter.asp