我将创建数据库表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)现在我的访问者可能会发布一些包含其中一个不好的词的链接,我愿意使用这样的东西。
$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中
所以有什么想法或者帮助怎么做~谢谢
发布于 2012-05-22 20:48:18
你已经问了3个独立的问题:
strpos()吗它是一个原生PHP函数,有三个参数。我鼓励您使用和学习PHP Docs。尽管如此,这里有一个例子:
$bad_word);
很有可能。但你所拥有的并不是坏事。strpos()是较快的字符串函数之一。如果每秒有数以千计的坏词和大量请求,那么您可能希望缓存这些坏词,而不是每次都查询MySQL。但是,不需要过早地进行优化。就目前而言,请及早失败。也就是说,当你发现一个不好的词时,你会转义MySQL中的字符串吗?
我建议您先使用MySQLi扩展,然后使用mysqli->real_escape_string()。
例如:
$qry = "SELECT * FROM badwords WHERE单词如‘%’。$dbc->real_escape_string($user)。"%'";
发布于 2012-05-22 20:52:50
如果你坚持做这样的事情,我会让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-22 20:42:24
您正在向后搜索字符串。我不确定我是否会使用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";正如DaveRandom在您的操作中所评论的那样,使用这种搜索方法,您将得出许多误报和漏报。一种稍微好一点的方法是使用正则表达式,但即使是正则表达式也不能证明是愚蠢的。
例如,您可能想要阻止单词'yak‘机器人而不是'kayak’,因此,您可以使用带有单词分隔符(\b)的正则表达式,并且您可以使用如下表达式:#(^|\b)yak(\b|$)#i,这也为您提供了阻止像"ass“这样的东西,当拼写为"leet speak”时,使用像这样的#a(55|$$)#i模式,但同样,这可能会导致漏报,因为有人可能输入a5$或a**。基本上,这是一个“难题”,你需要一个更复杂的解决方案来获得完整的覆盖/保护。
https://stackoverflow.com/questions/10702169
复制相似问题