PDA

View Full Version : بهترین روش نوشتن کدهای SQL در php



abbas3zaar
جمعه 07 خرداد 1395, 20:55 عصر
سلام. میخواستم ببینم در نوشتن کوئری چه نکاتی باید رعایت بشه مثلا میگن باید نام جداول داخل کوتیشن گذاشته بشه و ... اگه ممکنه نکات مهم رو بگید

مثلا این یه کوئری من هست. روی این مثال بزنید بهتره:




$query = "SELECT * FROM tbl_students
INNER JOIN tbl_reshte ON tbl_students.student_reshte = tbl_reshte.reshte_id
INNER JOIN tbl_paye ON tbl_students.student_paye = tbl_paye.paye_id";

bax998
جمعه 07 خرداد 1395, 23:38 عصر
دلیلی نداره که از کوتیشن برای اسم جداول استفاده بشه.
تنها جایی که مشکل بوجود میاد حالتی هست که اسم جدول یا اسم فیلد کلمات رزرو شده ی mysql باشن که در این حالت اسم فیلد و یا تیبل رو داخل `` قرار میدهیم. (توصیه میکنم از کلمات رزرو شده برای اسم جداول و فیلد هاتون استفاده نکنید)

Unique
شنبه 08 خرداد 1395, 00:34 صبح
همونطور که بکس گفت نیاز نیست از quote استفاده بشه مگه کلمات رزرو که اگه شما دارین ازشون استفاده میکنید در واقع Bad Practice میکنید و بهتره از camel یا underline و غیره در نامگذاری جداول و فیلد ها استفاده کنید.

abbas3zaar
شنبه 08 خرداد 1395, 01:13 صبح
دلیلی نداره که از کوتیشن برای اسم جداول استفاده بشه.
تنها جایی که مشکل بوجود میاد حالتی هست که اسم جدول یا اسم فیلد کلمات رزرو شده ی mysql باشن که در این حالت اسم فیلد و یا تیبل رو داخل `` قرار میدهیم. (توصیه میکنم از کلمات رزرو شده برای اسم جداول و فیلد هاتون استفاده نکنید)


همونطور که بکس گفت نیاز نیست از quote استفاده بشه مگه کلمات رزرو که اگه شما دارین ازشون استفاده میکنید در واقع Bad Practice میکنید و بهتره از camel یا underline و غیره در نامگذاری جداول و فیلد ها استفاده کنید.

توی همین فروم یه بار حرف sql injection و حملات دیگه بود و یه سری توصیه ها برای جلوگیری ازحملات نوشته بودن. مثلا گفته بودن
از mysql_escape_string() استفاده و متغیر هایی که int هستند رو داخل تک کدیشن ' بگذارید همیشه در امان می مونید و هیچ مشکلی هم پیش نمیاد.
منظورش از استفاده از تک کوتیشن در INT داخل کوئری های SQL منظورش هست؟

مثلا این عدد 1 رو باید داخل تک کوتیشن بزاریم؟



SELECT * FROM tbl_students WHERE student_id = 1




کلا برای جلوگیری از حملات به دیتابیس چه کارهایی باید کنیم؟

مثلا اینتوابع stripslashes ,mysql_real_escape_string و addslashes هرکدام در کجا کاربرد دارد و مثال کاربردی بزنید که مثلا برای لاگین از لحاظ امنیتی چیکار باید کنیم. با مثلا برای فرم ثبت نام، یا صفحه مدیریت.

vahidmoghadam
شنبه 08 خرداد 1395, 08:23 صبح
خوب اگر بخواهید اون عدد یک رو داخل ' ' بگذارید که به عنوان رشته شناخته میشه و چون student_id عددی هست پیغام خطا میگیرید، بهتره برای جلوگیری از sql injection مقادیری که از کاربر میگیرید و میخواهید که در SQL Query از اونها استفاده کنید قبل از استفاده از یک سری فیلتر بگذرونید که امن بشن که یکیش همین escape string هست ...

و یک مورد هم در مورد اصولی تر شدن کوئری ها به فرمایشات دوستان اضافه کنم ، اونم اینکه همیشه فرامین خود SQL رو مثل SELECT یا INSERT INTO یا ORDER BY و ... رو با حروف بزرگ بنویسید، برای خوانایی بهتر

Unique
یک شنبه 09 خرداد 1395, 02:54 صبح
خوب اگر بخواهید اون عدد یک رو داخل ' ' بگذارید که به عنوان رشته شناخته میشه و چون student_id عددی هست پیغام خطا میگیرید،
خیر آقا وحید خطا نمیده و مشکلی هم پیش نمیاد !

عباس عزیز برای جلوگیری از حملات sql injection باید ورودی هایی که به صورت inline نوشته میشه را escape کنید ، د رمورد quote هم کنظور من مقادیر نبود ! منظورم نام جداول و ستون ها بود. شما مقادیر را چه عددی و چه رشته ای بگذار توی quote !

برای escape کردن اگه مقدار get_magic_quotes_runtime برابر true باشه باید stripslashes کنی در غیر اینطور نمیخواد. تابع mysql_real_escape_string هم مقادیر شما را escape میکنه فقط مطمئن بشین در زمان connect با mysql_set_charset کاراکتر ست را روی utf-8 میگذارین. برای مقادیر عددی هم میتونی از تابع sprintf استفاده کنی و نیازی به escape نیست !

اما اگه از pdo و mysqli و قابلیت prepared statement ها که مقادیر را به صورت پارامتری میگیرن استفاده کنی نیاز به escape نیست ! خیالت راحت inject نمیخوره.