- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在进行 Doctrine 查询,并且必须在 where 子句中进行通配符匹配。我应该如何转义要插入的变量?
我想要得到的查询:
SELECT u.* FROM User as u WHERE name LIKE %var%
到目前为止的 php 代码:
$query = Doctrine_Query::create()
->from('User u')
->where();
where 子句中应该包含什么?我要匹配的变量是 $name
最佳答案
没有人正确回答你的问题,所以我会尝试一下。
->where('u.name LIKE ?', array("%$name%"));
->where('u.username LIKE ?', '%'.$username.'%')
这些都不安全。让我解释一下几个场景。
场景 1
假设您想让用户搜索匹配的用户名,但您永远不想列出所有用户名。也许您不希望有人轻易窃取您的一百万个用户名列表。在这段代码之前的某个地方,您做了类似的事情:
if (strlen(trim($name)) < 5) throw Boogey_Monster_Exception();
您认为这会阻止某人将该字段留空并下拉所有用户名的列表...但实际上用户可以提交“_____”或“%%%%%”或类似的内容来获取列表所有用户名,而不仅仅是匹配 5 个或更多已知字符。
我亲眼目睹过在几个大型公共(public)网站上使用这种形式的攻击。</p>
场景 2
您的网站拥有大量用户和大量用户数据。您的用户表中有 10,000,000 行。您希望网站用户能够通过搜索已知前缀来查找其他用户的用户名。
因此,您编写了一些像这样的代码,对上面的示例稍加修改,只在搜索字符串后面有一个通配符。
->where('u.name LIKE ?', array("$name%"));
如果您在 u.name 上有索引,则此 LIKE 查询将使用该索引。因此,如果用户提交 $name="john",那么此查询将有效匹配 johndoe、johnwayne、johnwaynegacy 等用户。
但是,如果用户提交 $name="%john",则此查询不再使用索引,现在需要全表扫描。在非常大的数据库上,这可能是一个非常慢的查询。
关于 SQLi 的 MySQL 手册提到了同样的事情(第 78-79 页),我在 google 上搜索了一些查询性能缓慢的示例,并找到了一个链接。
这听起来可能没什么大不了的,但对于 RDBMS 支持的站点来说,RDBMS 通常是一个重要的瓶颈,并且大部分性能工程都是围绕减少 RDBMS 上的争用展开的。如果您有少数用户发起攻击,占用数据库句柄 60 秒以上,并且您有一小部分数据库句柄,您可以看到它如何快速扩展以独占所有数据库句柄并阻止合法用户能够得到一个。
链接
http://dev.mysql.com/tech-resources/articles/guide-to-php-security-ch3.pdf
http://forums.mysql.com/read.php?24,13397,13397
解决方案
无论如何,更好的解决方案(如上面链接的MySQL手册和评论者@Maxence所提到的,是使用addcslashes()):
$username = addcslashes("%something_", "%_");
请注意,由于这里的sql示例使用准备好的语句,它们完全不受sql注入(inject)的影响,因此没有必要也不可取地使用mysql_real_escape_string();它执行的转义只是为了防止 sql 注入(inject)。我们试图防止的是通配符注入(inject),这需要一个转义两个 sql 通配符“%”和“_”的函数。
关于doctrine - 如何使用 Doctrine 转义 LIKE %$var% ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2843009/
我需要为登录用户生成一个建议列表。基本上是“既然你喜欢这些东西,而其他喜欢这些东西的人也喜欢这些东西,那么你可能也会喜欢这些东西”。 我可能会想出一个不错的算法来产生这样的结果,但在我重新发明轮子之前
此查询中有许多参数是用户可调整的,我希望用户能够创建一些文本文件,使用 sqlite3 db.sqlite ".read query.sql" > result.csv 运行查询,而不是直接将它们编辑
这个问题在这里已经有了答案: MySQL query finding values in a comma separated string (11 个回答) 11 个月前关闭。 我有一个名为 pape
我已将以下内容添加到我的 Blogger 模板中,以便在我的每个 Blogger 帖子上添加一个“赞”按钮: document.write('<iframe src="htt
当我点击“推荐”时,按钮打开的窗口隐藏(不可见)在页脚后面。其实我有截图来准确解释它:http://www.diigo.com/item/image/1q1ia/tw30 当然是XFBML,因为我知道
我在 facebook 上创建了一个页面“全民教育”。在我的网站中,我想提供一个点赞按钮来点赞此页面,而不是url,并且还想显示网站中该页面收到的点赞数以及点赞按钮。我使用了“添加这个”,但它显示了该
这个问题在这里已经有了答案: SQL Server, combining LIKE and IN? (3 个答案) 关闭 6 年前。 我想准备一个查询: SELECT name FROM Emplo
我有一个包含 200 条记录的表,其中 10 条记录的文本包含单词“TAX”。 当我执行时 Select * from tbl1 WHERE [TextCol] LIKE '%TAX%' 然后我正确地
我要执行查询: ---------------------- |name | ---------------------- |data
嗨,我正在为一个我没有设计的数据库编写 MySQL 请求,目前无法真正更改,我有一个问题,我还没有测试过这个,所以它可能按设计工作,但我没有当然。 所以我正在搜索的表只有三列 id、标题和描述,但描述
我已经尽力把这个问题说得很透彻了,所以如果你不耐烦,就跳到最后看看真正的问题是什么...... 我正在努力调整我们其中一个数据库中某些搜索功能的实现方式。为此,我正在向我们的应用程序 API 添加一些
我正在学习 MySQL,我尝试在查询中将“NOT LIKE”与“OR”结合起来,但没有成功。 假设我有一个 table1,其中有一列名为“word”,如下所示: word
Perl-Selenium 还提供了 Test::More 的标准方法,例如 ok()、like()、is() 等,也作为对象方法,例如$sel->like()。 ($sel 是 selenium p
我正在开发这个网站的前端:http://oq.totaleclips.com ,并从以下位置开发它:http://dev-jon.c2mx-hrd.appspot.com 我移动了社交按钮以使 UI
我正在创建一个搜索功能。我的 sql 查询使用 LIKE和 OR LIKE在 where 子句中。我正在搜索的表中的字段之一称为 quantity_types它只存储与在另一个表中找到的值相对应的代码
我有一个名为 platform 的表,其中有一列名为 entityid。 entityid 中的数据应该遵循 n.n.n 格式(其中 n = 1 个或多个数字,第一个数字是站点 ID)。 如果我运行这
所以,我正在练习考试(高中水平),虽然我们从未想过 SQL,但在处理 MS Access 时有必要了解一点. 任务是选择名称与其所属城镇不对应的区域ID。 解决方案中有以下示例: SELECT nam
1.作用与语法描述 作用: 正则表达式是使用指定字符串来描述、匹配一系列符合某个句法规则的字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。MongoDB 使用 $regex 操作符来设
我们有一个网站,其中有文章页面,每个页面上都有一个类似 Facebook 的按钮,并与该文章 URL(URL 编码)相关联。例如,在一些带有 url http://www.site.com/artic
我在理解 SQL 中的 LIKE 和 NOT LIKE 运算符时遇到问题。这是我执行的查询: select serial_number from UNIT U group by serial_numb
我是一名优秀的程序员,十分优秀!