1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-android-app-sec-guidebook

Клонировать/Скачать
4.3.1.2.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 20:24 c13bfb7

Метод selection (String selection, String[] selectionArgs, String sortOrder)

* *Пункт 2.* Внимательно и безопасно обрабатывайте полученные данные запроса. Здесь с помощью UriMatcher#match() и switch case проверяется, соответствует ли uri ожиданиям. Проверка других параметров здесь опущена из-за примера. См. «3.2. Внимательно и безопасно обрабатывать входные данные».

* *Пункт 3.* При возврате результата не включайте конфиденциальную информацию. Значение результата запроса зависит от приложения: если информация может быть использована вредоносными программами, её можно возвращать.

switch (sUriMatcher.match(uri)) {
    case DOWNLOADS_CODE:
    case DOWNLOADS_ID_CODE:
        return sDownloadCursor;
    case ADDRESSES_CODE:
    case ADDRESSES_ID_CODE:
        return sAddressCursor;
    default:
        throw new IllegalArgumentException("Неверный URI:" + uri);
}

Метод insert (Uri uri, ContentValues values)

* *Пункт 2.* Внимательно и безопасно обрабатывайте полученные данные запроса. Здесь с помощью UriMatcher#match() и switch case проверяется, соответствует ли uri ожиданиям. Проверка других параметров здесь опущена из-за примера. См. «3.2. Внимательно и безопасно обрабатывать входные данные».

* *Пункт 3.* При возвращении результата не включайте конфиденциальную информацию. Зависит от приложения, имеет ли выданный ID чувствительное значение или нет. Если нет проблем с тем, что информация будет использована вредоносными программами, она может быть возвращена как результат.

switch (sUriMatcher.match(uri)) {
    case DOWNLOADS_CODE:
        return ContentUris.withAppendedId(Download.CONTENT_URI, 3);
    case ADDRESSES_CODE:
        return ContentUris.withAppendedId(Address.CONTENT_URI, 4);
    default:
        throw new IllegalArgumentException("Неверный URI:" + uri);
}

Метод update (Uri uri, ContentValues values, String selection, String[] selectionArgs)

* *Пункт 2.* Внимательно и безопасно обрабатывайте полученные данные запроса. Здесь с помощью UriMatcher#match() и switch case проверяется, соответствует ли uri ожиданиям. Проверка других параметров здесь опущена из-за примера. См. «3.2. Внимательно и безопасно обрабатывать входные данные».

* *Пункт 3.* При возвращении результата не включайте конфиденциальную информацию. В зависимости от приложения количество обновлённых записей может иметь чувствительное значение. Если нет проблем с тем, что эта информация будет использована вредоносными программами, она может быть возвращена как результат.

switch (sUriMatcher.match(uri)) {
    case DOWNLOADS_CODE:
        return 5; // Возвращаем количество обновлённых записей
    case DOWNLOADS_ID_CODE:
        return 1;
    case ADDRESSES_CODE:
        return 15;
    case ADDRESSES_ID_CODE:
        return 1;
    default:
        throw new IllegalArgumentException("Неверный URI:" + uri);
}

Метод delete (Uri uri, String selection, String[] selectionArgs)

* *Пункт 2.* Внимательно и безопасно обрабатывайте полученные данные запроса. Здесь с помощью UriMatcher#match() и switch case проверяется, соответствует ли uri ожиданиям. Проверка других параметров здесь опущена из-за примера. См. «3.2. Внимательно и безопасно обрабатывать входные данные».

* *Пункт 3.* При возвращении результата не включайте конфиденциальную информацию. Количество удалённых записей в зависимости от приложения может иметь чувствительное значение. Если нет проблем с тем, что эта информация будет использована вредоносными программами, она может быть возвращена как результат.

switch (sUriMatcher.match(uri)) {
    case DOWNLOADS_CODE: ```

return 10; // Возвращает количество удалённых записей case DOWNLOADS_ID_CODE: return 1; case ADDRESSES_CODE: return 20; case ADDRESSES_ID_CODE: return 1; default: throw new IllegalArgumentException("Неверный URI:" + uri); }


Ниже приведён пример активности с использованием общедоступного поставщика контента.

**Ключевые моменты (использование поставщика контента):**
4) Не отправлять конфиденциальную информацию.
5) Осторожно и безопасно обрабатывать полученные данные.

```java
package org.jssec.android.provider.publicuser;

import android.app.Activity;
import android.content.ContentValues;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class PublicUserActivity extends Activity {

    // Целевая информация о поставщике контента
    private static final String AUTHORITY = "org.jssec.android.provider.publicprovider";

    private interface Address {
        public static final String PATH = "addresses";
        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + PATH);
    }

    public void onQueryClick(View view) {
        logLine("[Запрос]");
        if (!providerExists(Address.CONTENT_URI)) {
            logLine("Поставщик контента не существует.");
            return;
        }
        Cursor cursor = null;
        try {
            // *** Пункт 4 *** Не отправляйте конфиденциальную информацию,
            // поскольку целевой поставщик контента может быть вредоносным ПО.
            // Если нет проблем с получением информации вредоносным ПО, её можно включить в запрос.
            cursor = getContentResolver().query(Address.CONTENT_URI, null, null, null, null);
            // *** Пункт 5 *** При получении результата осторожно и безопасно обрабатывайте полученные данные.
            // Опущено, так как это образец. Пожалуйста, обратитесь к разделу «3.2. Осторожная и безопасная обработка входных данных».
            if (cursor == null) {
                logLine("Курсор равен нулю");
            } else {
                boolean moved = cursor.moveToFirst();
                while (moved) {
                    logLine(String.format("%d, %s", cursor.getInt(0), cursor.getString(1)));
                    moved = cursor.moveToNext();
                }
            }
        } finally {
            if (cursor != null) cursor.close();
        }
    }

    public void onInsertClick(View view) {
        logLine("[Вставка]");
        if (!providerExists(Address.CONTENT_URI)) {
            logLine(" Поставщик контента не существует.");
            return;
        }
        // *** Пункт 4 *** Не отправляйте конфиденциальную информацию,
        // поскольку целевой поставщик контента может быть вредоносным ПО.
        // Если нет проблем с получением информации вредоносным ПО, её можно включить в запрос.
        ContentValues values = new ContentValues();
        values.put("city", "Tokyo");
        Uri uri = getContentResolver().insert(Address.CONTENT_URI, values);
        // *** Пункт 5 *** При получении результата осторожно и безопасно обрабатывайте полученные данные.
        // Опущено, так как это образец. Пожалуйста, обратитесь к разделу «3.2. Осторожная и безопасная обработка входных данных».
        logLine("uri:" + uri);
    }

    public void onUpdateClick(View view) {
        logLine("[Обновление]");
        if (!providerExists(Address.CONTENT_URI)) {
            logLine(" Поставщик контента не существует.");
            return;
        }
        // *** Пункт 4 *** Не отправляйте конфиденциальную информацию,
        // поскольку целевой поставщик контента может быть вредоносным ПО.
        // Если нет проблем с получением информации вредоносным ПО, её можно включить в запрос.
        ContentValues values = new ContentValues();
        values.put("city", "Tokyo");
        String where = "_id = ?";
        String[] args = {"4"};
        int count = getContentResolver().update(Address.CONTENT_URI, values, where, args);
        // *** Пункт 5 *** При получении результата осторожно и безопасно обрабатывайте полученные данные.
        // Опущено, так как это образец. Пожалуйста, обратитесь к разделу «3.2. Осторожная и безопасная обработка входных данных».
    }
``` ```
    public void onUpdateClick(View view) {
        logLine(String.format(" %s записей обновлено", count));
    }

    public void onDeleteClick(View view) {
        logLine("[Удалить]");
        if (!providerExists(Address.CONTENT_URI)) {
            logLine(" Поставщик контента не существует.");
            return;
        }
        // *** ТОЧКА 4 *** Не отправляйте конфиденциальную информацию.
        // поскольку целевой поставщик контента может быть вредоносным ПО.
        // Если нет проблем, когда информация будет получена вредоносным ПО, её можно включить в запрос.
        int count = getContentResolver().delete(Address.CONTENT_URI, null, null);
        // *** ТОЧКА 5 *** При получении результата обрабатывайте данные результата тщательно и безопасно.
        // Опущено, так как это пример. Пожалуйста, обратитесь к разделу «3.2 Тщательная и безопасная обработка входных данных».
        logLine(String.format(" Удалено %s записей", count));
    }

    private boolean providerExists(Uri uri) {
        ProviderInfo pi = getPackageManager().resolveContentProvider(uri.getAuthority(), 0);
        return (pi != null);
    }

    private TextView mLogView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mLogView = (TextView)findViewById(R.id.logview);
    }

    private void logLine(String line) {
        mLogView.append(line);
        mLogView.append("¥n");
    }

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-android-app-sec-guidebook.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-android-app-sec-guidebook.git
oschina-mirror
wizardforcel-android-app-sec-guidebook
wizardforcel-android-app-sec-guidebook
master