PDA

View Full Version : سوال: سوال مفهومی از ajax در این کد



one hacker alone
پنج شنبه 03 اسفند 1391, 18:32 عصر
با سلام
قطعه کد زیر موتور اژاکس رو نووشته و یه تابع برای حذف رکورد ها
در واقع این کد به بانک وصل میشه و داده ها رو تو جدول لیست میکنه حالا کاربر اگه روی دکمه حذف کلیک کنه اون رکورد با اژاکس میره تو بانک حذف میشه و با جاوا اسکریپت از صفحه فعلی برداشته میشه
اما سوال اینه که ما وقتی id سطری که کاربر روش دکمه حذف رو زده به تابع sendfordelمیفرستیم چی باعث میشه که ای دی ها با هم تفاوت داشته باشه یعنی در واقع چجوری منحصر بفرد شده در حالی که این موضوع در این جدول ربطی به ایدی بانک نداره و در واقع ما اینجا یک متغییر $id داریم و باید یک داده توش ذخیره شده باشه !!!
اما چجوری میفهمه که این id ماله کدوم سطر هست
مگه اینکه با هربار دکمه حذف یه بار حلقه while اجرا بشه تا به اون id برسه و بعد بفرسته برا تابع sendfordel



<script type="text/javascript" language="javascript">
var pageurl="del.php?code=";
var xmlhttp;
var nid=0;
function answer()
{
if(xmlhttp.readyState == 4)
{
var result=xmlhttp.responseText;
del(nid);
}
}
function sendfordel(id)
{
var strcode;
createXMLHttpRequest();
strcode = id;
nid=id;
xmlhttp.open("GET", pageurl + strcode, true);
xmlhttp.onreadystatechange=answer;
xmlhttp.send(null);
}
function createXMLHttpRequest()
{
if (window.ActiveXObject)
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
}
function del(nid)
{
var tab=document.getElementById("tbl");
var tr=document.getElementById("tr"+nid);
tab.deleteRow(tr.rowIndex);
}
</script>
</head>
<body>
<table width="500" id="tbl" border="0" cellspacing="0" cellpadding="5">
<tr>
<td width="99" bgcolor="#00CC66">ID</td>
<td width="112" bgcolor="#00CC66">Name</td>
<td width="171" bgcolor="#00CC66">Phone Number</td>
<td width="78" bgcolor="#00CC66">Operation</td>
</tr>
<?php
$s=mysql_connect("127.0.0.1","root","");
if(!$s)
echo "error in connect to mysql server";
$db=mysql_select_db("tellbook");
$result=mysql_query("select * from tbl");
$row="";
while($row=mysql_fetch_assoc($result))
{?>
<?php $id=$row["id"]; ?>
<tr id="tr<?php print($id);?>">
<td><?php print($row["id"]); ?></td>
<td><?php print($row["name"]); ?></td>
<td><?php print($row["telephone"]); ?></td>
<td><input type="button" value=" delete " name="clk" onclick="sendfordel(<?php print($id);?>);"/></td>
</tr>
<?php
}
mysql_close($s);
?>
</table>
</body>

سميه اميني
پنج شنبه 03 اسفند 1391, 19:28 عصر
یعنی چی چطوری می فهمه ؟؟ خوب به هر tr یه آی دی مخصوص دادین دیگه !!
خودتون کد رو نوشتین و خطا داره یا طرز کارشو نمی دونین؟؟

eshpilen
پنج شنبه 03 اسفند 1391, 21:55 عصر
دربارهء این قطعه کد:

اصولیش باید از POST استفاده میکرد، نه GET.
چون بر طبق استاندارد، درخواستهایی که باعث تغییر وضعیت در سمت سرور میشن باید با POST انجام بشن.

ضمنا از نظر امنیتی، مکانیزم جلوگیری از XSRF هم نداره.

one hacker alone
پنج شنبه 03 اسفند 1391, 23:41 عصر
ببینید کد ایرادی نداره
شما میگید هر سطر ما بهش یه کد دادیم خب این قبول اما اون id که ما به تابع پاس دادیم id ی نیست که در هر tr نام گذاری شده اگه اون بود بحثی نبود
در واقع id ی که به تابع پاس داده میشه متغییر $id هست
========
درمورد امنیت من نظری ندارم چون خیلی با این حملات اشنا نیستم اما فکر کردم توی اجاکس شاید نشه به پارامترها دسترسی داشت و اونها رو دستکاری کرد برا همین روش کار نکردم اما چون اجاکس ارتباطش رو با مرورگر دوم به طور غیر اشکار برقرار میکنه و تعامل داده داره گفتم شاید اینجا بحث POST مطرح نباشه ، که باز میگم چون خیلی اشنا نیستم نظری ندارم شما اگه با مکانیزم این حمله اشنایی دارین خوشحال میشم استفاده کنیم از اطلاعاتتون

shahriyar3
جمعه 04 اسفند 1391, 00:07 صبح
ببینید کد ایرادی نداره
شما میگید هر سطر ما بهش یه کد دادیم خب این قبول اما اون id که ما به تابع پاس دادیم id ی نیست که در هر tr نام گذاری شده اگه اون بود بحثی نبود
در واقع id ی که به تابع پاس داده میشه متغییر $id هست
========
درمورد امنیت من نظری ندارم چون خیلی با این حملات اشنا نیستم اما فکر کردم توی اجاکس شاید نشه به پارامترها دسترسی داشت و اونها رو دستکاری کرد برا همین روش کار نکردم اما چون اجاکس ارتباطش رو با مرورگر دوم به طور غیر اشکار برقرار میکنه و تعامل داده داره گفتم شاید اینجا بحث POST مطرح نباشه ، که باز میگم چون خیلی اشنا نیستم نظری ندارم شما اگه با مکانیزم این حمله اشنایی دارین خوشحال میشم استفاده کنیم از اطلاعاتتون
من که متوجه نمیشم منظور شما چی هست
مقادیری که از دیتا بیس خونده میشه هر سطر بوسیله حلقه مقدار آیدیش روی یک tr قرار میگیره دیگه
اصلا سئوال شما واضح نیست
کد ajax هم خیلی قدیمی و زیر خاکی هست از نسخه های بالاتر استفاده کنید

one hacker alone
جمعه 04 اسفند 1391, 02:59 صبح
ببینید دوست عزیز ما فرض میکنیم خروجی ما به شکل زیر هست

id name operate
_______________________
1 ali del
2 reza del
3 ahmad del

ببینید این درسته هم ایدی های واکشی شده از بانک جدا هستن هم اینکه هر tr یه ایدی جدا گرفته

اما وقتی که ما id رو پاس میدیمم به تابع در واقع داریم id ی پاس میدیم که یک متغییر هست و هیچ ربطی نه به ایدی tr داره نه به ای دی بانک و با توجه به تریس کردن حلقه اخرین مقداری که در متغییر $id ذخیره میشه عدد 3 هست اینو قبول دارین دیگه؟ چون به اندازه 3 رکورد در بانک بوده و مقدار اخرین ایدی بانک هم 3 بوده پس داریم
$id=3 حالا از اون طرف ما اومدیم همین $id رو به تابع ارسال کردیم در حالی که امکان داره ما روی دومی حذف رو زده باشیم یا اولی
اما کد به درستی کار میکنه و من با درست بودن کد مشکل دارم میخوام بدونم قضیه چیه
اگه بخوام یه جور دیگه بگم اینجوری میشه
ببینید تو این خط ما اومدیم ایدی جدول رو میریزیم تو متغییر $id


<?php $id=$row["id"]; ?>

در خط بعد هم اومدیم همین $id رو به tr دادیم تا این ایدی منحصر به فرد برای هر سطر هم منحصر به فرد باشه و این رو قبول دارم
اما حرف من اینه که این id$در اولین دور اجرای حلقه مقدار 1 و دور دوم مقدار 2 و دور سوم مقدار 3 میگیره و تمام اطلاعات از بانک واکشی میشه و برای کاربر نمایش داده میشه
حالا در حالی که مقدار $id=3 هست بر اساس اخرین دور اجرای حلقه ؛ کاربر میاد روی یکی از سطرها حذف رو میزنه و ما اومدیم متغییر $id رو فرستادیم به تابع!!!!!
خوب مگه این مقدار ایدی 3 نیست پس این برنامه از کجا میفهمه که اون سطری که ما کلیک کردیم ایدیش 2 یا 3 هست؟؟؟؟؟؟؟؟؟؟؟؟؟؟
====================
مگه ajax جدید هم داریم؟؟؟؟ میشه بیشتر توضیح بدین یا لینکک معرفی کنید چون من مطالبی که در موردش خوندم همه به همین شکل بوده

eshpilen
جمعه 04 اسفند 1391, 09:20 صبح
درمورد امنیت من نظری ندارم چون خیلی با این حملات اشنا نیستم اما فکر کردم توی اجاکس شاید نشه به پارامترها دسترسی داشت و اونها رو دستکاری کرد برا همین روش کار نکردم اما چون اجاکس ارتباطش رو با مرورگر دوم به طور غیر اشکار برقرار میکنه و تعامل داده داره گفتم شاید اینجا بحث POST مطرح نباشه ، که باز میگم چون خیلی اشنا نیستم نظری ندارم
این چیزا ایجکس و غیرایجکس نداره :چشمک:

one hacker alone
شنبه 05 اسفند 1391, 00:16 صبح
کسی نبود مارو راهنمایی کنه؟

سميه اميني
شنبه 05 اسفند 1391, 07:52 صبح
ببینید این کد میاد یه جدول می سازه و همون لحظه ساخت به هر tr یه ای دی میده که دیگه این ای دی ها تغییر نمی کنه
اگه شما tr دوم رو حذف کنین tr های دیگه قبلا ای دی هاشون رو گرفتن و تاثیری روی اونها نداره

siavashsay
شنبه 05 اسفند 1391, 11:54 صبح
من نمیفهمم مسئله به این ساده ای کجاش واسه شما غیرقابل درکه !
دوست عزیز به صورت خیلی ساده !
سیستم آی دی هر ردیف رو از دیتابیس میخونه - اون رو روی tr میذاره - و در موقع حذف کردن آی دی رو توسط ajax میگیره - به دیتابیس میفرسته و دیتابیس اون رکورد با مشخصه اون آی دی رو حذف میکنه !
حالا اینجا 2 حالت وجود داره :
1- فیلد id در دریتایس auto incerment هست و در صورت حذف کردن یک رکورد عدد بعدی عوض میشه !
یعنی 1-2-3-4 داریم | حالا 4 حذف میشه - و الان 1-2-3 داریم | عدد بعدی که میاد قاعدتا 5 هست - یعنی میشه : 1-2-3-5
خوب اینجاد باید بگیم ربطی نداره به هر حال ! سیستم توی 4 ردیف tr بعدی اینطوری مقداری دهی میکنه
tr 1
tr 2
tr 3
tr 5
حالا شما 5 رو که حذف کنی - 5 فرستاده میشه به دیتابیس و اون رکورد پاک میشه !
2- اینکه سیستم توی دستور while اصلا به شما کاری نداره ! در اینجا row یک عدد چرخشی نیست - یک متغیر هست که فیلدهای دیتابیس رو فراخوانی میکنه فیلد !
یعنی مقدارهای tr رو بر اساس تعداد چرخه های while نمیذاره ! کار while اینجا فقط و فقط اجرای چرخه تا دریافت تمام رکوردهای جدول هست ! حالا اون مقداری که به tr ها داده میشه مقدار عددی نیست که while داره ایجاد میکنه ! در واقع مقداری فیلد ID هست که داره از دیتابیس میخونه !
اصلا یه جور دیگه مثال میزنیم ! کاری به id و عدد نداشته باشید ! بجای عدد از حروف استفاده میکنیم که قاطی نکنید ! طبق گفته خودتون این دیتابیس شما هست :
a --- google--- del
b --- yahoo--- del
c --- bing --- del
حالا while میاد آیدی هر tr رو میذاره :
tr a --- google
tr b --- yahoo
tr c --- bing
حالا شما دستور حذف اون ردیف رو میدی ! مثلا ردیف b ! تابع ajax مقدار b رو به دیتابیس میفرسته و دیتابیس رکورد b که همون yahoo هست رو پاک میکنه !
عذر میخوام اگر طولانی شد !
امیدوارم متوجه شده باشید

one hacker alone
شنبه 05 اسفند 1391, 12:27 عصر
حرف همه شما دوستان درست ببینید اخه درسته که همه چیز ساده به نظر میرسه اما:
ما سه id داریم
یه id مربوط به یکی از اپشن های تگ tr هست که اون برای حذف از طریق جاوا اسکریپت به ما کمک میکنه و ما با اون کاری نداریم
یه id داریم که از خود بانک گرفته میشه و مربوط به فیلد id هست که با row گرفتیم . اینم که کاری نداریم
اما سومین id همین متغییر id$ هست که دقیقا حرف رو این هست یعنی من با این id$ و نقش اون بعنوان پارامتر ارسالی به تابع برای پاک کردن از بانک مشکل دارم
اقا یک متغییر در ان واحد میتونه یک مقدار داشته باشه مگگه به غیر از اینه؟؟؟؟؟؟؟؟ ( مگه اینکه ارایه باشه)
خب حالا خیلی ساده من میگم وقتی حلقه کارش تمام شد و تمامی سطر ها برای ما نمایش داده شد یا اصلا کاری هم به حلقه نداریم وقتی صفحه کامل لود شد داخل متغییر id فقط یک مقدار هست
حالا من میگم وقتی متغییر id$ یک مقدار داره چجوری پس وقتی روی سطر اول کلیک میکنم نقش متغییری رو بازی میکنه که مقدارش 1 هست؟ و وقتی رو سطر دو کلیک میکنم نقش متغییری رو بازی میکنه که مقدارش 2 هست
مشکل من اینه
آقا این چه متغییریه که چند مقدار داره؟؟؟؟؟؟؟؟؟؟؟