در حال ویرایش ذخیره سازی ناامن داده(Insecure Data Storage)

از Secure Coding

هشدار: شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر وارد شوید یا یک حساب کاربری بسازید، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.

این ویرایش را می‌توان خنثی کرد. لطفاً تفاوت زیر را بررسی کنید تا تأیید کنید که این چیزی است که می‌خواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثی‌سازی ویرایش را به پایان ببرید.

نسخهٔ فعلی متن شما
سطر ۶۲: سطر ۶۲:
  
  
== Sqlite ==
 
  
همانطور که می دانید یک از پرکاربردترین و قدیمی ترین پایگاه داد ها برای نگهداری داده های sqlite است.
 
فایل های با پسوند .db حاوی رکورد های این پایگاه داده است.
 
  
اتصال به پایگاه داده با نام کاربری و کلمه عبور hardcode شده در کد اتصال دارای ریسک است.
 
  
برای مثال کد زیر را در نظر بگیرید:
 
  
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
SQLiteDatabase notSoSecure = openOrCreateDatabase("privateNotSoSecure", MODE_PRIVATE, null);
 
notSoSecure.execSQL("CREATE TABLE IF NOT EXISTS Accounts(Username VARCHAR, Password VARCHAR);");
 
notSoSecure.execSQL("INSERT INTO Accounts VALUES('admin','AdminPass');");
 
notSoSecure.close();
 
</pre>
 
</div>
 
  
برای جلوگیری از این آسیب پذیری می توان از کتابخانه SQLCipher به صورت زیر استفاده نمود:
 
  
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
SQLiteDatabase secureDB = SQLiteDatabase.openOrCreateDatabase(database, "password123", null);
 
secureDB.execSQL("CREATE TABLE IF NOT EXISTS Accounts(Username VARCHAR,Password VARCHAR);");
 
secureDB.execSQL("INSERT INTO Accounts VALUES('admin','AdminPassEnc');");
 
secureDB.close();
 
</pre>
 
</div>
 
  
نکته مهم:
 
  
برای جلوگیری از درج کلمه عبور پایگاه داده به صورت مستقیم در کد، می توانید هنگام ورود برنامه کلمه عبور رمزنگاری شده ارتباط با پایگاه داده را با اطلاعات وارد شده از طرف کاربر رمزگشایی کنید.
 
  
== Realm ==
 
 
پایگاه داده های Realm که به نوعی جایگزین sqlite امروز بسیار استفاده می شود.
 
 
کد زیر بدون رمزنگاری برای اتصال به این پایگاه داده در نظر بگیرید:
 
 
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
RealmConfiguration realmConfig = new RealmConfiguration.Builder()
 
                .name("tasky.realm")
 
                .schemaVersion(0)
 
                .build();
 
        Realm.setDefaultConfiguration(realmConfig);
 
</pre>
 
</div>
 
 
حال کد زیر را در نظر بگیرید:
 
 
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
RealmConfiguration config = new RealmConfiguration.Builder()
 
  .encryptionKey(getKey())
 
  .build();
 
 
Realm realm = Realm.getInstance(config);
 
</pre>
 
</div>
 
 
برای getKey() هم می توان از keystore و یا از سرور درخواست کلید نمود.
 
 
 
== Internal Storage ==
 
 
دسترسی به internal storage به صورت پیش فرض توسط سایر برنامه ها ممکن نیست.
 
 
ولی اگر ذخیره سازی داده های به صورت ناامن و به شکل زیر و استفاده از حالت های `MODE_WORLD_READABLE` و `MODE_WORLD_WRITEABLE` باشد دسترسی سایر برنامه ها به internal storage برنامه امکان پذیر است.
 
 
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
FileOutputStream fos = null;
 
try {
 
  fos = openFileOutput(FILENAME, Context.MODE_WORLD_READABLE);
 
  fos.write(test.getBytes());
 
  fos.close();
 
} catch (FileNotFoundException e) {
 
  e.printStackTrace();
 
} catch (IOException e) {
 
  e.printStackTrace();
 
}
 
</pre>
 
</div>
 
 
حالت امن تر استفاده از MODE_PRIVATE در ذخیره سازی است.
 
 
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
FileOutputStream fos = null;
 
try {
 
  fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
 
  fos.write(test.getBytes());
 
  fos.close();
 
} catch (FileNotFoundException e) {
 
  e.printStackTrace();
 
} catch (IOException e) {
 
  e.printStackTrace();
 
}
 
</pre>
 
</div>
 
 
== External Storage ==
 
 
می توان داد ها را در دستگاه های جانبی مانند SD Card ذخیره نمود.
 
 
ولی هنگام write بر روی دستگاه های جانبی فایلی در این مسیر ایجاد خواهد شد:
 
 
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
/sdcard/Android/data/com.company.app/files/save/appdata/save_appdata
 
</pre>
 
</div>
 
 
کد زیر را در نظر بگیرید:
 
 
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
private String filename = "myfile"
 
 
private String string = "sensitive data such as credit card number"
 
FileOutputStream fos = null;
 
 
try {
 
  File file = new File(getExternalFilesDir(TARGET_TYPE), filename);
 
  fos = new FileOutputStream(file, false);
 
  fos.write(string.getBytes());
 
} catch (FileNotFoundException e) {
 
  // handle FileNotFoundException
 
} catch (IOException e) {
 
  // handle IOException
 
} finally {
 
  if (fos != null) {
 
    try {
 
    fos.close();
 
    } catch (IOException e) {
 
      // handle error
 
    }
 
  }
 
}
 
</pre>
 
</div>
 
 
برای جلوگیری از این آسیب پذیری می توان از openFileOutput و حالت MODE_PRIVATE  به صورت زیر استفاد نمود:
 
 
<div lang="en" dir="ltr" class="mw-content-ltr">
 
<pre>
 
private String filename = "myfile"
 
private String string = "sensitive data such as credit card number"
 
FileOutputStream fos = null;
 
 
try {
 
  fos = openFileOutput(filename, Context.MODE_PRIVATE);
 
  fos.write(string.getBytes());
 
  fos.close();
 
} catch (FileNotFoundException e) {
 
  // handle FileNotFoundException
 
} catch (IOException e) {
 
  // handle IOException
 
} finally {
 
  if (fos != null) {
 
    try {
 
      fos.close();
 
    } catch (IOException e) {
 
      // handle error
 
    }
 
  }
 
}
 
</pre>
 
</div>
 
  
  
 
[[category:ذخیره سازی ناامن داده(Insecure Data Storage)]]
 
[[category:ذخیره سازی ناامن داده(Insecure Data Storage)]]

لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در Secure Coding ممکن است توسط دیگر مشارکت‌کنندگان تغییر یابند، ویرایش یا حذف شوند. اگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شوند؛ بنابراین، آنها را اینجا ارائه نکنید.
شما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید (Secure Coding:حق تکثیر را برای جزئیات بیشتر ببینید). کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!

لغو راهنمای ویرایش‌کردن (در پنجرهٔ تازه باز می‌شود)