使用占位符区分查询中的用户数据和参数名称

时间:2011-11-06 02:10:15

标签: php mysql sql-injection

我正在使用一个类来构建一个带有命名参数的MySQL查询,以将数据绑定到它。示例查询可能是。

INSERT INTO table (title, text) VALUES (?title, ?text)

现在,您可以通过提供参数名称和值来指定要用于这些占位符(?title?text)的值。在这个过程中,值将被转义(基本上mysql_real_escape_string,对布尔值,数组等进行特殊处理。)

问题是包含占位符本身的值,因为我按顺序替换它们。要完成上述示例,替换可以如下。

title -> "hey ?text"
text -> "lorem ipsum ..."

我的第一个想法是首先用独特的值替换占位符。那些必须是转义字符串中不能出现的字符串。

这是一个好方法吗?为此目的存在什么字符序列?

2 个答案:

答案 0 :(得分:0)

请与mysqli_prepare()一起使用mysqli_stmt_bind_param()

您需要做的是获取现有的命名参数,并仅使用问号替换它们。当您从查询字符串中顺序提取命名参数时,您将构建一个将在mysqli_stmt_bind_param()函数中使用的有序数组,并从值数组中放置适当的值。构建有序数组后,您需要对其进行迭代并进行类型检查,以便将$types值传递给mysqli_stmt_bind_param()

我强烈建议您先使用像PDO这样的库来代替自己的库。

答案 1 :(得分:0)

我相信你的整个概念都是错误的 你在混合问题。

占位符只能用于向查询添加值。不要创建花哨的语法。

没有什么可以阻止你做像

这样的事情

$ text =“lorem ipsum ......”;    $ title =“hey $ text”;

所以以这种方式准备你的变量。 然后才将它们放入查询中。

但是,我可能会忽略一些明智的问题。如果您有一些合理的反对意见 - 我将尝试为您找到解决方案

关于你头衔中的问题,我只是逃避了?和另外一个 ??在我的占位符解析器中。