1

我有一个 Web 脚本的特殊字符问题,该脚本执行命令以将用户名发送到我的游戏服务器以奖励他们进行投票。

<form action="index.php" method="GET"> <input type="submit" value="Submit" /> </form>

它使用正确的特殊字符和所有信息向数据库提交 - 但是当执行到我的游戏服务器时,它会否定特殊字符,他们可以通过使用名称 Testusername/ 或 Testusername// 来滥用它,并每天获得多个奖励。

我曾尝试使用隐藏类型,但我的系统无法使用 POST。

有任何想法吗?我很无奈。

编辑*

任何 0-9 _ az 字符都允许特殊字符为 !@#$%^&*()_+[}{} 等。我正在使用转义字符串,我不担心 sql 注入我尝试了多种清理方法和他们都失败了。我正在使用 mySQL,但不是为了发送奖励,它作为日志存在并验证过去 24 小时内未投票的用户并阻止他们再次投票。基本上说清楚,他们用用户名 Test 投票并获得奖励并用用户名 Test/ 投票,它说 Test 在游戏中再次投票并获得 x2 奖励

4

4 回答 4

2

简单preg_replace应该这样做:

$username = preg_replace('#[^a-z0-9_]#', '', $username);

这剥离了所有内容,但:

  • 小写字母字符
  • 数字 0 到 9
  • 下划线

如果大写是可以的,那么添加A-Z到正则表达式,或者可能strtolower()是预先输入。在保存输入或将其发送到其他服务器之前执行此操作。

我有点不确定您对游戏服务器的确切困境,但理想情况下,您应该从另一台服务器获得响应,以便在保存之前查看实际输入的用户名,并且您根本不必过滤它因为您将获得来自另一台服务器的过滤值。

于 2012-07-16T18:15:26.500 回答
0

像这样的东西应该可以工作..只需用所有坏字符填充 bad_chars 数组......

array $bad_chars = array('@', '!', '#'); // setup your chars to filter out

for($i = 0; $i < size_of($bad_chars); $i++) // iterate through them all
{
     str_replace($bad_chars[i], '', $_GET['string_to_be_filtered']); // replace all
}
于 2012-07-16T18:11:31.480 回答
0

由于您只想替换斜线,因此可以使用它。

<?php 
$user = $_GET["user"];
$user = str_replace("/", "", $user);
?>

这是在我之前的另一篇文章的更有效版本:

<?php 
$user = $_GET["user"];
$special = array('@', '!', '#'); 
$user = str_replace($special, "", $user);
?>
于 2012-07-16T18:18:58.340 回答
0

您可以替换以下内容以隐藏特殊字符

$formdesc = htmlentities($_POST['formdesc'], ENT_QUOTES, 'UTF-8');

希望这对你有帮助

于 2012-07-16T18:23:30.923 回答