如何阻止在HTML表单中输入特定单词

时间:2014-05-12 00:37:02

标签: php html forms

我正在尝试为游戏设置一个简单的帐户创建表单。我将发布我在下面使用的HTML和PHP。

我想要做的是阻止以下字词输入字符名称:

Mod, Owner, Mawd, M0d, 0wner

另外,我需要阻止这些特殊字符:

!@#$%^&*()_+|\`~

一旦被阻止,我的表格将100%完成,除非我决定更改模板。

这是用于检查输入到表单中的文本的PHP代码。

<?php //data.php
require_once 'login.php';

// Get values from form
$NAME        = $_POST['char_name'];
$PASS        = $_POST['char_pass']; 
$FORUM       = $_POST['forum_name'];
$TESTER      ="0";
$BANNED      ="0";
$RANK        ="1";

// Check if form is empty
if(trim($NAME) == '' || trim($PASS) == '' || trim($FORUM) == ''){
header('Location: http://www.runerecovery.us/ingame/notfilled.html');
}

// Check for duplicates
$query = mysql_query("SELECT * FROM accounts WHERE username='$NAME'");
if(mysql_num_rows($query) > 0){
header('Location: http://www.runerecovery.us/ingame/characterexists.html');
}else{

// Insert data into mysql
$sql="INSERT INTO accounts (username,password,forumname,tester,banned,rank)
VALUES ('$NAME','$PASS','$FORUM','$TESTER','$BANNED','$RANK')";
$result = mysql_query($sql);

// if successfully insert data into database, displays message "Successful".
if($result){
header('Location: http://runerecovery.us/ingame/registered.html');
}
else {
echo "ERROR";
}
}

2 个答案:

答案 0 :(得分:2)

您可以使用以下代码。检查是否有任何字段为空后,我会添加它。以下代码适用于所有大写和小写。

$invalidCharacterNames = array('Mod', 'Owner', 'Mawd', 'M0d', '0wner');

foreach($invalidCharacterNames as $invalidCharacterName){
    if(strtolower($invalidCharacterName) == trim(strtolower($NAME))){
        //redirect to error page
        header('Location: http://www.runerecovery.us/ingame/invalid_character_name.html')
    }
}

最重要的是,您的表单容易受到SQL注入 - 请在此处阅读:http://php.net/manual/en/security.database.sql-injection.php

另外,我建议你使用mysqli和预备语句 http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

更新:使用preg_match或strpos检查字符串中的特定字符。

答案 1 :(得分:1)

易。只需创建一个包含禁止项列表(例如名称)的数组,然后使用in_arraytrim($NAME)的值与其进行比较。我建议在检查后放置以查看表格是否为空:

// Check if form is empty
if(trim($NAME) == '' || trim($PASS) == '' || trim($FORUM) == ''){
  header('Location: http://www.runerecovery.us/ingame/notfilled.html');
}

// Set an array of banned names.
$banned_names = array('Mod', 'Owner', 'Mawd', 'M0d', '0wner');

// Check if the name is banned.
if(in_array(trim($NAME), $banned_names)) {
  header('Location: http://www.runerecovery.us/ingame/banned.html');
}

对于这些角色:

!@#$%^&*()_+|\`~

您可以使用preg_match查看这些字符是否也在名称中,并对其进行操作。我会看看能不能把东西放在一起。

编辑:好的,我有一个很好的preg_match,可以很好地适用于上面的字符:

preg_match("/(!|@|#|$|%|\^|\&|\(|\)| _|\+|\|\\|`|~)/is", trim($NAME));

现在创建一个可以使用它的条件:

// Check if the name has banned characters.
if(preg_match("/(!|@|#|$|%|\^|\&|\(|\)| _|\+|\|\\|`|~)/is", trim($NAME))) {
  header('Location: http://www.runerecovery.us/ingame/banned.html');
}

将这一切带到一起:

// Check if form is empty
if(trim($NAME) == '' || trim($PASS) == '' || trim($FORUM) == ''){
  header('Location: http://www.runerecovery.us/ingame/notfilled.html');
}

// Check if the name has banned characters.
if(preg_match("/(!|@|#|$|%|\^|\&|\(|\)| _|\+|\|\\|`|~)/is", trim($NAME))) {
  header('Location: http://www.runerecovery.us/ingame/banned.html');
}

// Set an array of banned names.
$banned_names = array('Mod', 'Owner', 'Mawd', 'M0d', '0wner');

// Check if the name is banned.
if(in_array(trim($NAME), $banned_names)) {
  header('Location: http://www.runerecovery.us/ingame/banned.html');
}

此外,您可以使用preg_grep代替in_array来执行不区分大小写的匹配,如下所示:

// Check if the name is banned.
if(preg_grep("/" . trim($NAME) . "/i" , $banned_names)) {
  header('Location: http://www.runerecovery.us/ingame/banned.html');
}