چطوري مي‌شه يك كد asp را از داخل ديتابيس access خواند ؟

esf-kh

Member
دوستان درود فراوان مرا بپذيريد . من ميخواهم صفحه‌اي را با asp طراحي كنم كه كدهاي مهم آن براي امنيت بيشتر از داخل ديتابيسي كه با اكسس طراحي شده فراخواني بشود . براي مثال من يك فايل اكسس ساخته‌ام . داخل آن يك فيلد به اسم main وجود دارد . داخل آن كد<% Response.write("hello")%>قرار دارد . من با استفتاده از دريم‌ويور ابتدا يك connection‌با ديتا بيس بر قرار مي‌كنم . بعد يك ركورد ست مي‌سازم . با استفاده از <%=(Recordset1.Fields.Item("main").Value)%> با فيلد main داخل فايل اكسس ارتباط برقرار مي‌كنم . و بعد آنرا در روت ذخيره مي‌كنم . وقتي آنرا تحت لوكال اجرا مي‌كنم به جاي اينكه كلمه hello نمايش داده بشه صفحه كاملا سفيد نمايش داده مي‌شود . هيچ خطايي هم گرفته نمي‌شه . و قتي از داخل مرورگر كد صفحه را مي بينم متوجه مي‌شوم كه كد asp فراخواني شده از ديتابيس به همان شكل به مرورگر برگردانده شده و قابل مشاهده است . حال اگر كد موجود در همان صفحه را كپي و در يك فايل جديد پيست بكنيم و ذخيره بكنيم اجرا مي‌شود و كار مي‌كند . خواستم ببينم براي رفع اين مشكل راه‌حلي موجود است يا نه ؟ لطفا اگر پاسخي داريد راهنمايي فرماييد . چون بسيار برايم مهم است . با سپاس .
 

mehradmoein

Member
برای این کار شما باید از دستور execute استفاده کنید:
execute("asp code")
به جای asp code اون کدی که از دیتابیس می خوانید رو قرار دهید.فقط توجه کنید که اگه در اون کد از علامت " استفاده شده، باید به "" تغییر پیدا کنه.مثال برای همین کدی که گفتید:
Execute("RedordSet1.Fields.Item(""mail"").Value")
 

esf-kh

Member
با درود . دوست گرامي بسيار سپاسگزارم از پاسخ پاسختان . من پيشنهاد شما را امتحان كردم . با يك مشكل برخوردم . بعد از اجراي صفحه با پيغام خطاي زير داده مي‌شود .
Wrong number of arguments or invalid property assignment: 'Recordset1.Fields.Item(...).Value'
خواستم ببينم چگونه مي‌شود اين مشكل را رفع كرد . سپاسگزارم .
 

mehradmoein

Member
از اين كد استفاده كنيد:
Execute("response.write(Recordset1.Fields.Item(""...."").value")
به احتمال زياد درست مي شه.
 
آخرین ویرایش:

esf-kh

Member
من پيشنهاد دوباره شما را هم امتحان كردم . اما متاسفانه باز هم نتيجه نگرفتم . اگر ممكن است باز هم من را راهنمايي فرماييد . سپاسگزارم .
 

ماهان

Member
سلام..

دوست عزیز بهتره به این سایت یه سری بزنی مطمئنن به دردت می خوره


aspwebpro.com


به نظر من اگه بخوایی یاد بگیری کد های بسیار ساده ای رو داره




اینجام بد نیست


irasp.net
 

mehradmoein

Member
با سلام
اگه می شه کدی که استفاده کردید رو بزارید.
به نظر من از دستور execute ایراد نمی گیره و از اون شی recordset ایرلد می گیره.
شما اون دستور رو به تنهایی و بدون وجود execute اجرا کنید و ببینید که اجرا می شه یا نه.
اگه شما بتونید که فایل و دیتابیستون رو این جا بزارید من قول می دم که درستش کنم.
 

esf-kh

Member
mehradmoein گفت:
با سلام
اگه می شه کدی که استفاده کردید رو بزارید.
به نظر من از دستور execute ایراد نمی گیره و از اون شی recordset ایرلد می گیره.
شما اون دستور رو به تنهایی و بدون وجود execute اجرا کنید و ببینید که اجرا می شه یا نه.
اگه شما بتونید که فایل و دیتابیستون رو این جا بزارید من قول می دم که درستش کنم.

دوست گرامي درود من را بپذيريد . از شما به خاطر راهنماييتان سپاسگزارم . من ديتابيس و فايل اي‌اس‌پي را در يك فايل زيپ گذاشتم . البته اين‌ فايل نمونه است و هدف ساخت اين فايل نمي‌باشد . هدف اين است كه چطور بايد كد اي‌اس‌پي را از داخا ديتابيس به صفحه فراخواني كرد طوري كه سرور كد اي‌اس‌پي را به سمت كلاينت نفرستد و همچنين كد به درستي عمل كند و صفح خالي نشان داده نشود . فايل مزبور را من با دريم‌ويور ساخته‌ام . البته براي آن يك Dsn به نام Mail ساخته‌ام . و بعد از بخش Apllication برنامه ابتدا يك كانكشن و بعد يك ركورد ست ساخته‌ام . بعد با استفاده Dynamic text در دريم‌ويور text داخل ديتابيس را كه يك كد اي‌اس‌پي است را فراخواني كرده‌ام . تا اين مرحله بعد از اجراي صفحه چيزي نشان داده نمي‌شود و در بخش سورس صفحه كد اي اس‌پي انتقال مي‌يابد . در مرحله بعد من execute را به كد صفحه اضافه كردم كه متاسفانه باز هم جواب نداد . خوشحال مي‌شوم كه من را باز راهنمايي فرماييد . سپاسگزارم .
 

پیوست ها

  • mail.zip
    7.7 کیلوبایت · بازدیدها: 9

mehradmoein

Member
با سلام
من کد شما رو به کلی تغییر دادم و کاملا هم کار می کند.
فقط باید چند نکته رو بگم:
اول اینکه شما نباید از <%%> در دیتابیس استفاده کنید.یعنی فقط کد ساده رو بنویسید.
نکته ی بعد این هست که با استفاده از این برنامه شما به کاربر اختبار کامل می دهید که هر کاری که می خواهد بکند.حتی اگر این کد فقط برای استفاده برای مدیر سایت هست ، باز هم خطرناک هست و ممکن هست که سایت شما مورد حمله قرار بگیره و باید برای مدیر سایت حتما یک سیستم username و password قوی گذاشت.
به هر من این کد رو اصلاح کردم و وظیفم بود که به شما بگم که خطرناک هست.
امیدوارم که کمک کرده باشم.
با تشکر
 

پیوست ها

  • mail.rar
    6.7 کیلوبایت · بازدیدها: 17

esf-kh

Member
دوست گرامي از لطفي كه كرديد بسيار سپاسگزار هستم . البته من هم با كمي ور رفتن با روشي كه شما فرموده بوديد موفق شدم كه كد را از داخل ديتابيس بخوانم . فايل شما را هم دريافت داشتم . از شما سپاسگزارم . چند سوال داشتم . اگر ممكن است راهنمايي فرماييد . اول اينكه با اين روش تنها اسكريپت و يا كدهاي اي‌اس‌پي اجرا مي‌شود و مثلا اگر در آن از كد‌هاي html استفاده شود شيوه execute قادر به اجرا نيست . و با مشكل بر خواهد خورد . آيا روشي است كه بتوان به آبجكت execute فهماند كه تنها اسكريپتها را اجرا كند و از موارد ديگر چشم پوشي كند ؟ سوال دوم من اين است كه چطوري مي‌شه مثلا در يك فيلد از ديتا بيس كه شامل دو ركورد است ، كاري كرد كه اطلاعات ازركورد دوم خوانده شود . چون در حالت عادي از ركورد اول اطلاعات گرفته مي‌شود .
 

mehradmoein

Member
با سلام
من سوال اول شما رو متوجه نمي شم.اگه مي شه مثال بزنيد.براي اجراي كد هاي html در asp شما فقط بايد اون ها رو response.write كنيد و احتياجي به execute نيست.
در مورد سوال دوم هم اگه منظورتون رو درست متوجه شده باشم كدش اين هست:
select * from table desc
در واقع وقتي كه desc رو به آخر كد اضافه كنيد,اطلاعات از آخر خونده مي شن.
 

esf-kh

Member
دوست گرامي درود مجدد من را بپذيريد . از اينكه از راهنمايي‌هاي خوب شما بهره‌مندم بسيار خرسندم . من در اصل مي‌خواهم براي امنيت بيشتر يك page‌را از داخل ديتابيس فراخواني كنم . بنا به فرض صفحه‌اي مانند زير *******

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>

</head>

<body>
<%="majid online"%>
</body>
</html>

ولي وقتي كدهاي اين پيج را داخل ديتابيس مي‌گزارم و از طريق execute مي خواهم آنرا اجرا كنم با ارور مواجه مي‌شوم . به نظر م execute تنها مي‌تواند بلاك كدها را اجرا كند و تگ‌هاي html را متوجه نمي‌شود . در رابطه با سوال دومم منظورم اين بود كه در يك فيلد با داشتن id مربوط به يك ركورد اطلاعات داخل آن ركورد را فراخواني كنيم .
در ضمن سوالي داشتم . شما فرموده بوديد كه استفاده از شيوه‌اي كه من در نوشتن كدهايي كه نوشته بودم ، ممكن است باعث خطر شود و هكرها قدرت نفوذ پيدا كنند . خواستم بپرسم كه دليل اين كار چيست ؟ به خاطر اينكه ديتابيس پسورد ندارد يا ايكه استفاه از dsn به جاي dsn less . ممنون مي‌شوم كه من را راهنمايي فرماييد .
 

mehradmoein

Member
فكر كنم كه متوجه شدم.
براي اين كار شما بايد در ديتابيس به جاي نوشتن كد هاي html اون ها رو response.write كنيد.مثلا براي تگ <HEAD> بنويسيد response.write("<HEAD>") اين جوري ديگه error نمي ده.
براي سوال دوم:
select * from table where id = 2
به جاي table اسم table رو بزاريد و به جاي 2 اون id كه مي خواهيد رو بزاريد.
 

mehradmoein

Member
يكي از اصول امنيت اين هست كه اطلاعات گرفته شده از كاربر رو به طور مستقيم execute نكنيم.چون كاربر به راحتي مي تونه هر كاري كه دلش خواست بكنه.منظور من هم همين بود كه يك همچين سيستمي هيچ وقت نبايد در اختيار همه ي كاربراي قرار بگيره.در اين سيستم, شما اطلاعات رو از database مي گيريد و execute مي كنيد.
حالا اگه بخواهيد كه يك صفحه هم بسازيد كه بشه اون اطلاعات داخل database كه كد از اون خونده مي شه رو دستكاري كرد,اون وقت امنيت اين سيستم زير سوال مي ره و بايد از اون صفحه محافظت بشه. نمي دونم كه تونستم منظورم رو برسونم يا نه.
 

esf-kh

Member
دوست گرامي باز هم از شما سپاسگزارم . راهنمايي شما برايم بسيار مفيد بود . مشكل حل شد . شاد و پيروز و تندرست باشيد . بدرود .
 

esf-kh

Member
دوست گرامي من را ببخشيد كه دوباره مزاحم شدم . من درباره ado چيز زيادي نمي‌دانم . در باره ارتباط با ديتابيس و خواندن اطلاعات از يك ركورد خاص شما شيوه select * from table where id را در
<%
set objADO = Server.CreateObject("ADODB.Connection")
objADO.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("data.mdb")
set objExecute = objADO.Execute("select * from table1")
If not objExecute.EOF Then
If not objExecute("mail") = "" Then
execute(objExecute("mail"))
end If
End If
set objExecute = Nothing
objADO.Close
set objADO = Nothing
%>
پيشنهاد كرديد . در اينجا حالت به فرم execute است . حال اگر خواسته باشيم فقط متن را از ديتا بيس بخوانيم و ديگر نخواهيم آنرا execute گنيم بجاي execute در كد بالا چه چيزي را بايد قرار دهيم . مثلا به جاي objADO.Execute مثلا مي‌شود objADO.write قرار داد ؟‌
 

esf-kh

Member
دوست گرامي سوال ديگري نيز داشتم . و آن اينكه اگر ديتابيس اكسس ما پسورد داشت در كد بالا چه جوري بايد آنرا وارد كنيم ؟
 

mehradmoein

Member
دستور objADO.Execute فقط كد sql را به ديتابيس مي فرستد و كاري به execute كردن كد ندارد.
فقط اسم اين هم execute هست ولي مربوط به شي ado هست.
براي نوشتن كدها در صفحه شما بايد به جاي execute در ( execute(objexecute("mail").....)
از response.write استفاده كنيد.
 

esf-kh

Member
دوست گرامي درود مجدد من را بپذيريد . از شما سپاسگزار هستم . مشكل اول من به طور كامل حل شد . اما من هنوز نمي‌دانم كه چطور با يك ديتابيسي كه پسورد دارد ارتباط برقرار كنم . البته در يك كتاب ado آن هم به صورت اجمالي جوابم را يافتم . البته باز مشكلم حل نشد . شايد چيزي كه من ديده بودم راه حل مشكل من نبود . و آن به اين صورت كه در كد بالا مثلا پسورد ديتابيس اكسس m باشد به صورت زير عمل مي كنيم . set objExecute = objADO.Execute("select * from table1","m") البته اين جواب نداد . بي‌زحمت راهنمايي فرماييد . بدرود
 

جدیدترین ارسال ها

بالا