2010-09-17 2 views
8

Я передаю PHPSESSID на страницу PHP (через POST), и мне было интересно, как лучше всего дезинфицировать входные данные. Достаточно ли mysql_real_escape_string? Есть ли что-то особенное, которое я должен учитывать при работе с идентификаторами сеанса (я имею в виду, что они могут быть буквами и буквами?)?Sanitizing PHPSESSID

EDIT: Чтобы прояснить этот вопрос, что я действительно хочу знать: если кто-то саботаж с данными POST, он может отправить вредоносную строку как PHPSESSID, что бы сделать что-нибудь неприятное, когда я называю session_id($_GET['PHPSESSID'])? лично я не могу думать о любой, но лучше перестраховаться, чем потом сожалеть ...

Благодаря

Nico

+0

Почему вы хотите его дезинфицировать? Это (в большинстве случаев) автогенерация. – fabrik

+1

+1 для хорошего осознания безопасности –

+0

@abrik: Конечно, это автогенерировано, меня просто беспокоило, что кто-то может обманывать данные POST и делать с ним что-то неприятное. Не уверен, что они могут сделать, но именно поэтому я задавал вопрос! – nico

ответ

7

Хорошая мысль, но, насколько я могу видеть, нет необходимости дезинфицировать этот вход. PHPSESSID будет передан по адресу session_id().

session_id действительно имеет some limitations:

В зависимости от обработчика сеанса, не все символы разрешены в пределах сеанса. Например, обработчик сеанса файлов допускает только символы в диапазоне a-z A-Z 0-9, (запятая) и - (минус)!

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

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

Само собой разумеется, что если вы используете идентификатор сеанса в другом контексте - скажем, в качестве параметра в форме HTML - вам необходимо принять необходимые санитарные меры для этого конкретного выхода (в этом случае htmlspecialchars()).

+4

Спасибо, Пекка, вот что я подумал, но я подумал, что лучше задаться глупым вопросом, чем делать глупую ошибку! :) – nico

2

Если вам действительно нужно передать идентификатор сеанса через POST (не могу понять, почему действительно ...), и вы знаете, какие символы вы хотите разрешить, я бы использовал регулярное выражение, чтобы проверить это.

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

+0

Спасибо за ответ. Я использую скрипт, который полагается на Flash, и мне нужно передать PHPSESSID, потому что Flash не делает это автоматически для меня ... это всего лишь одна страница, и я не был уверен, какие были опасности с PHPSESSID (если бы они были вообще). Скрипт все равно подключается к БД, поэтому «mysql_real_escape_string» пришел на ум, но я не был уверен, нужен ли он вообще. – nico

1

Может ли mysql_real_escape_string хватать?

Неправильно. Вы всегда должны дезинформировать данные с помощью соответствующего метода в том месте, где вы пишете значение. Вы использовали бы только mysql_real_escape_string(), если/когда вы записываете значение в базу данных MySQL.

Непонятно из вашего комментария, что именно вы делаете. Вы имеете в виду, что используете curl в PHP для создания POST? Если это так, то нет необходимости в санитации (не строго верно, но curl делает это для вас), если вы передадите CURLOPT_POSTFIELDS в виде массива, но вам нужно присвоить значение urlencode, если вы передаете CURLOPT_POSTFIELDS в виде строки.

Вы пишете значение в браузере, чтобы пользователь мог отправить значение? В этом случае вы должны использовать htmlentities() для записи значения в поле формы.

Что-то еще?

+0

Вы хорошо разбираетесь в 'htmlentities', спасибо. Как я уже говорил в jeroen, страница вызывается Flash, а сеансы не передаются, поэтому я просто POSTING PHPSESSID, чтобы воссоздать сеанс в файле PHP, который вызывается Flash. (Я использую JQuery Uploadify http://www.uploadify.com/ и передаю идентификатор сеанса с параметром scriptData, как они предлагают сделать). – nico