PDA

View Full Version : سوال: یه سوال در مورد استفاده از تابع mysql_real_escape_string و stripslashes



i-php-i
پنج شنبه 25 فروردین 1390, 15:53 عصر
فرض کنید که من از تابع mysql_real_escape_string استفاده کردم و به کمک این تابع مقادیر ورودی رو اسکیپ کردم و توی پایگاه داده ذخیره کردم.

سوالم اینه که هنگام بازیابی این مقادیر از پایگاه داده و نمایش اونها توی صفحه وب، آیا لازم هست که از تابع stripslashes استفاده کنم؟

eshpilen
پنج شنبه 25 فروردین 1390, 22:35 عصر
خیر.
Escape شدگی فقط موقع ترکیب و تفسیر کوئری وجود و کاربرد داره. دیتای شما بصورت اولیه در دیتابیس ذخیره میشه و بنابراین وقتی اون رو از دیتابیس میگیرید به شکل اولیهء خودش هست.
البته موقع نمایش دیتای کاربر در صفحات وب معمولا باید از تابع htmlspecialchars استفاده کرد. این یه موضوع جداست.

i-php-i
جمعه 26 فروردین 1390, 00:31 صبح
خیر.
Escape شدگی فقط موقع ترکیب و تفسیر کوئری وجود و کاربرد داره. دیتای شما بصورت اولیه در دیتابیس ذخیره میشه و بنابراین وقتی اون رو از دیتابیس میگیرید به شکل اولیهء خودش هست.
البته موقع نمایش دیتای کاربر در صفحات وب معمولا باید از تابع htmlspecialchars استفاده کرد. این یه موضوع جداست.

پس در زمان فراخوانی مقادیر از پایگاه داده احتیاجی به استفاده از تابع stripslashes نیست.

می شه در مورد نحوه اسکیپ کردن این تابع توضیح بدید؟ چون تا اونجایی که اطلاع دارم با استفاده از بک اسلش باید مقادیر رو اسکیپ کرد اما این تابع ظاهرا به شکل دیگه ای عمل می کنه.

لطفا بگید که این تابع روی چه مقادیری تاثیر می ذاره؟

eshpilen
جمعه 26 فروردین 1390, 08:55 صبح
اما این تابع ظاهرا به شکل دیگه ای عمل می کنه.فکر نمیکنم لزوما به شکل دیگه ای عمل بکنه. خب شاید هم بکنه :لبخند:
بهرحال برای من و شما مهم نیست که بصورت داخلی چطور عمل میکنه. ما فقط باید برای کوئری های دیتابیس ازش استفاده کنیم.
تفاوتهایی که درمورد این تابع میدونم اینه که 1-این تابع جزیی از MySQL هست و توسط MySQL اجرا میشه (برخلاف addslashes که مال خود PHP هست). 2- از مقایسهء رفرنس این دو تابع مشخص میشه که تعداد کاراکترهایی که این تابع Escape میکنه بیشتر هست.

لطفا بگید که این تابع روی چه مقادیری تاثیر می ذاره؟
\x00, \n, \r, \, ', " , \x1a
اما برای addslashes در رفرنس این کاراکترها رو ذکر کرده:

\x00, \, ', "

i-php-i
جمعه 26 فروردین 1390, 14:04 عصر
فکر نمیکنم لزوما به شکل دیگه ای عمل بکنه. خب شاید هم بکنه :لبخند:
بهرحال برای من و شما مهم نیست که بصورت داخلی چطور عمل میکنه. ما فقط باید برای کوئری های دیتابیس ازش استفاده کنیم.
تفاوتهایی که درمورد این تابع میدونم اینه که 1-این تابع جزیی از MySQL هست و توسط MySQL اجرا میشه (برخلاف addslashes که مال خود PHP هست). 2- از مقایسهء رفرنس این دو تابع مشخص میشه که تعداد کاراکترهایی که این تابع Escape میکنه بیشتر هست.

\x00, \n, \r, \, ', " , \x1a
اما برای addslashes در رفرنس این کاراکترها رو ذکر کرده:

\x00, \, ', "

رشته های زیر چه معنایی دارن و اگر بخوایم خودمون اسکیپشون کنیم باید چطور اسکیپشون کنیم؟ (منظورم اینه که باید یه بک اسلش دیگه بهشون اضافه کنیم یا اینکه بک اسلشی که توی این رشته ها هست، کار اسکیپ کردن رو انجام می ده)

\x00, \n, \r, \x1a

eshpilen
جمعه 26 فروردین 1390, 15:29 عصر
\x00 بایتی با مقدار صفر هست (NULL - نال).
\n بایتی با مقدار 10 هست (در مبنای 10).
\r بایتی با مقدار 13 هست.
این دو کاراکتر بالا با کد 10 و 13، کاراکترهای مربوط به New Line (خط جدید - کاراکترهایی که باعث رفتن به خط بعدی میشن یا بعبارت دیگه انتهای خط رو علامتگذاری میکنن) هستن.
\x1a هم که در مبنای 10 میشه 26 و کاراکتر خاصی با چند معنا و کاربرد هست (کاراکتر جایگزین کاراکترهای ناشناخته/غیرمجاز و ضمنا در بعضی سیستمهای دیگر معانی/کاربردهای دیگری داره).
اون بک اسلش هایی که میبینید جزو این کاراکترها نیست و فقط روش مشخص کردن این کاراکترها با مقداردهی هگز (مثل \x1a) یا نمادین (مثلا درمورد \r و \n) در رشته ها هست. مثلا وقتی میخواید کاراکتری با مقدار 26 (که در مبنای 16 میشه 1A) رو در یک رشته در PHP تعیین و چاپ کنید اینطور مینویسید:

echo "\x1A";
یعنی بجای \x1A فقط یک بایت با مقدار 26 درج میشه.
بعدشم بله فکر میکنم برای Escape کردن همهء این کاراکترها کافی باشه قبل از اونها یک بک اسلش اضافه کنیم (البته نه به این شکل که قبل از همین شکلهای نمادین یک بک اسلش اضافه کنیم، بلکه قبل از اون تک بایتهایی که مقدارهای مورد نظر رو دارن).
اما شما نیازی به این کار ندارید و بهتره از توابع استاندارد آماده ای که هست استفاده کنید.

i-php-i
جمعه 26 فروردین 1390, 16:03 عصر
\x00 بایتی با مقدار صفر هست (NULL - نال).
\n بایتی با مقدار 10 هست (در مبنای 10).
\r بایتی با مقدار 13 هست.
این دو کاراکتر بالا با کد 10 و 13، کاراکترهای مربوط به New Line (خط جدید - کاراکترهایی که باعث رفتن به خط بعدی میشن یا بعبارت دیگه انتهای خط رو علامتگذاری میکنن) هستن.
\x1a هم که در مبنای 10 میشه 26 و کاراکتر خاصی با چند معنا و کاربرد هست (کاراکتر جایگزین کاراکترهای ناشناخته/غیرمجاز و ضمنا در بعضی سیستمهای دیگر معانی/کاربردهای دیگری داره).
اون بک اسلش هایی که میبینید جزو این کاراکترها نیست و فقط روش مشخص کردن این کاراکترها با مقداردهی هگز (مثل \x1a) یا نمادین (مثلا درمورد \r و \n) در رشته ها هست. مثلا وقتی میخواید کاراکتری با مقدار 26 (که در مبنای 16 میشه 1A) رو در یک رشته در PHP تعیین و چاپ کنید اینطور مینویسید:

echo "\x1A";
یعنی بجای \x1A فقط یک بایت با مقدار 26 درج میشه.
بعدشم بله فکر میکنم برای Escape کردن همهء این کاراکترها کافی باشه قبل از اونها یک بک اسلش اضافه کنیم (البته نه به این شکل که قبل از همین شکلهای نمادین یک بک اسلش اضافه کنیم، بلکه قبل از اون تک بایتهایی که مقدارهای مورد نظر رو دارن).
اما شما نیازی به این کار ندارید و بهتره از توابع استاندارد آماده ای که هست استفاده کنید.

راستش زیاد متوجه نشدم !



اما شما نیازی به این کار ندارید و بهتره از توابع استاندارد آماده ای که هست استفاده کنید.

می شه بگید که منظورتون چه توابعی هست، لطفا اسم توابع رو ببرید؟

eshpilen
جمعه 26 فروردین 1390, 17:53 عصر
مثلا همین تابع mysql_real_escape_string که موقع درج داده ها در دیتابیس بکار میبرید.
یا تابع addslashes که مثلا برای بعضی درج داده ها در رشته های جاوااسکریپت میتونیم استفاده کنیم.
شما میگید اگر بخوایم این رشته ها رو خودمون اسکیپ کنیم. خب شما کجا واسه چی میخواید این رشته ها رو اسکیپ کنید؟ هرجا که لازم باشه این رشته ها اسکیپ بشن میتونید از تابع مخصوص خودش استفاده کنید.

mtchabok
جمعه 26 فروردین 1390, 19:53 عصر
ببخشید یه سوالی دارم آیا mysql_real_escape_string از سرور mysql استفاده میکنه ؟ یعنی اینکه آیا رشته مورد نظر رو برای escap به سرور mysql میفرسته و یا نه در خود php اینکار انجام میشه ؟

eshpilen
جمعه 26 فروردین 1390, 20:04 عصر
باید اینطور باشه (به mysql ارسال بشه).
تابعی با نام مشابه در MySQL وجود داره. احتمالا اسمش real_escape_string باشه؛ دقیقا یادم نیست.
ضمنا در فرنس هم آمده که:

Note: A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used.

اینکه اجرای این تابع نیاز به وجود یک کانکشن به MySQL داره نشون میده که نیاز به ارتباط با MySQL داره.

eshpilen
شنبه 27 فروردین 1390, 08:38 صبح
الان نگاهی کردم این تابع در MySQL C API هست. یعنی کتابخانهء مخصوص ارتباط با MySQL که توسط خود MySQL تهیه میشه و طبیعتا در اکستنشن مای اس کیو ال PHP استفاده میشه.
اسمش هم دقیقا همون mysql_real_escape_string هست.
یه نگاهی به اینجا بکنید: http://dev.mysql.com/doc/refman/5.5/en/mysql-real-escape-string.html
البته احتمال داره نتیجه گیری قبلی بنده درست نباشه و این تابع باوجود اینکه جزیی از MySQL محسوب میشه (منظورم اینه که پیاده سازی و کدهای درونی اون کار برنامه نویسان PHP نیست) اما برای Escape کردن رشته ها لزوما با سرور MySQL تماس نمیگیره. چون نوشته علت اینکه این تابع نیاز به دریافت یک کانکشن باز به MySQL داره این هست که Escape کردن به character set ای که درحال استفاده در سرور MySQL هست بستگی داره:

Note that mysql must be a valid, open connection. This is needed because the escaping depends on the character set in use by the server.

حالا برای فهمیدن این character set آیا نیازی به برقراری ارتباط با سرور MySQL هست یا نه، دقیقا نمیدونم. چون ممکنه این اطلاعات در همون هندلر کانکشن ذخیره شده باشن.

mtchabok
شنبه 27 فروردین 1390, 12:04 عصر
مرسی .
در مورد charset هم فک کنم که روی هر درخواست از سرور میگیره ... چونکه در دستورات کوئری هم برای ست کردن charset میشه استفاده کرد پس فک نکنم که در handler بخواد ذخیره بشه ... البته این روش منطقیش هس و شایدم برای ست کردن و گرفتن charset از روش دیگه ای استفاده میشه .
ولی به صورت کلی هم میشه از طریق تابع و هم از طریق کوئری charset رو ست کرد .