1

badwords次のように、不要な単語[]を格納するデータベーステーブルを作成id,wordします。

CREATE TABLE `badwords`(
`id` int(3) NOT NULL auto_increment,
`word` text,
PRIMARY KEY (`id`),
KEY `id` (`id`))

次の単語を保存したとしましょう

(1,ugly)
(2,yak)

今、私の訪問者はそれらの悪い言葉の1つを含むいくつかのリンクを投稿するかもしれません、そして私はこのようなものを喜んで使用します。

$user = "http://www.this_ugly_site.com"; // visitor post this (ugly) word within

// i'm gonna try to find any of bad words stored in my table

$qry="select * from badwords where word='$user'"; // how to do it (find)
$result=mysql_query($qry) or die($qry);
if(mysql_num_rows($result)=='0'){

echo "Good URL";

}else{

while($line=mysql_fetch_array($result)){

echo "Bad URL";

}}

私は適用する方法がわかりませんstrpos、そしてそれが本当に良い解決策であるか、または私が使用できる何か他のものがあるかどうか!

または私は使用できますか

$qry="select * from badwords where word LIKE '%$user%'";

ただし、SQLにユーザー提供の値が埋め込まれているため、安全ではないように見えます

だからどんなアイデアやそれを行う方法を助ける〜ありがとう

4

4 に答える 4

3

あなたがこのようなことをすることを主張するなら、私はあなたのためにMySQLにすべての仕事をさせます。あなたがする必要があるのは、オペランドの順序を、おそらくLIKE句でそれらを使用するのに慣れている方法と逆にすることです。

SELECT `word`
FROM `badwords`
WHERE '<user_input>' LIKE concat('%', `word`, '%')
LIMIT 1

基本的なPHPコードは次のようになります。

// User input
$user = "http://www.this_ugly_site.com";

// Find matching words
// Do NOT show mysql_error() or $query in a production environment!
$query = "
  SELECT `word`
  FROM `badwords`
  WHERE '".mysql_real_escape_string($user)."' LIKE concat('%', `word`,'%')
  LIMIT 1
";
$result = mysql_query($query) or die("MySQL Error: ".mysql_error()."\n".$query);

// Test for a match
if (mysql_num_rows($result)) {
  $row = mysql_fetch_assoc($result);
  echo "Bad URL (matches {$row['word']})";
} else {
  echo "Good URL";
}
于 2012-05-22T12:52:49.937 に答える
2

あなたは3つの別々の質問をしました:

  1. 使用方法strpos()

    これは、3 つのパラメーターを取るネイティブ PHP 関数です。PHP Docsを使用して学習することをお勧めします。それにもかかわらず、ここに例があります:

    strpos($string, $bad_word);
    
  2. より良い方法はありますか?

    おそらく。しかし、あなたが持っているものは悪くありません。strpos()は、より高速な文字列関数の 1 つです。何千もの不適切な単語があり、毎秒大量のリクエストがある場合は、毎回 MySQL にクエリを実行するのではなく、不適切な単語をキャッシュすることを検討する必要があります。ただし、時期尚早に最適化する必要はありません。とりあえず早めに失敗。それは、ループ外の悪い単語を見つけたときです。break

  3. MySQL で文字列をどのようにエスケープしますか?

    MySQLi拡張機能を使用することをお勧めしますmysqli->real_escape_string()

    例えば:

    $qry = "SELECT * FROM badwords WHERE word LIKE '%" . $dbc->real_escape_string($user) . "%'";
    
于 2012-05-22T12:48:17.537 に答える
2

文字列を逆方向に検索しています。これを行うために MySQL を使用するかどうかはわかりません。代わりに、テーブルからすべての悪い単語を引き出して、次のように文字列を検索します。

<?
$user_string = "http://www.this_ugly_site.com";

$query = "SELECT word FROM badwords";
$res = mysql_query($query);

$stringOkay = true;

while ($row = mysql_fetch_assoc($res))
{
    //use stripos for case insensitive matching
    if (stripos($user_string, $row['word']) !== false)
    {
        //this user string contains a bad word!
        $stringOkay = false;
        break;
    }
}

if ($stringOkay) echo "Good URL";
else echo "Bad URL";

OPでDaveRandomがコメントしたように、この検索方法を使用すると、多くの誤検知と誤検知が発生します。少し良い方法は正規表現を使用することですが、それでも確実ではありません。

#(^|\b)yak(\b|$)#iたとえば、' kayak ' ではなく 'yak' bot という単語をブロックしたい場合、これを実現するには、正規表現と単語のデリニエーター (\b) を使用し、次のような表現を使用します。このようなパターンで「leet speak」と綴られている場合、「ass」のようなものをブロックしますが#a(55|$$)#i、これもまた、誰かが入力しa5$たり、a**. 基本的に、これは「困難な問題」であり、完全なカバレッジ/保護を得るには、より複雑なソリューションが必要になります。

于 2012-05-22T12:42:24.140 に答える
1
$user = "http://www.this_ugly_site.com"; 
$qry="select word_column_name from badwords"; 
$badwords=mysql_query($qry);
if(badword($user,$badwords))
    echo "bad url";

function badword($user,$badwords)
{    
   foreach($badwords as $badword)
   {
     if(stristr($text,$badword))
     {
            return true;
     }
   }
   return false;
} 
于 2012-05-22T12:44:26.527 に答える