【问题标题】:magic_quotes_gpc setting for ColdFusion? ColdBox?ColdFusion的magic_quotes_gpc设置?冷盒?
【发布时间】:2015-04-04 20:22:20
【问题描述】:

我是 ColdFusion 的新手,想从我的输入字段的值中删除单引号。我试图在谷歌上搜索,我发现使用“magic_quotes_gpc”或“mysql_real_escape_string”,但这些函数在 ColdFusion 中不存在。 ColdFusion中有没有办法处理这种mysql查询注入?

更新:

感谢您的回复,但请看我的代码

<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;

我有一个选项可以在字符串中添加斜杠,但是我必须在所有字符串中添加斜杠。那么有没有什么功能或方法可以用更少的代码来做到这一点?

抱歉问了这么多知识有限。

【问题讨论】:

  • 使用cfqueryparam 标签(或等效的脚本)。除其他外,它会为您转义引号。
  • 仅供参考,您提到的那些功能是 PHP 人员多年前已经修复的巨大设计错误。无论客户端语言如何,您都需要使用准备好的语句。
  • @Alvaro,我已经浏览了很多链接,我知道它们在 php 中已修复,但我在 cf 中找到了任何解决方案,所以我问..无论如何感谢您的宝贵命令
  • 关于wanted to remove single quotes from the values of my input fields,这可能是个坏主意。单引号与撇号具有相同的 ascii 值。这些用于缩写和姓氏。你已经被告知查询参数,通往幸福的道路。

标签: mysql coldfusion


【解决方案1】:

嗯...只是不要传递硬编码在 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"}
);

lowhigh 是您的参数。

查看相关文档@QueryExecute()

关于该主题的进一步阅读:

【讨论】:

  • 我意识到上面只是一个例子,但你绝对应该添加一个参数“type”。否则,这些值将作为字符串发送,并且数据库最终执行隐式转换,which does not always produce the desired results。 (编辑)顺便说一句,参数做和不做的很好的条目:)
【解决方案2】:

如果不参数化用户数据,您将面临 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;

【讨论】:

  • 这比你需要的代码要多得多。您不需要一次附加一个参数值。请参阅此处的示例:blog.adamcameron.me/2014/01/…
  • 明白,但我想如果我分别添加它们可能会更容易理解所做的事情。
  • 是的。 Escaping quotes is definitely not bullet-proof。正如 Scott 和 Adam 所说,您需要使用“参数化”的 sql。
  • @scott thanx 但此代码不起作用..我尝试在 queryObj.addParam(name="userid", ...) 行之后出现错误,因为它说 Element USERTIMPARAMS.PROJECTID is undefined in论据。但是我检查了转储并获得了所有值..可能不是编写 addParam 的正确方法..??
  • 糟糕,有一个错字。我错误地命名了变量。我刚刚修复了代码。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多