View Full Version : امنیت در mysql
p30rex
پنج شنبه 23 خرداد 1392, 11:27 صبح
سلام
من از یه همچین کدی استفاده میکنم:
$test = $_GET['test'];
$query = "SELECT `id` ّFROM table WHERE `id` = $test ";
حالا با توجه به اینکه ورودی کاربر مستقیما تو query استفاده میشه، امنیت نداره
برای بالا بردن امنیت باید چکاری انجام بدم؟
abbas_ali
پنج شنبه 23 خرداد 1392, 11:42 صبح
باید ورودیت رو escape کنی توسط توابع خود mysql
mysql_real_escape_string
eshpilen
پنج شنبه 23 خرداد 1392, 12:04 عصر
اینجا چون متغییر عددی است و داخل کوتیشن نمیذارید، mysql_real_escape_string به تنهایی کافی نیست.
یا باید متغییر رو بعد از اسکیپ کردن با mysql_real_escape_string داخل کوتیشن هم بذاری (البته این سینتاکس استانداردی نیست، ولی حداقل در MySQL بدون مشکل کار میکنه)، یا از توابع مخصوص اعداد برای اعتبارسنجی/بی خطر کردن اون استفاده کنی.
sh.n.n786
پنج شنبه 23 خرداد 1392, 22: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, 20: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, 20: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, 01:02 صبح
کسی جوابمو نمیده؟!!
مهرداد سیف زاده
شنبه 25 خرداد 1392, 11:44 صبح
اینجا چون متغییر عددی است و داخل کوتیشن نمیذارید، mysql_real_escape_string به تنهایی کافی نیست.
یا باید متغییر رو بعد از اسکیپ کردن با mysql_real_escape_string داخل کوتیشن هم بذاری (البته این سینتاکس استانداردی نیست، ولی حداقل در MySQL بدون مشکل کار میکنه)، یا از توابع مخصوص اعداد برای اعتبارسنجی/بی خطر کردن اون استفاده کنی.
من دیدم از تابع addslash و htmlentity هم استفاده کردن. یا خودم با regular expression مقدارهای گرفته شده رو میسنجم اگر خارج از اعداد و حروف باشه(کاراکترهای غیرمجاز) کاربر رو از سایت پرتش میکنم به صفحه 404 میخواستم ببینم کاربرد اینها چطوره؟ جواب میده؟
engmmrj
شنبه 25 خرداد 1392, 13:40 عصر
بهترین روش استفاده از stored procedure است ، که هم سرعت میره بالا و injection صفر میشه .
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.