【问题标题】:PHP remove html and php code from user inputPHP 从用户输入中删除 html 和 php 代码
【发布时间】:2015-07-10 21:41:56
【问题描述】:

我正在尝试删除用户可能在文本区域中输入的任何代码。我尝试了很多东西,似乎没有任何效果。代码如下:

  function strip_tags_content($text, $tags = '', $invert = FALSE) { 

  preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags); 
  $tags = array_unique($tags[1]); 

  if(is_array($tags) AND count($tags) > 0) { 
    if($invert == FALSE) { 
      return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text); 
    } 
    else { 
      return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text); 
    } 
  } 
  elseif($invert == FALSE) { 
    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text); 
  } 
  return $text; 
} 
$message = $_POST['message'];
$message = nl2br($message);
$message = strip_tags($message);
$message = strip_tags_content($message);
$message = htmlentities($message);

即使有了所有这些,我仍然可以放置 html 标签并将它们打印出来并作为 html 运行。如何删除所有标签?

【问题讨论】:

  • 不要使用自己的 html 清理器,尤其是使用正则表达式。您可以不可靠地在 html 上使用正则表达式。特别是如果该 html 可能是错误的/结构错误的。开始使用 html 净化器,继续做更重要的事情。
  • html 净化器仍然允许诸如粗体标签和换行符之类的标签。我也不想要那些
  • 你目前得到的输入输出是什么?您应该在strip_tags 之后运行nl2br。
  • @chris85 当输入为:' dljsfkjhdsa
    ....?> hi 输出是 dljsfkjhdsa ....?> hi' with ....?> 粗体
  • 不是我在使用该功能时得到的,请参阅此处的演示 sandbox.onlinephpfunctions.com/code/…

标签: php html post input


【解决方案1】:

尝试使用filter_input 函数。

示例:

$message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);

或

$message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);

【讨论】:

  • 当我只使用 html 标签时它可以工作,但它不适用于everyting。例如当输入是:dljsfkjhdsa
    ....?> hi 输出是 dljsfkjhdsa ....?> hi with ....?> 粗体
  • 我建议您深入了解filter_input 函数,它有各种标志来确定您需要什么。
【解决方案2】:

您可以使用strip_tags 函数,默认情况下它会去除所有 HTML 和 PHP 标签,但您可以允许一些 HTML 标签(例如 a、b 或 span,在 cmets 中很有用)。

$message = strip_tags($_POST['message']);
$message = nl2br($message);

或

$message = nl2br($_POST['message']);
$message = strip_tags($message, '<br><br/>');

【讨论】:

  • 为什么投反对票? Strip_tags 运行良好,即使输入 dljsfkjhdsa
    ....?> 嗨
    :3v4l.org/8m8iv
  • 不知道downvote,但您应该在答案中提供代码。不仅仅是关于函数功能的声明。另请注意,OP 在代码中具有此功能,因此它可能不适用于他们..
  • 不是最难使用的功能,但还可以。我已经编辑了我的第一个答案。
  • 这与 OPs $message = strip_tags($message); 和您的答案没有区别。
  • 我不知道 OP 是如何测试他的代码的,但是只使用 strip_tags 可以得到很好的结果。在这种情况下不需要 strip_tags_content 或 htmlentities 函数。
【解决方案3】:

我正在尝试删除用户可能在文本区域中输入的任何代码。我尝试了很多东西,似乎没有任何效果

但是你为什么要这样做呢?这不是输入的真正问题。如果用户输入即&lt;script ....&gt; 或&lt;h1&gt;foo&lt;/h1&gt;,则不会造成任何伤害。这通常是输出(显示)的问题,所以我宁愿在数据显示之前调用 htmlspecialchars() 以“中和”HTML 标签

【讨论】:

  • 一开始我也想过这样做,但我的应用程序要求我应该能够使用 html 标签而不是用户。这实际上是从用户到用户的聊天(facebook 风格),我将所有消息保存在一个 txt 文件中。我需要添加指向用户个人资料的链接,所以这是不可能的。
  • 你的意思是你的代码使用了 HTML 标签?如果是这样,您使用了多少个标签?只是&lt;b&gt; 等或任何可能的东西?
【解决方案4】:

您可以使用 HTMLPurifier 类。使用起来真的很简单。

http://htmlpurifier.org/

阅读文档!!这是一个例子

function Sanitize_Inputs($inputs){
    require_once('.../HTMLPurifier/htmlpurifier.auto.php');
    $config = HTMLPurifier_Config::createDefault();
    $purifier = New HTMLPurifier($config);
    foreach ($inputs as $input_name => $valor){
        $inputs[$input_name] = $purifier->purify($valor);
    }
    $purifier=null;
    $config=null;
    return $inputs;
}


$sanitized=Sanitize_Inputs($_POST);
var_dump($sanitized);
exit;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2013-02-25
    • 2020-08-12
    相关资源
    最近更新 更多