PDA

View Full Version : امنیت در mysql



p30rex
پنج شنبه 23 خرداد 1392, 10:27 صبح
سلام
من از یه همچین کدی استفاده میکنم:


$test = $_GET['test'];
$query = "SELECT `id` ّFROM table WHERE `id` = $test ";

حالا با توجه به اینکه ورودی کاربر مستقیما تو query استفاده میشه، امنیت نداره
برای بالا بردن امنیت باید چکاری انجام بدم؟

abbas_ali
پنج شنبه 23 خرداد 1392, 10:42 صبح
باید ورودیت رو escape کنی توسط توابع خود mysql
mysql_real_escape_string

eshpilen
پنج شنبه 23 خرداد 1392, 11:04 صبح
اینجا چون متغییر عددی است و داخل کوتیشن نمیذارید، mysql_real_escape_string به تنهایی کافی نیست.
یا باید متغییر رو بعد از اسکیپ کردن با mysql_real_escape_string داخل کوتیشن هم بذاری (البته این سینتاکس استانداردی نیست، ولی حداقل در MySQL بدون مشکل کار میکنه)، یا از توابع مخصوص اعداد برای اعتبارسنجی/بی خطر کردن اون استفاده کنی.

sh.n.n786
پنج شنبه 23 خرداد 1392, 21:17 عصر
درود و ...
من این کدو این شکلی نوشتم :



$test = isset($_GET['test']) ? mysql_real_escape_string($_GET['test']) : '1';
$query = "SELECT `id` ّFROM table WHERE `id` = {intval($test)} LIMIT 1;";

موفق باشی

p30rex
جمعه 24 خرداد 1392, 19:26 عصر
اینجا چون متغییر عددی است و داخل کوتیشن نمیذارید، mysql_real_escape_string به تنهایی کافی نیست.
یا باید متغییر رو بعد از اسکیپ کردن با mysql_real_escape_string داخل کوتیشن هم بذاری (البته این سینتاکس استانداردی نیست، ولی حداقل در MySQL بدون مشکل کار میکنه)، یا از توابع مخصوص اعداد برای اعتبارسنجی/بی خطر کردن اون استفاده کنی.

از تابع bind_param تو mysqli استفاده کردم:


if ($stmt = $mysqli->prepare("SELECT id, username, password, salt, mode FROM members WHERE username = ? LIMIT 1")) {
$stmt->bind_param('s', $username); // Bind "$username" to parameter.
{

اما چرا وقتی کد رو مث پایین مینویسم جواب نمیده؟


prepare("SELECT id, username, password, salt, mode FROM members ORDER BY ?")

p30rex
جمعه 24 خرداد 1392, 19:35 عصر
اینجا چون متغییر عددی است و داخل کوتیشن نمیذارید، mysql_real_escape_string به تنهایی کافی نیست.
یا باید متغییر رو بعد از اسکیپ کردن با mysql_real_escape_string داخل کوتیشن هم بذاری (البته این سینتاکس استانداردی نیست، ولی حداقل در MySQL بدون مشکل کار میکنه)، یا از توابع مخصوص اعداد برای اعتبارسنجی/بی خطر کردن اون استفاده کنی.

از تابع bind_param تو mysqli استفاده کردم:


if ($stmt = $mysqli->prepare("SELECT id, username, password, salt, mode FROM members WHERE username = ? LIMIT 1")) {
$stmt->bind_param('s', $username); // Bind "$username" to parameter.
{

اما چرا وقتی کد رو مث پایین مینویسم جواب نمیده؟


prepare("SELECT id, username, password, salt, mode FROM members ORDER BY ?")

p30rex
شنبه 25 خرداد 1392, 00:02 صبح
کسی جوابمو نمیده؟!!

مهرداد سیف زاده
شنبه 25 خرداد 1392, 10:44 صبح
اینجا چون متغییر عددی است و داخل کوتیشن نمیذارید، mysql_real_escape_string به تنهایی کافی نیست.
یا باید متغییر رو بعد از اسکیپ کردن با mysql_real_escape_string داخل کوتیشن هم بذاری (البته این سینتاکس استانداردی نیست، ولی حداقل در MySQL بدون مشکل کار میکنه)، یا از توابع مخصوص اعداد برای اعتبارسنجی/بی خطر کردن اون استفاده کنی.

من دیدم از تابع addslash و htmlentity هم استفاده کردن. یا خودم با regular expression مقدارهای گرفته شده رو میسنجم اگر خارج از اعداد و حروف باشه(کاراکترهای غیرمجاز) کاربر رو از سایت پرتش میکنم به صفحه 404 میخواستم ببینم کاربرد این‌ها چطوره؟ جواب میده؟

engmmrj
شنبه 25 خرداد 1392, 12:40 عصر
بهترین روش استفاده از stored procedure است ، که هم سرعت میره بالا و injection صفر میشه .