繁体   English   中英

在页面上呈现时如何使mysql存储变量中的链接可点击

[英]How to make a link in a mysql stored variable clickable when rendered on the page

我有一个功能,使站点上的成员可以互相发送消息; 该消息存储在mysql数据库中。

现在我的问题是:允许成员在邮件中包含链接,以便在呈现时将其呈现为可点击链接的最佳方法是什么。

我尝试了以下方法:

<a href="testpage.html"> click here</a>

但是当我然后尝试在页面上呈现它时,它显示为:

$message = nl2br($this->escapeHtml(trim($this->theMessage[0]['message'])));
echo $message;  // <a href="testpage.html"> click here</a>

$ messagesvar_dump值是:

string '&lt;a href=&quot;testpage.html&quot;&gt; click here&lt;/a&gt;'

实现目标的一种简单方法是保存包含<a>标记的消息。

您可以使用HTML清理程序,以便在删除任何潜在危险标签的同时接受用户的<a>链接标签。

这样,当您输出保存的文本时,就不会转义。

看看HTML净化器

另外,您可以使用Markdown解析器将纯文本转换为HTML。

您的代码删除了html标记,并将其替换为书面形式...

escapeHtml()

您需要的是一个功能,该功能可以删除您所有的html标签,但在这种情况下,您需要移除的标签(链接标签)

<a>

这是可以将其添加到代码中的功能:

function stripme($msg){    

$msg = strip_tags($msg,'<a>'); 

return $msg ;    

}

然后像这样调用它作为消息:

$message = nl2br($this->stripme($this->theMessage[0]['message']));

HTML标记很复杂,因为在向用户显示标记时,如果有人将不良的HTML注入标记中,那么您手上就会受到XSS攻击。 想象一下增加了onclick拦截等等。来自外部的任何数据都是危险的。

标记语言

这就是为什么存在诸如BBCode和markdown之类的标记语言的原因之一。 您不希望每一个HTML标记都只是干净和安全的内容。 基本上,您希望使用一组受限的“内容”。 允许来自外部的数据的一种方法是使用“中间”标记语言。 它是中间的,因为它是一种自定义格式,后来被转换为HTML。

这也发生在Stackoverflow上: [link](http://google.com) = 链接

  • 告诉您的用户:“使用特殊语法插入链接”
  • 将内容保存到数据库。
  • 您存储到数据库中的内容类似于:

The message text. And some markdown [link](http://google.com) The message text. And some markdown [link](http://google.com)

  • 从数据库中获取消息时,将处理降价内容:

     $messageFromDb = 'The message. [http://google.com](google)'; $parsedown = new Parsedown(); $html = $parsedown->text($messageFromDb); echo $html; // ready to show 
  • 结果: <p>The message. <a href="google"><a href="http://google.com">http://google.com</a></a></p> <p>The message. <a href="google"><a href="http://google.com">http://google.com</a></a></p>

有一些库可供使用,例如

过滤html

另一种方法是允许HTML,但仅允许使用受限集。 您将必须过滤插入的HTML,以仅选择良好的内容并删除其余内容。

基于DOM的HTML过滤器

除了依赖过滤器库之外,您还可以提出基于“小” DOM的HTML过滤器。 下面的示例重新创建了一个糟糕的坏链接。 您还应该检查URL属性,以确保它们使用已知良好的方案(例如http :),而不会遇到麻烦的javascript:。 这允许将元素组合列入白名单,以控制嵌套和内容。

<?php

// content from form
$html = 'Message <a href="http://google.com" onClick="alert(\'Hello World!\')"><img title="The Link" /> Link Text</a>';

$dom = new DOMDocument;
$dom->formatOutput = true;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NOXMLDECL);

// filter, then rebuild a clean link
foreach ($dom->getElementsByTagName('a') as $node)
{
    // extract the values
    $title = $node->nodeValue;
    $href = $node->getAttribute('href');

    // maybe add a href filter?
    // to remove links to bad websites
    // and to remove href="javascript:"
    // oh boy ... simple questions, resulting in lots of work ;)

    // create a new "clean" link element
    $link = $dom->createElement('a', $title);
    $link->setAttribute('href', $href);

    // replace old node
    $node->parentNode->replaceChild($link, $node);
}

$html = $dom->saveXML();

// drop html, body, get only html fragment
// http://stackoverflow.com/q/11216726/1163786
$html = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|p))[^>]*>\s*~i', '', $dom->saveHTML());

var_dump($html);  

之前

Message <a href="http://google.com" onClick="alert(\\'Hello World!\\')"><img src="injectionHell.png" title="The Link" /> Link Text</a>

Message <a href="http://google.com"> Link Text</a>

存储“ HTML在数据库中”

  • 存储时:使用addslashes()。
  • 从数据库返回文本时:在借出之前应用stripslashes()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM