【问题标题】:Prevent WordPress' default input sanitization防止 WordPress 的默认输入清理
【发布时间】:2021-09-07 06:31:27
【问题描述】:

每当我收到来自 <textarea>input 的输入时,WordPress 都会清理我的输入并转义所有特殊字符。如何禁用此功能?例如,如果我有以下接受 C++ 代码(如 cout<<"hello world";)的 html 代码,WordPress 会将其转换为 cout<<\"hello world\";

<!--HTML code-->
<form action="/action.php" method="post">
  <input type="text" name="mycode" value="cout<<'hello world';">
  <input type="submit" value="Submit">
</form>

.

<?php
    //PHP code for action.php file
    echo $_POST['mycode'];//This output will have all the special characters escaped
    //I need this to give me the original text entered by the user without /s. 
?>

我正在使用 WordPress 版本 5.7.2。每当我使用 \, ', " 之类的特殊字符时,它们前面都会出现\。我已经尝试过使用不同的 WordPress 主题,结果仍然相同。如果我使用stripcslashes($_POST['mycode']),则可以使用这些\。但是想知道是否有办法阻止 WordPress 从一开始就这样做。下面显示了我得到的输入和输出的图像。

【问题讨论】:

  • 嗨,你的意思是在数据库中保存值?因为 $_POST['mycode'];将在不消毒的情况下给出确切的值。如果它在保存在数据库中的同时进行清理,那么最好将值保存为序列化数组格式。
  • @ShaikhAejazAhmed 感谢您的回复。我没有将这些输入值保存在数据库中。如果我使用另一个非 WordPress 网站,$_POST['mycode']; 将在不对其进行清理的情况下给出准确的值。但是,如果我在 WordPress 网站中有这个,它会自动进行清理。我尝试更改为不同的主题,但我的输入仍然被清理了。我正在使用 WordPress 版本 5.7.2
  • 你能告诉我们你的action.php是什么样子的吗?您使用的是哪个版本的 PHP?也许您的虚拟主机正在强制 PHP 中的魔术引号自动转义所有内容?你能用 phpinfo() 检查魔术引号的状态吗?
  • 尝试使用变量更改提交结果并替换为:$final_mycode = str_replace('\','',$result_value_mycode); echo htmlspecialchars($final_mycode);
  • @WadihM。我正在使用 PHP 版本 7.4.11。我没有在我的 phpinfor() 中看到魔术引号。我使用的托管服务器是hostinger。 action.php 文件有 echo $_POST['mycode'];

标签: php wordpress validation


【解决方案1】:

你应该可以使用sanitize_text_field filter:

/*
* Filters the output from sanitize_text_field
* @param $filtered string - the sanitized string
* @param $original_string string - the original unsanitized string
*
* @return string - the unsanitized string
*/
add_filter( 'sanitize_text_field', static function( $filtered, $original_string ) { return $original_string; }, 10, 2 ); 

基本上,不是通过私有_sanitize_text_field 方法返回过滤后的字符串,而是返回传递到输入中的原始字符串。

您可以使用 sanitize_textarea_fieldtextareas 做同样的事情

【讨论】:

  • 感谢您的回答。我假设您提供的这段代码需要放在wp-includes/formatting.php 文件夹中的某个位置?还是我需要编辑他们现有的一些功能进行消毒。
  • 您可以将其添加到主题的functions.php 或插件文件中。
【解决方案2】:

这是一个非常简单的 hack-y 想法

/index.php 的顶部,在 WP 得到它对你传入数据的贪婪之前,添加以下行:

$_SPOST = null;
if (isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {
   $_SPOST = $_POST;
}

然后,只要您知道您将把代码内容传回浏览器

<?php
    //PHP code for action.php file
    echo $_SPOST['mycode'];//This output will have all the special characters escaped
    //I need this to give me the original text entered by the user without /s. 
?>

但是等等,还有更多……我们可以重新连接到 wordpress 生态系统中,并在我们的帖子经过修改和清理后对其进行改造。

This page 给了我使用parse_request 的想法,它会在当前请求的所有查询变量都被解析后触发。

function use_spost() {
  if (isset($_SPOST)) $_POST = $_SPOST;
}
add_action('parse_request', 'use_spost', 1);

【讨论】:

  • 感谢您的所有 cmets 和回答
【解决方案3】:

stripslashes_deep($_POST['mycode']) 应该可以工作。这个 WordPress 函数使用 PHP 内置函数 stripslashes,同时循环遍历数组或对象。请参阅code reference 了解更多信息。

WordPress 添加这些斜线是为了向后兼容magic quotes。从bug report 可以看出,过去 10 年来一直在讨论这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多