我正在尝试为游戏设置一个简单的帐户创建表单。我将发布我在下面使用的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";
}
}
答案 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_array
将trim($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');
}