Bright Moon

جلوگیری از حمله به SQL

8 پست در این موضوع قرار دارد

سلام.

بازم سوال مربوط به cms تمرینی و جدید :D

و مربوط به ادامه مطلب

از صفحه اول وقتی میخوام لینک به ادامه مطلب بدم، با متد get آیدی اون مطلب(ریکورد) رو میفرستم به صفحه سینگل.

حالا از اونجایی که داخل صفحه سینگل اون آی دی رو میگیرم و باهاش به mysql درخواست فچ میدم، ممکنه کاربر یه سری دستورات اضافه انتهای همون متد بزنه که به دیتابیس نفوذ کنه.

برای پیشگیری از این نفوذ به فکر خودم اینطور رسید که داخل صفحه سینگل اول ورودی get رو بریزم داخل یک متغیر. یه عمل ریاضی روش اجام بدم (مثلاً با 1 جمع کنم). بعد حاصل رو یه مقایسه انجام بدم(مثلا اگر بزرگتر از 1 و کوچتر از 100000بود).

حالا عمل ریاضی رو برگرونم و مقدارش رو بزارم توی کوئری mysql. اینطوری میتونم تا حدودی مطمئن بشم که متد دریافتی من فقط عدد بوده...

اگر ممکنه راه بهتری رو بهم نشون بدید.

مشکل این ایده منم بگید.

ممنون

0

به اشتراک گذاری این پست


لینک به پست

برای اینکه مطمئن بشی مقداری یک عدد هست میتونی از تابع is_numeric استفاده کنی ، اگر ورودیش عدد بود مقدار true و اگر نبود false را برمیگیرداند

1

به اشتراک گذاری این پست


لینک به پست

اگه تولید لینک یکتا برای هر ادامه مطلب مد نظرتون نیست با SESSION ارسال کنید

3

به اشتراک گذاری این پست


لینک به پست

برای اینکه مطمئن بشی مقداری یک عدد هست میتونی از تابع is_numeric استفاده کنی ، اگر ورودیش عدد بود مقدار true و اگر نبود false را برمیگیرداند

بله ممنون

سوال بنده اینه که آیا همین چک کردن نوع ورودی، امنیت کافی رو به ما میده؟

اگه تولید لینک یکتا برای هر ادامه مطلب مد نظرتون نیست با SESSION ارسال کنید

ممنون دوست عزیز

اما خب "لینک برای ادامه مطلب" حتماً نیاز به لینک یکتایی که فرمودید داره.

دقیقاً کاربر تنها با آدرس وارد کردن باید بتونه دسترسی به صفحه مطلب رو داشته باشه.

0

به اشتراک گذاری این پست


لینک به پست

شما میتونین 2 تا کار انجام بدید

1. مقادیر رو به صورت پارامتر به دیتابیس ارسال کنید مثلا اگه از pdo استفاده میکنید با استفاده از تابع prepare و execute استفاده کنید

2.قبل از ارسال مقدار به کوئری اونو اعتبار سنجی کنید مثلا با استفاده از تابع is_numeric یا با استفاده از ریجکس \d+ اونو اعتبار سنجی کنید

2

به اشتراک گذاری این پست


لینک به پست

ببینید اگر می خواید مقدار ارسالی در get رو بگید ، خوب بالا خره یک چیزی در url میره و اگر کاربر با تغییر اونا بخواد وارد بشه خوب بهش 404 میده

اما اگر م یخواید از تزریق sql جلوگیری کنید از توابع امنیتی html_specialchar و real_scape_string استفاده کنید.

1

به اشتراک گذاری این پست


لینک به پست

شما میتونین 2 تا کار انجام بدید

1. مقادیر رو به صورت پارامتر به دیتابیس ارسال کنید مثلا اگه از pdo استفاده میکنید با استفاده از تابع prepare و execute استفاده کنید

ممنون وایپر جان

منم در مورد پارامتر شنیده بودم.

امکانش هست برای کار با پارامتر توضیحات بیشتر بدید؟

یا یه لینک مفید...

متشکر

0

به اشتراک گذاری این پست


لینک به پست

مثال



[color=#000000][color=#0000BB]<?php[/color]
[color=#FF8000]/* Execute a prepared statement by passing an array of insert values */[/color]
[color=#0000BB]$calories [/color][color=#007700]= [/color][color=#0000BB]150[/color][color=#007700];[/color]
[color=#0000BB]$colour [/color][color=#007700]= [/color][color=#DD0000]'red'[/color][color=#007700];[/color]
[color=#0000BB]$sth [/color][color=#007700]= [/color][color=#0000BB]$dbh[/color][color=#007700]->[/color][color=#0000BB]prepare[/color][color=#007700]([/color][color=#DD0000]'SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?'[/color][color=#007700]);[/color]
[color=#0000BB]$sth[/color][color=#007700]->[/color][color=#0000BB]execute[/color][color=#007700](array([/color][color=#0000BB]$calories[/color][color=#007700], [/color][color=#0000BB]$colour[/color][color=#007700]));[/color]
[color=#0000BB]?>[/color] [/color]


http://www.php.net/manual/en/pdostatement.bindparam.php
http://www.php.net/manual/en/pdo.prepare.php

0

به اشتراک گذاری این پست


لینک به پست

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری