[英]How to make a clickable image that carries a variable to another page in php?
[英]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>
$ messages的var_dump值是:
string '<a href="testpage.html"> click here</a>'
实现目标的一种简单方法是保存包含<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在数据库中”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.