2015-06-03 7 views
1

я в настоящее время хранения данных, представленные от пользователей в мою базу данных уже закодирован как например:Когда и где кодировать ввод пользователя?

<cfquery> 
INSERT INTO dbo.MyTable (UserID, Comment) 
VALUES 
(
<cfqueryparam value="#FORM.UserID#" cfsqltype="cf_sql_integer"/>, 
<cfqueryparam value="#EncodeForHTML(FORM.Comment)#" cfsqltype="cf_sql_nvarchar"/> 
) 
</cfquery> 

Очевидно, что это не правильный способ сделать это, потому что теперь я экранированные символы в моей таблице БД, которые полезны только для HTML и трудно выполнять поиск в SQL Server.

Как я могу обеспечить, чтобы я применял EncodeForHTML() на входе до того, как он попал на сервер, а затем Canonicalize() данные, полученные для хранения в БД?

ответ

1

Вы можете хранить их как есть, а также использовать <cfqueryparam> для form.userid. На выходе вы используете encodeforhtml().

Если вы предпочитаете иметь некоторые данные санировать сделано перед хранением, попробуйте AntiSamy (встроенный в CF11) http://www.adobe.com/devnet/coldfusion/articles/security-improvements-cf11.edu.html#articlecontentAdobe_numberedheader_2

+0

Как предотвратить атаки XSS, если я не использую EncodeForHTML? –

+0

Как только вы выберете 'encodeForHTML()', все будет отображаться вместе с кодом. Поэтому вы увидите фактический '', отображающийся, а не выполняемый браузером. – Henry

+0

Это одна из причин, по которой я сохранял уже закодированные данные. Но это оказалось плохой идеей. Я просто хочу кодировать на сервере, а затем Canoncalize его перед хранением в БД. В руководстве CF по предотвращению атак XSS говорится, что я должен кодировать представленные пользователем значения. Так что теперь я не понимаю, как и когда это делать. –

4

СМЯГЧАТЬ потенциально DB-вредный текст, когда он направляется к БД: передать его в качестве параметра, а не жестко закодированные в инструкции SQL, как вы это сделали в своем примере. Вы все еще подвергаете себя воздействию, не параметризируя свое значение идентификатора. Как правило, только SQL должен идти в вашей строке SQL <cfquery>; любые значения данных должны передаваться как параметры.

Аналогичным образом, уменьшите риск, предоставленный вашим пользователем данным, может быть выставлен при использовании данных. Не тогда, когда он идет на хранение, но когда вы на самом деле его используете. encodeForHtml() подходит только для того, чтобы материал записывался в HTML. Это не поможет, если он передается по URL-адресу или используется в JavaScript и т. Д. Существуют разные подходы к смягчению для этих (urlEncodedFormat() и encodeForJavaScript() соответственно). Дело в том, что вы справляетесь с смягчением использования по принципу использования, а не только в целом.

И как обеспечить, чтобы это было сделано (вы спрашиваете об этом)? Ну ... вы добросовестно пишете свой код и имеете строгий обзор кода и QA-процесс (с QA, выполняющим ручные тесты).

+0

Когда вы говорите, передавая его как параметр, вы имеете в виду, что мне нужно использовать хранимые процедуры для всего и предоставлять значения через параметры SQL? Я не совсем понял, что это значит. Я использую '' везде, где это возможно. Наверное, я неправильно понял документацию по предотвращению атак XSS. У меня было в голове, что все пользовательские входы должны быть закодированы. –

+1

Я имел в виду использование связанных параметров, как вы делаете с '' в вашем примере кода. В то время, когда я предложил свой ответ, вы * не * параметрировали значение «FORM.UserID», которое у вас впоследствии было. Чтобы избавиться от XSS, вы делаете две вещи: возможно, есть политика AntiSamy, и избегайте выхода всех выходных данных, когда вы приходите для вывода. Многие ppl очищают его по пути IN к БД, но поскольку вы не знаете, как вы собираетесь использовать данные, это не лучший подход. Выбери его должным образом в то время, когда вам нужно его избежать. –

+0

Итак, если у меня это право: я использую 'EncodeForHTML()' только там, где я не хочу, чтобы браузер выполнял/обрабатывал код, и я использую Anti-Samy 'GetSafeHTML()' для очистки пользовательских входов, которые могут содержать элементы HTML, которые необходимо будет отображать на странице. Потому что, если я использую 'EncodeForHTML()' для данных, которые должны быть показаны на странице, это не отображается правильно и вместо этого отображает фактический HTML-код на странице (как в виде исходного кода) –