Php 如何限制或限制用户可以在web表单(首选客户端)中输入的html标记?

Php 如何限制或限制用户可以在web表单(首选客户端)中输入的html标记?,php,javascript,security,Php,Javascript,Security,有哪些好的选项可以限制允许用户在表单字段中输入的html标记的类型?我希望能够做到客户端(可能使用JavaScript),服务器端(如果对用户的浏览器来说太重的话)和两者的结合(如果合适的话) 实际上,我希望用户能够提交与Stackoverflow上设置的标记相同的数据,加上标准的MathML标记。表格必须接受UTF-8文本,包括亚洲表意文字等 在应用程序中,用户必须能够提交带有基本html标记的文本条目,并且这些条目必须能够以用户安全的方式向(可能不同的)用户显示正确呈现的html。我计划使用

有哪些好的选项可以限制允许用户在表单字段中输入的html标记的类型?我希望能够做到客户端(可能使用JavaScript),服务器端(如果对用户的浏览器来说太重的话)和两者的结合(如果合适的话)

实际上,我希望用户能够提交与Stackoverflow上设置的标记相同的数据,加上标准的MathML标记。表格必须接受UTF-8文本,包括亚洲表意文字等

在应用程序中,用户必须能够提交带有基本html标记的文本条目,并且这些条目必须能够以用户安全的方式向(可能不同的)用户显示正确呈现的html。我计划使用
htmlspecialchars()
htmlspecialchars\u decode()
来保护我的数据库服务器端

非常感谢,

JDelage


PS:我搜索过但是找不到这个问题…

如果你想过滤输入的XSS攻击等等,考虑使用一个现有的类库。我自己还没有用过它,但它承诺了很多,受到了高度重视

HTML净化器是符合标准的 用HTML编写的HTML过滤器库 PHP。HTML净化器不仅会删除所有恶意 代码(更好地称为XSS)具有经过彻底审核的, 安全但允许的白名单, 它还将确保您的文档 符合标准,只有通过 全面了解W3C规范


如果您熟悉正则表达式,可以这样做:

<?php

function parse($string)
{
//To stop unwanted HTML tags being used
$string = str_replace("<","&lt;",$string); //Replace all < with the HTML equiv
$string = str_replace(">","&gt;",$string); //Replace all > with the HTML equiv

$find = array(
"%\*\*\*(.+?)\*\*\*%s", //Search for ***any string here***
"%`(.+?)`%s",           //Search for `any string here`
);

$replace = array(
"<b>\\1</b>",                                          //Replace with <b>any string here</b>
"<span style=\"background-color: #DDDDDD\">\\1</span>" //Replace with <span style="background-color: #DDDDDD">any string here</span>
);

$string = preg_replace($find,$replace,$string); //Do the find and replace
return $string; //Return the output
}

echo parse("***Hello*** `There` <b>Friend</b>");
?>

产出:


你好
那里
朋友

我认为这很容易使用,只需指定您允许的标记即可

有一段时间我也有类似的问题。有一些$%^&*)喜欢发表一些评论,比如
alert('Hello')或类似的东西。我累了,做了一个小函数,它帮助我只允许


标记正常查看消息。 我只是用PHP做的,但我想它可能会对你有所帮助

function eliminateTags($msg) {
    $setBrakes = nl2br($msg);
    $decodeHTML = htmlspecialchars_decode($setBrakes);

    # Check PHP version
    if(version_compare(PHP_VERSION, '5.2') == 1) {
        $withoutTags = strip_tags($decodeHTML, "<br />");
    } else {
        $withoutTags = strip_tags($decodeHTML, "<br>");
    }
    return $withoutTags;
}
函数消除器tags($msg){
$setBrakes=nl2br($msg);
$decodeHTML=htmlspecialchars\u decode($setBrakes);
#检查PHP版本
如果(版本比较(PHP版本,'5.2')==1){
$withoutTags=strip_标签($decodeHTML,
); }否则{ $withoutTags=strip_标签($decodeHTML,“
”); } 返回$withoutTags; }
在客户端进行反馈是个好主意,但您还需要在服务器端进行检查。试图插入恶意脚本的用户将能够绕过任何客户端检查,而这些正是您最希望防止在其中获得不需要的HTML的人。Duh。。。当然,你是对的。谢谢你!谢谢你的意见。这看起来有点复杂。我以前从未与图书馆合作过…@JDelage是的,进入图书馆需要一段时间,但我很确定这比自己开始清除所有潜在危险要容易得多。这很公平。另一个问题是向用户解释他们能做什么和不能做什么。我不想简单地说“您的代码是不允许的”。@JDelage您可以使用
strip_tags()
()与
allowed_tags
参数结合使用来进行初始筛选(如果检测到非法标记,则返回错误消息),然后运行HTML净化器。不确定这是否适用于所有情况,只是一个想法。