PDA

View Full Version : سوال: نمیتونم از bindParam تو fulltext search استفاده کرد



DelDard
سه شنبه 01 فروردین 1396, 18:15 عصر
سلام
وقتی keywordی که گرفتم رو یکراست میزارم تو کوئری مشکلی نداره و درست کار میکنه:



$keyword = $_POST['keyword'];
$query = "SELECT * FROM info WHERE MATCH(name,lname,fathersname) AGAINST ('$keyword' IN BOOLEAN MODE);";

$result = $db->prepare($query);

$result->execute();
$results = $result->fetchAll();
var_dump($results);


اما خب این امن نیست و باید کلمه ورودی رو فیلتر کرد با bindParam مثل کد زیر:



$keyword = $_POST['keyword'];
$query = "SELECT * FROM info WHERE MATCH(name,lname,fathersname) AGAINST (':keyword' IN BOOLEAN MODE);";

$result = $db->prepare($query);

$result->bindParam(':keyword', $keyword, PDO::PARAM_STR);

$result->execute();
$results = $result->fetchAll();
var_dump($results);


اما این جوری به من هیچ نتیجه ایی نمیده!! مشکل اینجاست که ارور هم نمیده که بخونم بدونم مشکل از کجاست فقط یه آرایه خالی میشه نتیجه سرچ

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

تشکر از شما دوستان

Mohammadsgh
سه شنبه 01 فروردین 1396, 22:33 عصر
این لینک رو ببینید
http://stackoverflow.com/questions/13682355/pdo-and-mysql-fulltext-searches

DelDard
چهارشنبه 02 فروردین 1396, 11:57 صبح
ممنون از لطف شما دوست گرامی
این لینک رو قبل از تاپیک با سرچ پیدا کرم ولی فکر نکنم این دقیق جواب سوال باشه.

مشکل ما با وجود کوتیشن نیست. چون تو کد اول که گذاشتم حتی با کوتیشن هم کار میکنه کد. مشکل اینه که وقتی bindParam استفاده نکنیم در برابر تزریق کوئری مقاوم نیست.

حالا دو تا حالت داره:
اگه تابع quote به تنهایی امنیت ایجاد میکنه (که بعیده چون انگار فقط دوتا کوتیشن میذاره رو استرینگ) و جایگزینی برای bindParam هست که خب هیچی مشکل حل شد.

اما اگه نیست کد ما همچنان آسیب پذیره.

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

تشکر از شما

Unique
چهارشنبه 02 فروردین 1396, 16:21 عصر
دوست عزیز ، توی Stackoverflow کامل توضیح داده.

این مشکل توی نسخه های قدیمی MySQL هست و مشکل این هست که AGAINST فقط CONSTANT STRING میگیره و نه Query Parameter. پس شما باید حتما inline بنویسین نه پارامتریک ! (قدیمی منظورم ۲۰۱۳ یعنی ۴ سال پیشه)
در مورد امنیت quote هم خود سایت php.net میگه :

PDO::quote() places quotes around the input string (if required) and escapes special characters within the input string, using a quoting style appropriate to the underlying driver.

در واقع این متد شبیه به mysqli_real_escape_string عمل میکنه اما کاملا واضح هست که استفاده از prepare و bind کردن پارامتر ها کاملا توصیه میشه تا escape کردن ! اما به خاطر داشته باش همین escape هم بالا ۹۹ درصد جلوی injection را میگیره مگر در موراد خاص که از حوصله این مطلب خارجه !

برای رفع مشکلت و استفاده از prepare بهتره از mysql 5.5.31 به بعد ! یا بهتر از اون Maria DB استفاده کنی !