1

PHP の悪意のある単語フィルターを統合しようとしています 入力は $_REQUEST['qtitle'] と $_REQUEST['question'] を介して取得されますが、失敗しています

$USERID = intval($_SESSION['USERID']);

if ($USERID > 0)
{
$sess_ver = intval($_SESSION[VERIFIED]);
$verify_asker = intval($config['verify_asker']);
if($verify_asker == "1" && $sess_ver == "0")
{
    $error = $lang['225'];
    $theme = "error.tpl";
}
else
{
    $theme = "ask.tpl";
    STemplate::assign('qtitle',htmlentities(strip_tags($_REQUEST['qtitle']), ENT_COMPAT, "UTF-8"));
    STemplate::assign('question',htmlentities(strip_tags($_REQUEST['question']), ENT_COMPAT, "UTF-8"));
    if($_REQUEST['subform'] != "")
    {
        $qtitle = htmlentities(strip_tags($_REQUEST['qtitle']), ENT_COMPAT, "UTF-8");
        $question = htmlentities(strip_tags($_REQUEST['question']), ENT_COMPAT, "UTF-8");
        $category = intval($_REQUEST['category']);


        if($qtitle == "")
        {
            $error = $lang['3'];
        }
        elseif($category <= "0")
        {
            $error = $lang['4'];
        }
        else
        {
            if($config['approve_stories'] == "1")
            {
                $addtosql = ", active='0'";
            }
            $query="INSERT INTO posts SET USERID='".mysql_real_escape_string($USERID)."', title='".mysql_real_escape_string($qtitle)."',question='".mysql_real_escape_string($question)."', tags='".mysql_real_escape_string($qtitle)."', category='".mysql_real_escape_string($category)."', time_added='".time()."', date_added='".date("Y-m-d")."' $addtosql";
            $result=$conn->execute($query);
            $userid = mysql_insert_id();
            $message = $lang['5'];
        }
    }
}
}   

else
{
$question = htmlentities(strip_tags($_REQUEST['qtitle']), ENT_COMPAT, "UTF-8");
$redirect = base64_encode($thebaseurl."/ask?qtitle=".$question);
header("Location:$config[baseurl]/login?redirect=$redirect");exit;
}

次のコードを試していますが、このコードはすべての単語を置き換えます (配列に含まれていません)

FUNCTION BadWordFilter(&$text, $replace){

$bads = ARRAY (
  ARRAY("butt","b***"),
  ARRAY("poop","p***"),
  ARRAY("crap","c***")
);

  IF($replace==1) {                                        //we are replacing
  $remember = $text;

  FOR($i=0;$i<sizeof($bads);$i++) {               //go through each bad word
       $text = EREGI_REPLACE($bads[$i][0],$bads[$i][1],$text); //replace it
  }

  IF($remember!=$text) RETURN 1;                     //if there are any changes, return 1

 } ELSE {                                                  //we are just checking

  FOR($i=0;$i<sizeof($bads);$i++) {               //go through each bad word
       IF(EREGI($bads[$i][0],$text)) RETURN 1; //if we find any, return 1
  }     
 }
}
$qtitle = BadWordFilter($wordsToFilter,0); 
$qtitle = BadWordFilter($wordsToFilter,1); 

ここで何が欠けていますか?

4

2 に答える 2

0

この種の関数を使用する必要があると思います:

function badWordsFilter(&$text){
    $excluded_words = array( 'butt', 'poop', 'crap' );
    $replacements = array();

    $i = count($excluded_words);
    while($i--){
        $tmp = $excluded_words{0};
        for($i=0;$i<(strlen($excluded_words)-1);$i++){
            $tmp .= '*';
        }
        $replacements[] = $tmp;
    }

    str_replace($excluded_words, $replacements, $text);
}
于 2012-07-18T14:28:02.053 に答える
0

これが車輪の再発明であるという@Gordonに同意しますが、本当にやりたい場合は、ここから始めるのが良いでしょう:

function badWordFilter(&$text, $replace)
{
    $patterns = array(
        '/butt/i',
        '/poop/i',
        '/crap/i'
    );

    $replaces = array(
        'b***',
        'p***',
        'c***'
    );

    $count = 0;
    if($replace){
        $text = preg_replace($patterns, $replaces, $text, -1, $count);
    } else {
        foreach($patterns as $pattern){
            $count = preg_match($pattern, $text);
            if($count > 0){
                break;
            }
        }
    }

    return $count;
}

ただし、多くの固有の問題があります。たとえば、テキストに対してフィルターを実行しますHow do you like my buttons?...最終的にはHow do you like my b***ons?

于 2012-07-18T14:19:13.517 に答える