PDA

View Full Version : لاگین با استفاده از stored procedure



بیتا حکمت
سه شنبه 20 مرداد 1394, 21:06 عصر
CREATE TABLE usertb (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
name VARCHAR(30) NOT NULL,
password VARCHAR(30),
email VARCHAR(50),
mobile VARCHAR(20),

reg_date TIMESTAMP
)



سلام ، من یک جدول با کد بالا ایجاد کردم ، حالا میخوام برای درست کردن صفحه لاگین میخوام برای این جدول یک SP بنویسم
در جست و جویی که برای یادگیری داشتم به این لینک رسیدم که این کد پیشنهاد شده :




CREATE PROCEDURE `IsUserPasswordValid`(
IN username varchar(50),
IN password_p VARCHAR(20),
OUT yes_no int
)
BEGIN
SELECT count(*) INTO yes_no
FROM USER u
WHERE u.USER_ID = username && u.password = password_p;
END



لینک منبع :http://stackoverflow.com/questions/25418758/mysql-stored-procedure-login

دو سوال دارم :

اول اینکه برای جدولی که طراحی کردم ، SP پایین رو چطور تغییر بدم ؟ و اگر ممکن هست یک مثال برای فراخوانی SP جدولم تو Pdo میخوام .

دوم اینکه : هر جا صحبت از امنیت کوئری ها شده اکثرا" در کنارش اسم SP ها اومده ، معنی اش اینکه اگر کوئری ها رو فقط با دستورات pdo اجرا کنیم
باز هم احتمال هک شدن هست ، یا برداشت من اشتباه بوده ؟

Mohammadsgh
سه شنبه 20 مرداد 1394, 22:40 عصر
ببینید sp میاد از همه منابع سرور استفاده میکنه که باعث میشه سرعت اجرای query بیشتر بشه.کارش همینه.در حالت عادی mysql از همه منابع سرور استفاده نمیکنه

بیتا حکمت
چهارشنبه 21 مرداد 1394, 00:11 صبح
ببینید sp میاد از همه منابع سرور استفاده میکنه که باعث میشه سرعت اجرای query بیشتر بشه.کارش همینه.در حالت عادی mysql از همه منابع سرور استفاده نمیکنه

ممنون ، اگر ممکنه در مورد سوال اول هم راهنمایی کنن .

Unique
چهارشنبه 21 مرداد 1394, 04:14 صبح
هر جا صحبت از امنیت کوئری ها شده اکثرا" در کنارش اسم SP ها اومده ، معنی اش اینکه اگر کوئری ها رو فقط با دستورات pdo اجرا کنیم
باز هم احتمال هک شدن هست ، یا برداشت من اشتباه بوده ؟

نمیدونم چرا برای کار های ساده ای مثل لاگین میخواین از SP استفاده کنید. PDo وMySQLi از Parametric Query ها یا همون Prepared Statement ها استفاده میکنند و در این حالت injection اصلا معنی نمیده :

$stmt = $mysqli->prepare("select u_id from users where u_username = ? and u_password = ?");
$stmt->bind_param("ss", $username,$password);
$stmt->execute();

Stored Procedure زمانی کاربرد دارن که شما توی یک روال میخواین خروجی های متنوع با شرط و حلقه و غیره با سرعت بالا بگیرین. حتی اگه prepared statement را استفاده نکنید و از همون escape کرد نبه درستی استفاده کنین هیچ مشکل امنیتی نخواهین داشت.

کلا خانوم حکمت خودتون را برای چنین چیز هایی با SP درگیر نکنین.

بیتا حکمت
چهارشنبه 21 مرداد 1394, 08:07 صبح
نمیدونم چرا برای کار های ساده ای مثل لاگین میخواین از SP استفاده کنید. PDo وMySQLi از Parametric Query ها یا همون Prepared Statement ها استفاده میکنند و در این حالت injection اصلا معنی نمیده :

$stmt = $mysqli->prepare("select u_id from users where u_username = ? and u_password = ?");
$stmt->bind_param("ss", $username,$password);
$stmt->execute();

Stored Procedure زمانی کاربرد دارن که شما توی یک روال میخواین خروجی های متنوع با شرط و حلقه و غیره با سرعت بالا بگیرین. حتی اگه prepared statement را استفاده نکنید و از همون escape کرد نبه درستی استفاده کنین هیچ مشکل امنیتی نخواهین داشت.

کلا خانوم حکمت خودتون را برای چنین چیز هایی با SP درگیر نکنین.

ممنونم که تذکر دادین ، تصورم این بود که این یک ضروررته ، که حتما باید با SP کار کنیم . من همونطور که شما گفتین عمل می کنم .
اما صرفا" برای مواردی که به SP نیاز خواهد بود (جهت یادگیری می پرسم ) ، اگر زحمتی نیست بفرمایین که برای اون جدولی که
طراحی کردم اگر قرار بود از Sp استفاده کنم (منظورم بررسی لاگین با بوسیله Pdo و SP هست )
من نوشتن SP رو یاد گرفتم ، ولی اینکه چطور از طریق php می تونم به SP که در Mysql هست ورودی بفرستم مثلا همون یوزر و پسورد
و اینکه چطور خروجی این SP رو در php بدست بیارم برام گنگ هست . بازم ممنونم .

Unique
چهارشنبه 21 مرداد 1394, 10:58 صبح
با استفاده از call مثل نوشتتن یک جمله select اینطوری :


sprintf("call IsUserPasswordValid('%s','%s')",$username,$password);