WordPress会清理WP_QUERY的参数吗?

时间:2021-05-04 作者:emersonthis

这是一个非常直截了当的问题,但它很重要,我在文件中找不到任何明确的内容。

This question 针对\'s\' 参数。我想知道WordPress是否验证/清理any 其他参数。例如,在tax_query 是否自动进行消毒?

Clarification:这是一个技术/工程问题,具体涉及WP\\U查询类对特定参数的作用。最近的几个答案提供了有关验证/消毒的哲学建议和一般最佳实践。但这不是这个问题的重点。我的目标是收集事实而不是观点。

3 个回复
最合适的回答,由SO网友:Álvaro Franz 整理而成

这实际上是个好问题。当然,用户输入不可信,但也会对同一值进行两次清理”;以防万一”;不是解决问题的最佳方案。

这个问题的唯一真正答案可以通过查看代码并遵循所发生的事情来给出。

读了几个小时后,我可以说:

WP Query清理这些值,但并不是在一个地方完成所有操作。值在实际使用之前正在清理。这是一种非常有机的、随时可用的方法。此外,并不是所有的值都会被清理,但在这些情况下,SQL查询会使用一条准备好的语句。

让我们详细了解一下,当我们这样做时会发生什么:

$query = new WP_Query($args);
WP\\u查询类构造函数检查$args 是否为空数组。如果不是,它将运行query() 方法通过$args 数组(此时称为$query 阵列)。

$this->query($query);
Thequery() 方法调用init() 方法,该方法可取消设置以前可能的值并设置新的默认值。

然后它运行wp_parse_args()$args 大堆此函数不清理任何内容,它充当默认数据和输入数据之间的桥梁。

下一个电话是get_posts() 方法,该方法负责根据给定的查询变量检索帖子。

get_posts() 方法是parse_query() 方法,该方法首先调用fill_query_vars() 方法(此方法确保设置了默认键的列表。未设置的键将根据具体情况使用空字符串或空数组进行设置)。

然后,仍然在parse_query() 方法,进行第一次santization。

p 对照检查is_scalar() 并用intval()

而且absint() 用于以下值:

page_id
year
monthnum
day
w
paged
hour
minute
second
attachment_id
此外,apreg_replace(\'|[^0-9]|\'...) 正在运行m, cat, author 仅允许在这些上使用逗号分隔的正整数或负整数列表。

对于此时的其他值,仅使用trim()函数。以下情况如下:

pagename
name
title
之后,该方法开始检查我们正在运行的查询类型。是搜索吗?附件?一页?一个帖子。。。

如果apagename 设置,然后调用(不清理值)get_page_by_path($qv[\'pagename\']). 但通过检查函数源,我们可以看到该值已用esc_sql() before it\'s used for a database request.

之后,我们可以看到post_typepost_status 使用时,它们都经过消毒sanitize_key() (只允许使用小写字母数字字符、破折号和下划线)。

对于与分类相关的参数parse_tax_query() 方法被调用。

category__and, category__in, category__not_in, tag_id, tag__in, tag__not_in, tag__and 使用absint()

tag_slug__intag_slug__and 使用sanitize_title_for_query()

此时parse_query() 方法已结束,但我们仍在get_posts() 方法

posts_per_page 已消毒。

title 使用时未初始化,但带有prepared statement. 您可能会发现这个问题很有趣:Are prepared statements enough to prevent SQL injection?

那么我们有post__inpost__not_in 正在用absint().

如果您继续阅读代码并加以注意,您将看到所有键在接触SQL语句或使用准备好的语句之前实际上都已被清理。

因此,要回答您最初的问题:

Does WordPress sanitize arguments to WP_Query?

它确实净化了大部分,但不是全部。例如pagename, nametitle 仅为“;“已清理”;使用trim() 函数(不返回SQL安全值!)。但对于未清理的值,将使用prepared语句来执行数据库请求。

你应该相信这个吗

好吧,在这种特殊情况下,我更倾向于redundant 只需在将所有方法放入查询之前对其进行预先组织即可。

我也是,作为一名工科学生,我希望得到一个肯定或否定的答案。但请注意,WordPress的代码库是以一种自然的方式进化而来的,所以它就像大自然一样:凌乱。这并不意味着它不好。但混乱意味着可能存在一个看不见的边缘案例,有人可能携带炸弹潜入。你可以通过加倍守卫来防止这种情况!

SO网友:Cas Dekkers

我想知道是否必须清理用户输入any 其他参数。

您永远不应该信任用户输入,因此始终清理和/或验证它,无论它是否已经在core中完成。你的代码,你的责任。

Theme Handbook, 例如:

Don’t trust any data. 未经验证,不要信任用户输入、第三方API或数据库中的数据。保护WordPress主题首先要确保进入和离开主题的数据符合预期。始终确保在使用或输出前对输入数据进行验证并清理(转义)数据。

您也可以检查the code of the WP_Query class 为了你自己。快速搜索卫生处理相关代码,例如:。WordPress\'s built-in sanitization functions, 表明至少进行了一些消毒。但如果我是你,我最好是安全的,而不是抱歉,编写并测试我自己的消毒和/或验证逻辑。

SO网友:Buttered_Toast

我有一个简单的规则,这是我很久以前在学习fullstack开发时学到的。

如果不是您自己编写的数据/代码,请始终对其进行清理和验证。

永远不要相信来自任何地方的数据,真的,甚至不要相信来自facebook、google、github等老牌公司的数据。

即使你认为wordpress会清理信息,你也应该自己清理和验证。

永远不要像这样,它只是一个简单的新闻稿登记表,只有一个电子邮件字段,最糟糕的情况会发生什么?停下!

当您听说数据泄漏暴露了数百或数千(最好的情况下)用户数据时,有时会发生这种情况,因为一些开发人员只是说,可能发生的最坏情况是什么,甚至更糟的是,他不知道应该实施什么(基本)安全措施来防止这种泄漏。

始终清理和验证!

编辑

好吧,在再次阅读你的问题后,我想我现在明白你的意思了。

例如tax_query, 在查看wordpress github repo后,我发现与tax_query 正在由处理class WP_Tax_Query, 除其他事项外,中还处理传递到的数据的清理和验证tax_query.

现在,如果class WP_Tax_Query 手柄tax_query 我确信,如果我继续查找wordpress repo,我会找到更多处理其他属性的清理和验证的类或方法。

我想你最好去WP_Query 在wordpress repo中,深入研究您使用的所有属性,以了解如何WP_Query 处理其中的每一个

相关推荐

如何在class-wp-query.php中跟踪核心函数is_page()&is_Single上的通知警告

在我的生产站点上,我的这些产品已经超支了:PHP Notice: Trying to get property of non-object in /public_html/wp-includes/class-wp-query.php on line 3728 PHP Notice: Trying to get property of non-object in /public_html/wp-includes/class-wp-query.php on line 3730 PHP No