PDA

View Full Version : نحوه بک آپ گیری توسط کاربران



علی رضائی
شنبه 28 اردیبهشت 1392, 19:23 عصر
لطفا راهنمایی بفرمایید چگونه دستوری را با php بنویسم که کاربران با اجرای آن بتوانند از یک جدول در دیتابیس سایت بک آپ آخرین تغییرات را به صورت یک فایل mysql دریافت کنند. متشکرم

dousti_design
شنبه 28 اردیبهشت 1392, 19:52 عصر
اینجا (http://davidwalsh.name/backup-mysql-database-php) یه تابع نوشته که نام جدول رو میگیره و فایل بک آپ(شامل دستورات insert مانند بک آپی که توی PhpMyAdmin میگیرید) بهتون میده.

علی رضائی
شنبه 28 اردیبهشت 1392, 21:39 عصر
اینجا (http://davidwalsh.name/backup-mysql-database-php) یه تابع نوشته که نام جدول رو میگیره و فایل بک آپ(شامل دستورات insert مانند بک آپی که توی PhpMyAdmin میگیرید) بهتون میده.

ضمن تشکر
من اون تابع رو در یک فایل php ذخیره کردم و در سایت فراخوانی کردم اما هیچ اتفاقی نیافتاد. البته من مبتدی هستم اگه راهنمایی بیشتری بفرمایید ممنون می شم.

این هم کد تغییر یافته

<?php
backup_tables('localhost', 'ali','123456','T_afrad');

/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = 'T_afrad')
{

$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);

//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}

//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);

$return.= 'DROP TABLE '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= "\n\n".$row2[1].";\n\n";

for ($i = 0; $i < $num_fields; $i++)
{
while($row = mysql_fetch_row($result))
{
$return.= 'INSERT INTO '.$table.' VALUES(';
for($j=0; $j<$num_fields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j (file://\\n",$row[$j)]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}

//save file
$handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
fwrite($handle,$return);
fclose($handle);
}
?>

dousti_design
شنبه 28 اردیبهشت 1392, 22:00 عصر
این کد:


<?php
backup_tables('localhost','root','','test');


/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{

$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);

//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}

//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);

$return.= 'DROP TABLE '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= "\n\n".$row2[1].";\n\n";

for ($i = 0; $i < $num_fields; $i++)
{
while($row = mysql_fetch_row($result))
{
$return.= 'INSERT INTO '.$table.' VALUES(';
for($j=0; $j<$num_fields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}

//save file
$handle = fopen('db-backup.sql','w+');
fwrite($handle,$return);
fclose($handle);
}
?>
<a href="db-backup.sql">Download Sql Backup</a>


یک فایل متنی با پسوند .sql در مسیر اجرای فایل با نام db-backup.sql ایجاد میکنه.
نام سرور: localhost
نام کاربری: root
پسورد: بدون پسورد(خالی)
نام دیتابیس: test
نام جداول: تمامی جدول ها(*)

eshpilen
شنبه 28 اردیبهشت 1392, 23:24 عصر
یعنی کاربران بکاپ بگیرن بصورت یک فایل SQL و بعدا بتونن اون رو در سایت اجرا کنن؟
خب اینطوری که خودش یه حفرهء کامل و راحت واسه SQL Injection میشه.
یعنی مثلا کاربر میتونه هر فرمان SQL دلخواهی رو توی فایل بذاره یا دستکاری کنه.

abolfazl-z
یک شنبه 29 اردیبهشت 1392, 00:28 صبح
نقل قول: نحوه بک آپ گیری توسط کاربران
یعنی کاربران بکاپ بگیرن بصورت یک فایل SQL و بعدا بتونن اون رو در سایت اجرا کنن؟
خب اینطوری که خودش یه حفرهء کامل و راحت واسه SQL Injection میشه.
یعنی مثلا کاربر میتونه هر فرمان SQL دلخواهی رو توی فایل بذاره یا دستکاری کنه.


طبق گفته بالا چنین کاری اشتباه هست ! شما باید طوری دیگر اطلاعات را خروجی بدهید! سپس با الگوریتم های خاصی واکشی کنید در ضمن درهنگام واکشی باید جلوی هر گونه خطر (sql ...) را بگیرید!

علی رضائی
یک شنبه 29 اردیبهشت 1392, 21:50 عصر
طبق گفته بالا چنین کاری اشتباه هست ! شما باید طوری دیگر اطلاعات را خروجی بدهید! سپس با الگوریتم های خاصی واکشی کنید در ضمن درهنگام واکشی باید جلوی هر گونه خطر (sql ...) را بگیرید!

مگر برای sql اینجکشن دستیابی به یوزر و پسورد نیاز نیست در کد php که این اطلاعات به کاربر نشان داده نمی شه
کاربر اطلاعات رو در ویندوز اپلیکیشن بصورت افلاین استفاده می کنه.
و بک آپ گیری هم الان انجام شد ولی مشکل اینجاست که فایل اس کیو ال دریافتی رو چگونه از دلفی به دیتابیس اکسس وارد کنم.

dousti_design
یک شنبه 29 اردیبهشت 1392, 21:56 عصر
مگر برای sql اینجکشن دستیابی به یوزر و پسورد نیاز نیست در کد php که این اطلاعات به کاربر نشان داده نمی شه
کاربر اطلاعات رو در ویندوز اپلیکیشن بصورت افلاین استفاده می کنه.
و بک آپ گیری هم الان انجام شد ولی مشکل اینجاست که فایل اس کیو ال دریافتی رو چگونه از دلفی به دیتابیس اکسس وارد کنم.

برای بک آپ گیری توسط کاربر این روش اصلا توصیه نمیشه و من هم حواسم به پست آغازین نبود که نوشتین توسط کاربر.
برای sql injection این روش یک باگ( باگ که چه عرض کنم، اتوبان) بزرگ هست.
نام جداول، نام فیلدها، نوع فیلدها و... در اختیار کاربر قرار میگیره و همینطور میتونه یک کوئری رو به اجرا در بیاره.
من خروجی اکسل رو توصیه میکنم که اطلاعات در یک فایل .csv ذخیره بشه و در موقع بازیابی هم خونده بشه.
البته باز هم باید مراقب injection باشید.
برای این کار میتونید از کلاس قدرتمند PHPEXCEL (http://phpexcel.codeplex.com/) استفاده کنید.

علی رضائی
دوشنبه 30 اردیبهشت 1392, 14:14 عصر
ممنون از راهنمایی هاتون.
من به توصیه های امنیتی دوستان توجه کردم و از روش خروجی به فرمت csv استفاده کردم
حالا برای فراخوانی اطلاعات از csv به جداول دیتابیس اکسس از داخل دلفی مشکل دارم. اگه راهنمایی کنید ممنون می شم.

eshpilen
دوشنبه 30 اردیبهشت 1392, 15:19 عصر
اصلا این بکاپ گیری توسط کاربر واسه چیه؟
هر کاربری هر موقع بخواد میتونه بکاپ بگیره و هر موقع بخواد میتونه بکاپ رو به خورد سیستم بده و ریستور کنه؟
بعد اونوقت اگر اطلاعات داخل فایل بکاپ جعلی بود یا دستکاری شده بود هیچ مشکل امنیتی بوجود نمیاد؟
راستی اینو درنظر گرفتید که کسی فایل بکاپ دستکاری شده که به اسم کاربر دیگری درآورده رو نتونه اجرا کنه؟
اصلا برنامهء شما چیه کاربرانش کیا هستن؟ افرادی شناخته شده و مورد اعتماد، یا نه؟

علی رضائی
دوشنبه 30 اردیبهشت 1392, 17:36 عصر
کاربرا نمی تونن اطلاعات رو به سایت ارسال کنن فقط اطلاعات رو دریافت می کنن و به دیتابیس اکسس یک نرم افزار آموزشی وارد می کنن. تا بتونن با سرعت بیشتری کار کنن و از طرفی اساتید دیتا ها رو از روی اینترنت بروز می کنن و کاربرا هر وقت خواستند آخرین اصلاحات رو با بک آپ گیری از سایت مجددا وارد نرم افزار می کنن.

eshpilen
دوشنبه 30 اردیبهشت 1392, 20:44 عصر
پس اصلا استفاده از اصطلاح بکاپ گیری چندان صحیح نبوده.
چون بکاپ یعنی پشتیبان گیری برای وقتی که بخوان دیتا رو دوباره با استفاده از اون بکاپ ها برگردونن.
با همین عنوان و مطالب نادقیق ما رو سر کار گذاشتید :اشتباه:

علی رضائی
دوشنبه 30 اردیبهشت 1392, 21:32 عصر
البته برگردوندن بک آپ توسط کاربران انجام می شه ولی نه برای دیتابیس سایت بلکه برای دیتابیس ویندوز اپلیکیشن . و بهتره که منو در مورد مشکل مطرح شده راهنمایی کنید.
مشکل رو به یه شکل دیگه مطرح می کنم. کسی میدونه چه جوری می شه خروجی دیتابیس my sql رو به اکسس انجام بده. درحال حاضر با فایل زیر به صورت اکسل انجام می شه ولی من می خوام اکسس باشه.ممنون از صرف وقتی که برای راهنمایی می کنید.
<?php
//--------------------------------------------------------------------------
// This is where you specify your Database connection stuff
//
// mysql_connect -- Open a connection to a MySQL Server / die -- Alias of exit()
//
//--------------------------------------------------------------------------
$db_name = "db1"; //This is your database Name
$link = mysql_connect("localhost", "username", "pass") or die("Could not connect to server!");
mysql_set_charset('utf8',$link);
//This is your table name. This is a one table config to do more table you will need to rework the code.
$table_name = 'medical';
$select_db = mysql_select_db($db_name, $link); // mysql_select_db -- Select a MySQL database
mysql_query("SET NAMES 'utf8'");
$query = "SELECT * FROM " . $table_name;
$result = mysql_query($query, $link) or die("Could not complete database query"); //mysql_query -- Send a MySQL query
$num = mysql_num_rows($result); //mysql_num_rows -- Get number of rows in result
$num2=mysql_num_fields($result);
$query="SHOW COLUMNS FROM ".$table_name;
$result1=mysql_query($query);
//$fields=mysql_fetch_array($result1);
$header="";
for ($i = 0; $i < $num2; $i++) {
$header .= mysql_field_name($result, $i) . "\t";
}
if ($num != 0) {
//--------------------------------------------------------------------------
// XML Header Tag Goes Here
//--------------------------------------------------------------------------
$_xml ="<?xml version='1.0' encoding='UTF-8' standalone='yes'?>\r\n";
$_xml.="<dataroot xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>\r\n";
//--------------------------------------------------------------------------
// This while loop loops throught the data found from the above query and
// generates the XML Doc.
//--------------------------------------------------------------------------
while ($row = mysql_fetch_array($result)) { //mysql_fetch_array -- Fetch a result row as an associative array, a numeric array, or both.
while ($row=mysql_fetch_array($result)){
$_xml .="\t<Table1>\r\n";
mysql_data_seek($result1,0);
$i=0;
while($f=mysql_fetch_array($result1)){
if($row[$i]<>'') $_xml.="\t\t<".$f[0].">".$row[$i]."</".$f[0].">\r\n";
$i++;
}
$_xml.="\t</Table1>\r";
}
}
$_xml.="</dataroot>";
header("Content-Type: application/vnd.ms-excel; charset=utf-8");
header("Content-Disposition: attachment; filename=filename.xls");
header("Pragma: no-cache");
header("Expires: 0");
header("Lacation: excel.htm?id=yes");
print "$_xml";
} else {
echo "No Records found";
}
?>