کارگاه مجازی فروش برنامه یک سمینار 5 قسمتی فروش برای برنامه نویسان و تولیدکنندگان نرم افزار است.
کارگاه مجازی فروش نرم افزار
کارگاه مجازی فروش برنامه یک سمینار 5 قسمتی فروش برای برنامه نویسان و تولیدکنندگان نرم افزار است.
نکات زیر، جالبترین نکات در خصوص شیوه حمله بوده که قابل توجه است:
ممکن است بپرسید، "من فقط یک توسعه دهنده اندرویدی کوچکی هستم که قصد دارم برنامه خودم را در یک مارکت اندرویدی بفروشم و قیمت این برنامه خیلی پایین است. بنابراین آیا واقعا باید زمانی را برای انجام این کار امنیتی از قبل هدر دهم؟
و من با صدای رسا جواب میدهم : "بله! باید این کار را انجام دهید." این کار باعث میشود تا در حین گسترش اپلیکیشن کوچک خود، دیگر نگران مشکلات حملات مستقیم یا غیرمستقیم نباشید.
حملات مستقیم (Direct Attacks)
حملات مستقیم به طور قابلتوجهی متفاوت هستند و میتوانند شکلهای گوناگونی برای حمله داشته باشند. یک حمله مستقیم میتواند به عنوان فردی که مستقیما در برنامه شما هدف قرار داده میشود، طبقهبندی شود. بنابراین، مهاجم به دنبال آسیب پذیری برای نفوذ در طراحی برنامه شما برای جمعآوری اطلاعات حساس در مورد شما و کاربرانتان است. استفاده از کاربران برنامه و یا حمله به کارگزار، از مواردی است که یک مهاجم در اولویت کار خود قرار میدهد! یک مهاجم ممکن است به دنبال برنامههای کاربردی تلفن همراه باشد که متعلق به یک نهاد دولتی است مثل، یک بانک خاص که شما اپلیکیشن آنرا روی تلفن خود نصب کردهاید و آپدیتهای امنیتی راهم انجام ندادهاید! اگر طرح امنیتی روی برنامه ضعیف باشد و دادههای حساس و حیاتی کاربران در محلی امن نگه داری نشود یا حتی ارتباط بین برنامه و ssl و سرور بدرستی برقرار نباشد، مهاجم میتواند حملات خاصی را روی ssl انجام دهد و نقاط ضعف را شناسایی کرده و در کسری از زمان به سرور متصل شود! این حمله یک حمله مستقیم و بدون دخالت فایل یا ابزار خاصی است. این یک حمله مستقیم به یک برنامه خاص است.
Proxim و ذخیره داده
بیایید با یک مثال ساده با نام Proxim شروع کنیم: برای نوشتن یک برنامه که میتواند یک SMS را به افراد خاص و معین ارسال کند، قرار دادی بستهایم؛ با توجه به نزدیکی به مجموعهای از مختصات مکانی آنها روی GPS. برای مثال: کاربر در این برنامه میتواند شماره تماس همسر خود را ذخیره کرده و هر زمان که به فاصله 3 مایلی به خانه یا محل کار برسد، با او تماس میگیرد. بدین صورت همسر فرد مطلع میشود که او نزدیک به محل کار یا خانه است و با یک تماس تلفنی او را آگاه میسازد.
کدهای زیر بخشی از فایل (Save Routine, SaveController. java) هستند:
package net.zenconsult.android.controller; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import net.zenconsult.android.model.Contact; import net.zenconsult.android.model.Location; import android.content.Context; import android.os.Environment; import android.util.Log; public class SaveController { private static final String TAG = "SaveController"; public static void saveContact(Context context, Contact contact) { if (isReadWrite()) { try { File outputFile = new File(context.getExternalFilesDir(null), contact.getFirstName()); FileOutputStream outputStream = new FileOutputStream(outputFile); outputStream.write(contact.getBytes()); outputStream.close(); } catch (FileNotFoundException e) { Log.e(TAG, "File not found"); } catch (IOException e) { Log.e(TAG, "IO Exception"); } } else { Log.e(TAG, "Error opening media card in read/write mode!"); } } public static void saveLocation(Context context, Location location) { if (isReadWrite()) { try { File outputFile = new File(context.getExternalFilesDir(null), location.getIdentifier()); FileOutputStream outputStream = new FileOutputStream(outputFile); outputStream.write(location.getBytes()); outputStream.close(); } catch (FileNotFoundException e) { Log.e(TAG, "File not found"); } catch (IOException e) { Log.e(TAG, "IO Exception"); } } else { Log.e(TAG, "Error opening media card in read/write mode!"); } } private static boolean isReadOnly() { Log.e(TAG, Environment .getExternalStorageState()); return Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment .getExternalStorageState()); } private static boolean isReadWrite() { Log.e(TAG, Environment .getExternalStorageState()); return Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState()); } }
کدهای فایل ( Location .java)
package net.zenconsult.android.model; publicclass Location { private String identifier; privatedouble latitude; privatedouble longitude; public Location() {} publicdouble getLatitude() { return latitude; } publicvoid setLatitude(double latitude) { this.latitude = latitude; } publicdouble getLongitude() { return longitude; } publicvoid setLongitude(double longitude) { this.longitude = longitude; } publicvoid setIdentifier(String identifier) { this.identifier = identifier; } public String getIdentifier() { return identifier; } public String toString() { StringBuilder ret = new StringBuilder(); ret.append(getIdentifier()); ret.append(String.valueOf(getLatitude())); ret.append(String.valueOf(getLongitude())); return ret.toString(); } publicbyte[] getBytes() { return toString().getBytes(); } }
کدهای فایل (Contact.java)
package net.zenconsult.android.model; publicclass Contact { private String firstName; private String lastName; private String address1; private String address2; private String email; private String phone; public Contact() {} public String getFirstName() { return firstName; } publicvoid setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } publicvoid setLastName(String lastName) { this.lastName = lastName; } public String getAddress1() { return address1; } publicvoid setAddress1(String address1) { this.address1 = address1; } public String getAddress2() { return address2; } publicvoid setAddress2(String address2) { this.address2 = address2; } public String getEmail() { return email; } publicvoid setEmail(String email) { this.email = email; } public String getPhone() { return phone; } publicvoid setPhone(String phone) { this.phone = phone; } public String toString() { StringBuilder ret = new StringBuilder(); ret.append(getFirstName() + "|"); ret.append(getLastName() + "|"); ret.append(getAddress1() + "|"); ret.append(getAddress2() + "|"); ret.append(getEmail() + "|"); ret.append(getPhone() + "|"); return ret.toString(); } publicbyte[] getBytes() { return toString().getBytes(); } }
final Contact contact = new Contact(); contact.setFirstName("User 1"); contact.setLastName("L1"); contact.setAddress1(""); contact.setAddress2(""); contact.setEmail("name@site.net"); contact.setPhone("12120031337");
U+202A: LEFT-TO-RIGHT EMBEDDING (LRE)
U+202B: RIGHT-TO-LEFT EMBEDDING (RLE)
U+202D: LEFT-TO-RIGHT OVERRIDE (LRO)
U+202E: RIGHT-TO-LEFT OVERRIDE (RLO)
U+202C: POP DIRECTIONAL FORMATTING (PDF)
using System;
using System.Diagnostics;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace RleTests
{
class Program
{
const char RightToLeftEmbedding = (char)0x202B;
const char PopDirectionalFormatting = (char)0x202C;
static string FixWeakCharacters(string data)
{
if (string.IsNullOrWhiteSpace(data)) return string.Empty;
var weakCharacters = new[] { @"\", "/", "+", "-", "=", ";", "$" };
foreach (var weakCharacter in weakCharacters)
{
data = data.Replace(weakCharacter, RightToLeftEmbedding + weakCharacter + PopDirectionalFormatting);
}
return data;
}
static void Main(string[] args)
{
using (var pdfDoc = new Document(PageSize.A4))
{
PdfWriter.GetInstance(pdfDoc, new FileStream("Test.pdf", FileMode.Create));
pdfDoc.Open();
FontFactory.Register("c:\\windows\\fonts\\Arial.ttf");
Font tahoma = FontFactory.GetFont("Arial", BaseFont.IDENTITY_H);
var table1 = new PdfPTable(1);
table1.WidthPercentage = 100;
var pdfCell = new PdfPCell
{
RunDirection = PdfWriter.RUN_DIRECTION_RTL,
Border = 0,
Phrase = new Phrase(FixWeakCharacters(
"تاریخ: " + "1390/11/18" + Environment.NewLine +
"شماره پروژه: " + "1/2/3/4/56" + Environment.NewLine +
"اسلش: " + " 12/A/13 " + Environment.NewLine +
"بک اسلش: " + " 12\\13\\14 " + Environment.NewLine +
"مساوی و جمع: " + " 2+3=5 " + Environment.NewLine +
"سمی کولون: " + " 2=1+1; " + Environment.NewLine +
"دلار: " + "12$" + Environment.NewLine +
"کاما: " + "12,34,67" + Environment.NewLine +
"نقطه: " + "12.34" + Environment.NewLine +
"پرانتز: " + "متن (ساده)"
),
tahoma)
};
table1.AddCell(pdfCell);
pdfDoc.Add(table1);
}
Process.Start("Test.pdf");
}
}
}
<span dir="ltr" style="display:inline">1390/11/19</span>
U+202A: LEFT-TO-RIGHT EMBEDDING (LRE)
U+202B: RIGHT-TO-LEFT EMBEDDING (RLE)
U+202D: LEFT-TO-RIGHT OVERRIDE (LRO)
U+202E: RIGHT-TO-LEFT OVERRIDE (RLO)
U+202C: POP DIRECTIONAL FORMATTING (PDF)
using System;
using System.Diagnostics;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace RleTests
{
class Program
{
const char RightToLeftEmbedding = (char)0x202B;
const char PopDirectionalFormatting = (char)0x202C;
static string FixWeakCharacters(string data)
{
if (string.IsNullOrWhiteSpace(data)) return string.Empty;
var weakCharacters = new[] { @"\", "/", "+", "-", "=", ";", "$" };
foreach (var weakCharacter in weakCharacters)
{
data = data.Replace(weakCharacter, RightToLeftEmbedding + weakCharacter + PopDirectionalFormatting);
}
return data;
}
static void Main(string[] args)
{
using (var pdfDoc = new Document(PageSize.A4))
{
PdfWriter.GetInstance(pdfDoc, new FileStream("Test.pdf", FileMode.Create));
pdfDoc.Open();
FontFactory.Register("c:\\windows\\fonts\\Arial.ttf");
Font tahoma = FontFactory.GetFont("Arial", BaseFont.IDENTITY_H);
var table1 = new PdfPTable(1);
table1.WidthPercentage = 100;
var pdfCell = new PdfPCell
{
RunDirection = PdfWriter.RUN_DIRECTION_RTL,
Border = 0,
Phrase = new Phrase(FixWeakCharacters(
"تاریخ: " + "1390/11/18" + Environment.NewLine +
"شماره پروژه: " + "1/2/3/4/56" + Environment.NewLine +
"اسلش: " + " 12/A/13 " + Environment.NewLine +
"بک اسلش: " + " 12\\13\\14 " + Environment.NewLine +
"مساوی و جمع: " + " 2+3=5 " + Environment.NewLine +
"سمی کولون: " + " 2=1+1; " + Environment.NewLine +
"دلار: " + "12$" + Environment.NewLine +
"کاما: " + "12,34,67" + Environment.NewLine +
"نقطه: " + "12.34" + Environment.NewLine +
"پرانتز: " + "متن (ساده)"
),
tahoma)
};
table1.AddCell(pdfCell);
pdfDoc.Add(table1);
}
Process.Start("Test.pdf");
}
}
}
<span dir="ltr" style="display:inline">1390/11/19</span>