Php 利用漏洞进行单词匹配

Php 利用漏洞进行单词匹配,php,string,Php,String,我保留了过滤器,过滤掉了一些被屏蔽的单词,如ass,jerk等。我有这些单词的列表,如果存在,可以进行比较和屏蔽 一些用户使用它们,如je*k,f*ck,因此它们与列表不匹配,单词出现在页面上。有没有办法克服这个漏洞 类似地,对于shit用户使用sh/t。如何处理此类问题?如果您正在检查您可以使用的单个单词 如果您正在检查单个单词,则可以使用 这是我在评论ect框架上使用的一个函数,它加载一个并使用单词边界替换为*,在单词列表中,我使用*作为通配符,以免替换像chickenjerk这样的单词,当

我保留了过滤器,过滤掉了一些被屏蔽的单词,如
ass
jerk
等。我有这些单词的列表,如果存在,可以进行比较和屏蔽

一些用户使用它们,如
je*k
f*ck
,因此它们与列表不匹配,单词出现在页面上。有没有办法克服这个漏洞


类似地,对于
shit
用户使用
sh/t
。如何处理此类问题?

如果您正在检查您可以使用的单个单词


如果您正在检查单个单词,则可以使用


这是我在评论ect框架上使用的一个函数,它加载一个并使用单词边界替换为
*
,在单词列表中,我使用
*
作为通配符,以免替换像chickenjerk这样的单词,当我检测到漏洞时,只需将其添加到列表中即可

/**
 * Swear word filtering function, requires a list of words,
 * Second parameter reveals *n letters
 *
 * @param string $str
 * @param int $reveal
 * @return string
 */
function swear_filter($str, $reveal=null) {
    //load words from file, triming any whitespace
    //$words = join("|", array_filter(array_map('preg_quote',array_map('trim', file('./path/to/badwords.txt')))));

    $words = 'ass|jerk|je*k|f*ck|sh\/t|sh*t*';//<< comment this out when you set path to word list
    if($reveal !=null && is_numeric($reveal)){
        return preg_replace("/\b($words)\b/uie", '"".substr("$1",0,'.$reveal.').str_repeat("*",strlen("$1")-'.$reveal.').""', $str);
    }else{
        return preg_replace("/\b($words)\b/uie", '"".str_repeat("*",strlen("$1")).""', $str);
    }
}
//I like chickenjerk, you **** **** ***
echo swear_filter('I like chickenjerk, you jerk sh/t ass.');

//I like chickenjerk, you j*** s*** a**.
echo swear_filter('I like chickenjerk, you jerk sh/t ass.', 1); //with reveal
/**
*脏话过滤功能,需要一个单词列表,
*第二个参数显示*n个字母
*
*@param string$str
*@param int$discover
*@返回字符串
*/
函数过滤器($str,$REVEL=null){
//从文件中加载单词,修剪任何空白
//$words=join(“|”),array_filter(array_map('preg_quote',array_map('trim',file('./path/to/baddwords.txt'')));

$words='ass | jerk | je*k | f*ck | sh\/t | sh*t*“/这是我在我的评论框架上使用的一个函数,它加载一个并使用单词边界替换为
*
,在单词列表中我使用
*
作为通配符,以免替换像chickenjerk这样的单词,当我检测到漏洞时,我只需将其添加到列表中

/**
 * Swear word filtering function, requires a list of words,
 * Second parameter reveals *n letters
 *
 * @param string $str
 * @param int $reveal
 * @return string
 */
function swear_filter($str, $reveal=null) {
    //load words from file, triming any whitespace
    //$words = join("|", array_filter(array_map('preg_quote',array_map('trim', file('./path/to/badwords.txt')))));

    $words = 'ass|jerk|je*k|f*ck|sh\/t|sh*t*';//<< comment this out when you set path to word list
    if($reveal !=null && is_numeric($reveal)){
        return preg_replace("/\b($words)\b/uie", '"".substr("$1",0,'.$reveal.').str_repeat("*",strlen("$1")-'.$reveal.').""', $str);
    }else{
        return preg_replace("/\b($words)\b/uie", '"".str_repeat("*",strlen("$1")).""', $str);
    }
}
//I like chickenjerk, you **** **** ***
echo swear_filter('I like chickenjerk, you jerk sh/t ass.');

//I like chickenjerk, you j*** s*** a**.
echo swear_filter('I like chickenjerk, you jerk sh/t ass.', 1); //with reveal
/**
*脏话过滤功能,需要一个单词列表,
*第二个参数显示*n个字母
*
*@param string$str
*@param int$discover
*@返回字符串
*/
函数过滤器($str,$REVEL=null){
//从文件中加载单词,修剪任何空白
//$words=join(“|”),array_filter(array_map('preg_quote',array_map('trim',file('./path/to/baddwords.txt'')));


$words='ass | jer | k | f | ck | sh\/t | sh*t*';这样,类似的单词,如“shot”也不会被接受。你可以做的是,使用这样的算法将这样的单词放入主持人的队列中。然后主持人可以将它们列为白名单或黑名单,以改进未来的匹配。但是,对于较长的文本来说,会有很多开销…@kingkero True,我添加了一个只查看非字母字符串的检查。有人可能会直到只使用字母词(如shlt)来绕开它,但它不应该有falsepositives@FuzzyTree我不知道
ctype_alpha
-thx!而且我相信,如果有人想发布侮辱,不管怎样,他都会这样做。因此,这种代码应该非常有用,类似的单词,如“shot”也不会被接受。你可以做的是,使用这样的算法将这样的单词放入主持人的队列中。然后主持人可以将它们列为白名单或黑名单,以改进未来的匹配。但是,对于较长的文本来说,会有很多开销…@kingkero True,我添加了一个只查看非字母字符串的检查。有人可能会直到只使用字母词(如shlt)来绕开它,但它不应该有falsepositives@FuzzyTree我不知道
ctype_alpha
-thx!而且我相信,如果有人想发布侮辱,不管怎样,他都会这样做。所以这段代码应该非常有用。谢谢Loz,但我不明白第二个参数的用法重试,
echo-sware\u-filter('I like chickenjerk,you-jeck-sh/t-ass',1)
将产生
我喜欢chickenjerk,你是j***s***a**。
np,我花了很多时间试图找出这个困境,这是我能想出的最好办法,而不必手动检查每一篇文章。但这并不完美,不像人为干预。如果你对返回值稍加说明,
$1
说明了什么然后它会更清楚它是正则表达式匹配中的匹配词。非常感谢Loz,但我不明白这里第二个参数的用法。试试它,
echo-sware\u-filter('I like chickenjerk,you jurk sh/t ass',1)
将产生
我喜欢chickenjerk,你是j***s***a**。
np,我花了很多时间试图找出这个困境,这是我能想出的最好办法,而不必手动检查每一篇文章。但这并不完美,不像人为干预。如果你对返回值稍加说明,
$1
说明了什么那么它将更清楚地从正则表达式匹配中找到匹配的单词。