2012-03-29 6 views
0

Я создаю программу, которая связывается с PHP-скриптом на веб-сервере, и для этого мне нужно иметь возможность передавать параметры из программы в PHP-скрипт.Передача параметров URL с помощью PHP

Теперь вот мой вопрос. В какой-то момент имя пользователя и пароль должны быть переданы скрипту. Теперь это делается не так, как это очевидно для пользователей (например, в адресной строке), но я знаю, немного обнюхивая кого-то, кто действительно хотел бы понять это. Таким образом, хотя мой сценарий безопасен от инъекций, очевидно, что переменная подделка является проблемой здесь.

Это идея, которую я придумал, поэтому, пожалуйста, помогите мне обернуть вокруг себя голову и посмотреть, будет ли это работать так, как я ДУМАЮ.

Моя мысль была для шифрования пароля пользователя (или другой уникальный ключ) переменных на стороне клиента перед отправкой, так что вы получите URL, как (очевидно, просто составленную) mypage.php? Ип = Oa348uty8 & пс = op986hGTfreu Тогда, когда он добирается до скрипта PHP, расшифровывает его и зашифровывает его с другой солью.

Поэтому, когда он покидает приложение, он будет зашифрован, но не правильный путь, а затем, когда он попадет на сервер скриптов PHP, расшифруйте его и заново зашифруйте с помощью правильной соли, чтобы он правильно соответствовал сохраненному зашифрованному паролю ,

Таким образом, они не будут знать, как должна выглядеть зашифрованная версия их пароля, без этого они не смогут манипулировать URL-адресом и пытаться вставить поддельные значения.

+0

Как это отличается от ситуации входа в систему _normal_? Если у вас есть доступное шифрование, используйте его обычным, правильным способом. – Halcyon

+0

, когда вы храните пароли на своем сервере в виде хеш-строк, которые вы должны в любом случае. (например, sha256 или что-то подобное), лучше всего было бы создать хэш-клиентскую сторону и передать хэш только серверу. остальное - простое сравнение строк. не требуется расшифровка. – Rufinus

+0

Зашифрованный пароль, присвоенный URL-адресу, не может быть расшифрован человеком. Тем не менее, он может быть повторно использован как есть (то есть зашифрован) хакером для другого соединения. – Skrol29

ответ

1

Выражаясь в двух словах, вы думаете об этом:

На стороне сервера у вас есть:

  • база данных, с Логин/пароль совпадает.
  • скрипт, который принимают 2 параметра (пароль и имя пользователя) и проверить в базе данных, если пара существует

Ваша задача:

Когда локальное приложение вызвать скрипт PHP на стороне сервера, то 2 параметры приведены в виде простого текста. И вы хотите, чтобы избежать несанкционированного доступа (если ваш сценарий безопасны от инъекции я вижу только фальсификация используется для BruteForce на авторизацию < = иметь в виду, что я буду держать это предположение в целом пост)

Ваше решение:

  • на стороне клиента, шифровать 2 параметра
  • на стороне сервера, добавьте соль в сценарии посолить
  • Затем расшифровать 2 параметра и зашифровать с солью

Что я думаю:

Это не решит проблему подделывания, кто-то все еще может подделывать запросы. Первое шифрование бесполезно, потому что кто-то может отменить ключ, используемый вашим клиентом. Второе шифрование недостаточно безопасно, потому что вы используете одну соль для всех пользователей.

Что я предлагаю:

Признайте, что фальсификация не может быть предотвращено, если не использовать безопасный протокол HTTPS, как (можно либо использовать SSL или TLS). Если вы хотите приемлемую безопасность без HTTPS следующего, что я бы реализовать:

  • Токена системы, вы будете проверять, чтобы увидеть, если пользователь может выполнить операцию Логина
  • имени пользователя, которое не будет шифроваться
  • пароль sha1 HASHED хранится в базе данных
  • на стороне клиента, вызовите сценарий и предоставить имя пользователя, как не зашифрованы и пароль в качестве хэш SHA1, подогреты со случайной солью (sha1 (sha1 (пропуск) + соль) (соль хранится в сеансе пользователя на стороне сервера)
  • Сценарий затем сравнил предоставленный хэш с дб хэшем пароля подогрет с сеансом солью

Улучшения в том, что злоумышленник должен попытаться грубой силой два sha1 пароля consecutivaly и должен предоставить действительный маркер для выполнения действия входа , Плюс, если вы используете в качестве соли строку с использованием шестнадцатеричного символа переменной длины, это сделает работу более трудной для злоумышленника, узнав, что значение, выполняемое вторым хэшем, является хэшем sha1, и даже если он знает, что это sha1 придется проверить несколько случаев, чтобы попытаться найти нужную часть значения, соответствующую хешу.

Из-за переменной соли один и тот же пароль не будет одинаковым, если хэширование: Представьте, что злоумышленник обнюхал хэш и знал, какой пароль использовался, а затем нюхает другой хеш, который был сделан с тем же паролем, что и другой, злоумышленник не сможет узнать, что пароль 2, где тот же (немного переполненный, но по-прежнему полезный).

Безопаснее хранить пароль как хэшированное значение, потому что, если злоумышленнику удастся сбросить вашу пользовательскую таблицу, он не сможет сразу использовать пароли, он должен будет выполнить команду brutforce каждый из них. Наконец, хэш-код sha1 более безопасен, чем md5 (скажу вам, что, поскольку вы использовали тэг md5 в своем сообщении)

Недостатком этого метода является то, что пароли не могут быть отменены, поэтому вы не сможете дать они возвращаются к вашим пользователям, если они потеряли его. Вам придется заставить их установить новый.

Жесткий путь (по-прежнему без использования HTTPS) должен был бы зашифровать ваш пароль и имя пользователя сильным cypher (например, AES или 3DES) и использовать безопасный ключ echange algorythm (например, Diffie Hellman) для обмена случайным общим ключ.

Этот метод не будет блокировать фальсификацию, но будет винить злоумышленника, потому что он не сможет расшифровать значение (предполагая, что он только обнюхивает сеть). Ключ случайный и никогда не жестко закодирован ни в одном из ваших приложений, поэтому, даже если кто-то отменит ваш клиент, он не сможет получить ключ. Я бы порекомендовал хранить ваше значение пароля с hash.

Крайним способом было бы объединить 2 метода, но было бы полностью переборщить.

Надеюсь, что это даст вам идеи

+1

Но почему все это, когда проблему можно безопасно и легко решить с помощью HTTPS? – F21

+0

Потому что иногда вы не хотите использовать https (https - это то, что я подразумевал под SSL) или не могу использовать его (например: вы арендуете веб-пространство, которое не позволяет https). https требует сертификатов, и в случае, если вы не хотите платить за подписанный сертификат, а приложение работает в общем браузере, у вас будет уродливое сообщение, в котором говорится, что вы принимаете самоподписанное удостоверение. Использование альтернативного способа позволяет избежать этого случая. Но в случае использования пользовательского клиента и https можно активировать на стороне сервера, я полностью согласен с тем, что вы должны идти с https вместо того, чтобы реализовать свой собственный метод безопасности. – grifos

+0

Спасибо, что дали некоторые идеи и указали мне в правильном направлении! BTW Я не использую md5 в базе данных mt, но по моей первоначальной линии мышления первый хэш должен быть обратимым. – Chris

0

Проблема с вашим подходом заключается не в том, используете ли вы пароли и имена пользователей в URL-адресе, либо нет. Если пользователь аутентифицируется, отправив вам строки с правами, то я, как злоумышленник, все еще могу вынюхивать эти хэши, передавать их в ваше приложение и проверять подлинность. Это только тогда, когда вы выполняете обмен ключами с открытым ключом/частным ключом перед операцией, но это просто повторное использование HTTPS, поэтому вы можете просто использовать HTTPS.

Что вы должны сделать, так это отправить запрос, используя POST через HTTPS.

  • POST: чтобы данные аутентификации не были указаны в URL-адресе и отображались в журналах и URL-адресах рефереров.
  • HTTPS, так что содержимое всего запроса полностью зашифровано и может быть расшифровано только клиентским приложением и серверной стороной.
0

шифрование с Javascript от клиента к серверу предотвращает неавторизованное SSL-сообщение. Я думаю, вы должны использовать sessions вместо этого типа шифрования.

0

Обновление: Вы можете добавить свой секретный ключ в оба сценария.

Смежные вопросы