PDA

View Full Version : ازسال مقادیر با پارا متر ها



boysilent
پنج شنبه 01 تیر 1391, 08:57 صبح
با سلام من asp کار میکردم و مقادیر رو اینگونه میفرستادم برای امنیت بیشتر
command.parametr.addwithvalue("@ali",txt.text)
حالا میخواستم ببینم در php این امر چطوری امکان پذیره
ممنون میشم یه مثال ساده بزنید..

lady64
پنج شنبه 01 تیر 1391, 09:05 صبح
درسته . در asp از روش ارسال با پارامتر استفاده میشه تا داده بصورت خام وارد دیتابیس نشه .
در php هم باید کاری کنیم که این اتفاق نیفته. یعنی داده قبل از ذخیره در دیتابیس ایزوله بشه. بعنوان نمونه این تاپیک رو ببینید :
http://barnamenevis.org/showthread.php?343022-یک-نکته-مهم-درمورد-SQL-Injection-و-mysql_real_escape_string&highlight=%D8%A7%D9%85%D9%86%DB%8C%D8%AA+%D8%AF%D8 %A7%D8%AF%D9%87+%D9%88%D8%B1%D9%88%D8%AF%DB%8C
و این :
http://barnamenevis.org/showthread.php?343754-سئوالی-در-مورد-امنیت-داده-ها&highlight=%D8%A7%D9%85%D9%86%DB%8C%D8%AA+%D8%AF%D8 %A7%D8%AF%D9%87+%D9%88%D8%B1%D9%88%D8%AF%DB%8C

boysilent
پنج شنبه 01 تیر 1391, 09:40 صبح
من که چیزی متوجه نشدم
اگر میشه اساتید یه مثالی هم بزنید با تشکر(برای درج)

lady64
پنج شنبه 01 تیر 1391, 11:21 صبح
آقای شهرکی تو یکی از پست ها این مثال رو زدند :

مثلاً اگه قراره یک فیلد id رو بصورت عددی از Get دریافت کنید، این بررسی ها رو روی اون انجام بدین:


$id = isset($_GET['id') && is_numeric($_GET['id']) ? (int) $_GET['id'] : 0;

و توی کدتون از id$ استفاده کنید یا مثلاً اگه قراره نام کاربری رو دریافت کنید و توی کوئریهای دیتابیس از اون استفاده کنید، این بررسی نسبتاً مناسبه:



$user = isset($_GET['user'] ? mysql_real_escape_string($_GET['user']) : '';

تابع is_numric چک میکنه که داده ی ورودی عدد باشه .
تابع mysql_real_escape_string
کاراکتر هاي ويژه را در يک رشته براي استفاده از پايگاه داده بهينه ميکند و در اين عمل از تنظيمات کاراکتري موجود در پايگاه داده استفاده مي کند.
برای مطالعه ی بیشتر در مورد mysql_real_escape_strin
http://barnamenevis.org/showthread.php?336721-mysql_real_scape_string-کاربردش-چیه-؟&p=1485508#post1485508
این تاپیک رو هم ببینید:
http://barnamenevis.org/showthread.php?329684-شرح-یک-تابع&p=1450890#post1450890
کلا شما باید مطالبی مربوط به sql_injection رو مطالعه کنید.
چون در این مورد خیلی دوستان و اساتید صحبت کردند من به معرفی تاپیک ها اکتفا کردم.
تاپیک های دیگه هم که قبلا معرفی کردم ، در همین راستا هست ، ولی این بحث رو گسترده تر بیان کردند.

Yousha
پنج شنبه 01 تیر 1391, 12:02 عصر
lady64 حوزه (int) با حوزه is_numeric متفاوته
int تا 9 رقم + و - میگیره
ولی is_numeric همه نوع عدد با طول بسیار زیاد میگیره - حتی '12345' رو هم عدد می دونه

boysilent
پنج شنبه 01 تیر 1391, 13:12 عصر
من برای مقابله با SQL INJECTION گفتم دوستان رفتن سر از کجاها دراوردن
مثلا

INSERT INTO TABLE (NAME)VALUES('{NAME}')

ایا این روش باعث میشه از اینجکشن جلوگیری کرد یا نه اگه نمیشه یه توضیح کوچیک بدید ممنـــــــــــــــــــون

lady64
پنج شنبه 01 تیر 1391, 13:32 عصر
lady64 حوزه (int) با حوزه is_numeric متفاوته
int تا 9 رقم + و - میگیره
ولی is_numeric همه نوع عدد با طول بسیار زیاد میگیره - حتی '12345' رو هم عدد می دونه

' رو برای تاکید بر طول عدد گذاشتید یا میفرمائید که '12345' رو عدد میدونه ؟ اینکه 12345 یا هر عدد با طول زیاد رو عدد میدونه که درسته ولی اینکه '12345' رو که بصورت رشته ای وارد شده ، عدد بدونه ، اینطور نیست.

Yousha
پنج شنبه 01 تیر 1391, 15:22 عصر
خیر. خود رشته '12345' منظورمه
چرا هست. امتحان کنید:

echo (bool)is_numeric('12345');

lady64
پنج شنبه 01 تیر 1391, 16:17 عصر
امتحان کردم . اما چرا ؟
شما هم اینو ببینید و دلیلشو بگید .


<?php
if($_POST['s'])
{
if(is_numeric($_POST['t']))
echo 'is number';
else
echo 'is string';
}
?>
</p>
<form id="form1" name="form1" method="post" action="">
<label>
<input name="t" type="text" id="t" />
</label>
<label>
<input name="s" type="submit" id="s" value="Submit" />
</label>
</form>

در دریافت post اگر 12345 بدیم میگه is number و اگر مقدار '12345' رو بدیم میگه is string .
شما هم منظورتون همینه ؟ مثال درستی زدم ؟

Yousha
پنج شنبه 01 تیر 1391, 16:45 عصر
اول اینکه کدتون خطا میده :لبخندساده:
Notice: Undefined index: s in C:\www\index\index.php on line 2
یه isset احتیاج داره

دوم اینکه مثالتون اشتباه هست. چراکه حتی اگر بجای شرط is_numeric از is_string استفاده کنید باز هم عدد 12345 رو میگه رشته هست و حتی عدد با کوتیشن '12345' رو هم میگه رشته هست!

سوم چرا دراین مثال میگه عدد با کوتیشن '12345' number نیست؟ چونکه کوتیشن اطرافش قرار میگیره و بواسطه متغیر $_POST وارد شرط میشه! و نه بصورت خام.
درستش میشه مثال من:

echo (bool)is_numeric('12345');
در آخر میدونید که numeric یعنی شماره ای، رقمی - پس فرقی نمی کنه که اعشاری باشه: 2.333 یا رشته ای: '12345' یا حتی هگزادسیمال!

lady64
جمعه 02 تیر 1391, 08:42 صبح
برای من خطا نمیداد. isset نزاشتن شاید غیر اصولی باشه ، ولی خطا که نیست . از پاسختون ممنون. جالب بود.