Вы можете использовать его следующим образом
ALTER PROCEDURE [dbo].[DailyBatchSummaryReport_NoGroup]
@FromDatePara Datetime,
@ToDatePara Datetime,
@SeleRecipe nvarchar(max),
@SeleOrder nvarchar(max),
@SeleCustomer nvarchar(max),
@SeleSite nvarchar(max),
@SeleTruck nvarchar(max),
@SeleDriver nvarchar(max),
AS
BEGIN
Передать значения @SeleOrder, @SeleCustomer как 0 для непроверенного и 1 для флажка
select * from
yourtable
where
OrderNumber= CASE WHEN @SeleOrder = '0' THEN OrderNumber ELSE @SeleOrder END
AND
CUSTOMER= CASE WHEN @SeleCustomer = '0' THEN CUSTOMER ELSE @SeleCustomer END
AND
Driver= CASE WHEN @SeleDriver = '0' THEN Driver ELSE @SeleDriver END
Убедитесь, что значение по умолчанию передано как 0. Здесь вы выбрали тип данных как nvarchar (max), поэтому я написал «0», иначе вы можете написать 0, если вы передадите просто значение типа int. или вы можете установить значение по умолчанию как 0
ALTER PROCEDURE [dbo].[DailyBatchSummaryReport_NoGroup]
@FromDatePara Datetime,
@ToDatePara Datetime,
@SeleRecipe int = 0,
@SeleOrder int = 0,
@SeleCustomer int = 0,
@SeleSite int = 0,
@SeleTruck int = 0,
@SeleDriver int = 0,
AS
BEGIN
выбрать логику согласно вашему удобству кодирования. но вышеуказанный метод будет работать
Чтобы развить идею Саймона, вы могли бы очень легко добавить строку ключа в свое приложение, а затем отправить идентификатор устройства , а затем XOR'ed DeviceID (или какой-либо другой простой алгоритм для шифрования строки) со строкой ключа.
Поскольку вы знаете значение ключа, которое нужно использовать, вам легко «расшифровать» эту строку на стороне сервера и убедитесь, что значения совпадают.
Таким образом, пароль будет отличаться для каждого устройства пользователя, и строка «ключа» никогда не будет отправлена по проводам больших немытых сетей. : -)
Да, это ни в коем случае нельзя было бы понять, но, как говорили другие, идея не в том, чтобы сделать это невозможным. Идея состоит в том, чтобы доставить больше хлопот, чем оно того стоит.
вы можете очень легко иметь строку ключа в своем приложении, затем отправить идентификатор устройства, а затем XOR'ed DeviceID (или какой-либо другой простой алгоритм для шифрования строки) со строкой ключа.Поскольку вы знаете значение ключа для использовать, вам легко «расшифровать» эту строку на стороне сервера и убедиться, что значения совпадают.
Таким образом, пароль отличается для каждого устройства пользователя, и строка «ключа» никогда не пересылается по проводам из больших немытых интернетов. : -)
Да, это ни в коем случае нельзя было бы понять, но, как говорили другие, идея не в том, чтобы сделать это невозможным. Идея состоит в том, чтобы доставить больше хлопот, чем оно того стоит.
вы можете очень легко иметь строку ключа в своем приложении, затем отправить идентификатор устройства, а затем XOR'ed DeviceID (или какой-либо другой простой алгоритм для шифрования строки) со строкой ключа.Поскольку вы знаете значение ключа для использовать, вам легко «расшифровать» эту строку на стороне сервера и убедиться, что значения совпадают.
Таким образом, пароль отличается для каждого устройства пользователя, и строка «ключа» никогда не пересылается по проводам из больших немытых интернетов. : -)
Да, это ни в коем случае нельзя было бы понять, но, как говорили другие, идея не в том, чтобы сделать это невозможным. Идея состоит в том, чтобы доставить больше хлопот, чем оно того стоит.
Поскольку вы знаете, какое значение ключа нужно использовать, вам легко «расшифровать» эту строку на стороне сервера и убедиться, что значения совпадают.
Таким образом, пароль для каждого устройства пользователя будет разным, а Строка «ключей» никогда не пересылается по проводам больших немытых сетей. : -)
Да, это ни в коем случае нельзя было бы понять, но, как говорили другие, идея не в том, чтобы сделать это невозможным. Идея состоит в том, чтобы доставить больше хлопот, чем оно того стоит.
Поскольку вы знаете, какое значение ключа нужно использовать, вам легко «расшифровать» эту строку на стороне сервера и убедиться, что значения совпадают.
Таким образом, пароль для каждого устройства пользователя будет разным, а Строка «ключей» никогда не пересылается по проводам больших немытых сетей. : -)
Да, это ни в коем случае нельзя было бы понять, но, как говорили другие, идея не в том, чтобы сделать это невозможным. Идея состоит в том, чтобы доставить больше хлопот, чем оно того стоит.
это ни в коем случае не было бы невозможным выяснить, но, как говорили другие, идея не в том, чтобы сделать это невозможным. Идея состоит в том, чтобы доставить больше хлопот, чем оно того стоит. это ни в коем случае не было бы невозможным выяснить, но, как говорили другие, идея не в том, чтобы сделать это невозможным. Идея состоит в том, чтобы доставить больше хлопот, чем оно того стоит.Вы действительно не можете этого сделать. Ваше приложение можно разобрать, и любой секрет в двоичном файле может быть воспроизведен во вредоносном приложении.
Еще одна атака, о которой вы должны знать, - это люди, настраивающие файл hosts в место, которое они контролируют, а затем устанавливают корневой сертификат, который позволяет им чтобы предоставить подпись для этого домена. Ваше приложение отправит сообщение с секретом, и они просто смогут прочитать секрет. Таким образом они могут извлечь пароль из любой сложной системы шифрования в двоичном файле.
Большинство идей в этом потоке уязвимы для этой атаки.
Тем не менее, вероятность того, что кто-то достаточно внимательный, чтобы дизассемблировать ваше приложение, составляет вероятно, довольно отдаленный.
Я бы просто не усложнил. Имейте пароль, который жестко запрограммированы в вашем приложении. Чтобы никто не смотрел ресурсы и не пробовал каждую строку, сделайте это XOR двух строк или результатом AES-дешифрования определенной фиксированной строки.
Очевидно, вы должны выполнить запрос через SSL, иначе злоумышленник может просто нюхать трафик.
Да, решительный злоумышленник обойдет эту схему, но, как и любая схема DRM, так было всегда. Уловка состоит в том, чтобы приложить слишком много усилий, чтобы оно того стоило.
так было всегда. Уловка состоит в том, чтобы приложить слишком много усилий, чтобы оно того стоило. так было всегда. Уловка состоит в том, чтобы приложить слишком много усилий, чтобы оно того стоило.Я не уверен, какую веб-технологию вы используете, но если вы используете Ruby on Rails, он использует секретный токен аутентификации во всех своих контроллерах, чтобы убедиться, что вредоносный код не доступ к деструктивным методам (через PUSH, POST или DELETE). Вам нужно будет отправить этот токен аутентификации на сервер в теле запроса, чтобы он мог выполняться. Это должно достичь того, что, я думаю, вы ищете.
Если вы не используете Ruby on Rails, этот метод аутентификации кода может быть хорошим методом исследования и реализации себя в любой технологии, которую вы используете.
Take посмотрите Руководство по безопасности Rails , в частности раздел 3.1 (Контрмеры CSRF).
Я бы тоже использовал протокол https с ключами на стороне клиента. Вы можете использовать один клиентский ключ для всех или вы даже можете сгенерировать разные ключи для каждого клиента и «зарегистрировать» их на своем сервере.
Я полагаю, что для небольшого проекта это много работы, но звучит как подходящая вещь делать, если вам нужна аутентификация.
Вы должны убедиться, что ключи не видны легко владельцу мобильного телефона. И помните, что кто-нибудь сможет взломать его в любом случае.
Как уже говорили другие, вектор
внутренне использует непрерывный массив объектов. Указатели в этом массиве следует рассматривать как недопустимые, если любая неконстантная функция-член называется IIRC.
Однако есть исключение !!
vector
имеет специальную реализацию, предназначенную для экономии места, так что каждый bool использует только один бит. Базовый массив не является непрерывным массивом bool, и арифметические операции с массивами для vector
не работают, как vector
.
(я полагаю, что это также возможно что это может быть верно для любой специализации вектора, так как мы всегда можем реализовать новую. Однако std :: vector
- единственная, э-э, стандартная специализация, в которой простая арифметика с указателями победила »
Вы также можете захотеть использовать простой ключ использования, а также первую линию защиты, а затем применить подход к анализу трафика. Кроме того, пользовательские значения заголовка http, которые вы ищете, - еще один простой способ сбить с толку наивного злоумышленника.
Полагаю, вы не хотите использовать SSL? Если вы это сделаете, вы можете открыть сеанс HTTPS, а затем передать какой-то секретный ключ в запросе.
Если вы не хотите использовать SSL, ваши возможности ограничены: чтобы иметь псевдобезопасность, я предлагаю как методы аутентификации, так и авторизации, а третий - для уменьшения общий трафик:
Аутентификация: генератор в клиентском приложении, который создает секретные ключи путем объединения с файлом ключей. Ключевой файл можно обновлять время от времени для большей безопасности: допустим, вы обновляете ключевой файл один раз в неделю. Чтобы повторить заглавие: Генератор объединяет секрет приложения с файлом ключей вне приложения для генерации третьего ключа для передачи, используемого при аутентификации. После этого сервер сможет аутентифицироваться.
Авторизация: Конечно, вы также хотите заблокировать мошеннические приложения. Здесь лучше всего иметь механизм авторизации с сайтом. Не заменяйте ключевые файлы, если клиент не входит в систему. Отслеживайте ключевые файлы для пользователей. и т. д.
Снижение трафика: Если вы получаете непристойный объем трафика или подозреваете, что кто-то пытается выполнить DOS на вашем сервере, вы также можете настроить синхронизацию и сервера, и клиентов для запроса / ответа по процедурно сгенерированному URL-адресу, который может часто меняться. Бесполезно открывать / закрывать так много сеансов HTTPS, если кто-то просто заваливает вас запросами.
Я не разработчик Cocoa Touch, но думаю, что HTTP-аутентификацию через SSL будет легко реализовать, и, вероятно, это именно то, что вы ищете.
Все, что вам нужно сделать настраивает HTTP-аутентификацию на стороне сервера (вы не упомянули, что вы используете на стороне сервера) и создаете самозаверяющий сертификат SSL на вашем веб-сервере. Готово. :)
Расскажите нам подробнее о своей настройке, и мы сможем вам помочь.
Вы можете сделать что-то вроде шифрования текущего времени и IP-адреса с iPhone, а затем расшифровать их на сервере. Обратной стороной является то, что вам нужно, чтобы приложение iPhone знало «секретный» ключ, чтобы только оно могло генерировать действительные токены доступа ... и как только ключ окажется в свободном доступе, это будет только вопросом времени, когда он будет взломан, если ваш app действительно стоит затраченных усилий.
Вы можете зашифровать ответ, используя какую-нибудь случайную часть приложения, которая должна его использовать, указав расположение двоичного файла в незашифрованном бите ответа. Тогда, по крайней мере, только клиенты, имеющие доступ к вашему двоичному файлу, смогут его расшифровать ... но опять же, это вряд ли на 100% безопасно.
Как сказано в некоторых ответах, закрытие вашей веб-службы для всех остальных будет серьезной проблемой. Лучшее, на что вы можете надеяться, - это упростить хакерам использование другой веб-службы, чем использование вашей ...
Еще одно предложение сделать это - сгенерировать случайные числа из случайного числа ] как на сервере, так и на клиенте. Серверу необходимо будет отслеживать, где в последовательности случайных чисел находятся все клиенты, и сопоставлять это число с тем, которое отправил клиент.
Клиенту также необходимо зарегистрироваться, чтобы получить доступ к серверу. Это также могло бы служить механизмом аутентификации.
Итак:
//Client code:
$sequence = file_get_contents('sequence.txt');
$seed = file_get_contents('seed.txt');
$sequence++;
//Generate the $sequence-th random number
srand($seed);
for ($i = 0; $i <= $sequence; $i++) {
$num = rand();
}
//custom fetch function
get_info($main_url . '?num=' . $num . '&id' = $my_id);
Будет сгенерирован запрос, похожий на этот:
http://webservice.com/get_info.php?num=3489347&id=3
//Server Code: (I'm used to PHP)
//Get the ID and the random number
$id = (int)$_REQUEST['id'];
$rand = (int)$_REQUEST['num'];
$stmt = $db->prepare('SELECT `sequence`, `seed` FROM `client_list` WHERE `id` = :id');
if ($stmt->execute(array(':id' => $id)) {
list($sequence, $seed) = $stmt->fetch(PDO::FETCH_ASSOC);
}
$sequence++;
//Generate the $sequence-th random number
srand($seed);
for ($i = 0; $i <= $sequence; $i++) {
$num = rand();
}
if ($num == $rand) {
//Allow Access
} else {
//Deny Access
}
Используя разные начальные числа для каждого клиента,