使用设置 API 时,WordPress 是否转义数据以防止 SQL 注入?

Does WordPress escape data to prevent SQL injections when using the Settings API?

我很难找到有关此主题的任何信息。我正在创建一个插件,允许用户添加自定义 JS 代码,例如但不限于 Google Analytics。为此,我使用设置 API 创建了一个包含几个 textarea 字段的设置页面。我使用以下页面作为指南:https://developer.wordpress.org/plugins/settings/custom-settings-page/.

我的问题是,我需要做什么来确保进入数据库的数据是安全的?或者它已经安全了(即被 WordPress 转义)?我考虑过在 register_setting 函数的回调中使用 sanitize_textarea_field 函数,但是,数据(例如 <script src="example.com/script.js"></script)在被 WordPress 序列化后无论是否使用清理功能看起来都完全一样.

如果我使用设置 API,我是否可以安全地假设 WordPress 转义所有进入数据库的数据,或者我是否需要编写自定义代码来执行此操作?如果是这样,如果我使用设置 API,转义数据的过程是什么?

是的,当您使用 WP API(不仅用于设置,还包括其他功能,如 update_post_metawp_insert_post 等)时,WP 将确保该数据在发送到数据库之前已正确转义。

少数例外情况会明确说明您可以输入 SQL(例如 posts_orderby filter)。

除非你的数据中有不安全的字符(单引号!),否则你不会看到转义前后的变化。请注意,sanitize_* 函数不处理 SQL 注入,但会尝试清理内容。

您可以使用 $wpdb->prepare() 语句占位符技术使您的 sql 查询更安全,并在插入数据库之前防止 sql 注入。

如果你想在传递给 $wpdb->prepare() 语句之前清理用户输入的 textarea 值,你可以使用 sanitize_textarea_field() wordpress sanitizer 方法来清理 textarea 输入值。

 $table_name = 'myTable'; 
 $content =  isset($_POST['user_input']) ? sanitize_textarea_field($_POST['user_input']) : '';
 $myID = 12; 
 $wpdb->query($wpdb->prepare("UPDATE `$table_name` SET `your_column_1` = %s WHERE `$table_name`.`your_column_id` = %d", $content, $myID));