2015-04-03 7 views
0

Я новичок в ColdFusion и хочу удалить одинарные кавычки из значений полей ввода. Я попытался выполнить поиск в google, и то, что я нашел, это использовать «magic_quotes_gpc» или «mysql_real_escape_string», но эти функции не существуют в ColdFusion. Есть ли способ обработать такой запрос запроса mysql в ColdFusion?magic_quotes_gpc для ColdFusion? ColdBox?

Обновлено:

Спасибо за ответ, но, пожалуйста, посмотрите на мой код

<div class="form-group"> 
    <label for="jobDesc">Job description</label> 
    <textarea name="description" class="form-control" rows="3" id="jobDesc"> 
     <cfif isdefined('userTime')>#userTime.description#</cfif>   
    </textarea> 
</div> 

Я просто хочу, чтобы использовать одинарные кавычки в текстовой области и моя форма представления к событию. Запрос:

sqlstr = ""; 
      sqlstr = "insert into usertime set 
      userid = '#arguments.userTimeParams.userid#', 
      projectid = '#arguments.userTimeParams.projectid#', 
      timesheetdate = '#arguments.userTimeParams.timesheetdate#', 
      estimatedtimespent = '#arguments.userTimeParams.jobhours * 60 + arguments.userTimeParams.jobMins#', 
      description = '#arguments.userTimeParams.description#', 
      timeentered = #arguments.userTimeParams.timeentered#;"; 

      queryObj = new query(); 
      queryObj.setDatasource("timesheet"); 
      queryObj.setName("adduserTime"); 
      result = queryObj.execute(sql=sqlstr); 
      adduserTime = result.getResult(); 
      return result.getPrefix().generatedKey; 

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

Извините за задание многого с ограниченными знаниями.

+3

Используйте [cfqueryparam] (https://wikidocs.adobe.com/wiki/display/coldfusionen/cfqueryparam) тег (или сценарий эквивалент). Помимо всего прочего, это позволит избежать котировок для вас. –

+1

FYI, те функции, о которых вы упоминаете, были огромными ошибками дизайна, которые люди PHP уже исправили много лет назад. Вам нужно использовать подготовленные заявления, независимо от языка клиента. –

+0

@ Alvaro, я прошел через множество ссылок, и я знаю, что они исправлены в php, но я все-таки нашел какое-либо решение в cf до тех пор, пока я не спросил ... о чем-то, что для вашего PRECIOUS commant. –

ответ

4

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

Пример:

coloursViaQueryExecute = queryExecute(" 
    SELECT en AS english, mi AS maori 
    FROM colours 
    WHERE id BETWEEN :low AND :high 
    ", 
    {low=URL.low, high=URL.high}, 
    {datasource="scratch_mssql"} 
); 

Где low и high ваши параметры.

См соответствующих документов @QueryExecute()

И дальнейшее чтение по теме:

+1

Я понимаю, что это просто пример, но вы должны обязательно добавить параметр «type». В противном случае значения отправляются как строки, а база данных заканчивает выполнение неявного преобразования [, который не всегда дает желаемые результаты] (http://stackoverflow.com/questions/27049918/coldfusion-parameterizing-a-querie/27066113# 27066113).(Edit) BTW, хорошая запись в параметре do's and don'ts :) – Leigh

+0

Хорошая точка, @Leigh. –

+0

Thanx Adam для справки .. –

4

Без параметрирования пользовательских данных, вы открываете себя для SQL инъекций , REReplace() может не поймать все. Вот как вы должны переписать этот код для использования cfqueryparam. Возможно, вам потребуется настроить вызовы метода addParam(), чтобы добавить правильный cfsqltype.

sqlstr = ""; 
     sqlstr = "insert into usertime set 
     userid = :userid, 
     projectid = :projectid, 
     timesheetdate = :timesheetdate, 
     estimatedtimespent = :estimatedtimespent, 
     description = :description, 
     timeentered = :timeentered"; 

     queryObj = new query(); 
     queryObj.setDatasource("timesheet"); 
     queryObj.setName("adduserTime"); 
     queryObj.addParam(name="userid", value=arguments.usertimeparams.userid); 
     queryObj.addParam(name="projectid", value=arguments.usertimeparams.projectid); 
     queryObj.addParam(name="timesheetdate", value=arguments.usertimeparams.timesheetdate, cfsqltype="CF_SQL_TIMESTAMP"); 
     queryObj.addParam(name="estimatedtimspent", value=arguments.userTimeParams.jobhours * 60 + arguments.userTimeParams.jobMins, cfsqltype="CF_SQL_INTEGER"); 
     queryObj.addParam(name="description", value=arguments.usertimeparams.description); 
     queryObj.addParam(name="timeentered", value=arguments.usertimeparams.timeentered, cfsqltype="CF_SQL_INTEGER"); 
     result = queryObj.execute(sql=sqlstr); 
     adduserTime = result.getResult(); 
     return result.getPrefix().generatedKey; 
+0

Это намного больше кода, чем вам нужен помощник. Вам не нужно добавлять значения параметров по одному. См. Пример здесь: http://blog.adamcameron.me/2014/01/using-querycfc-doesnt-have-to-be-drama.html –

+1

Понял, но подумал, что было бы легче понять, что было сделано, если я добавляется каждый отдельно. –

+1

Да. [Исключение кавычек определенно не пуленепробиваемо] (http://stackoverflow.com/a/18797042/104223). Как сказал Скотт и Адам, вам нужно использовать «параметризованный» sql. – Leigh

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