New Chat Filter Bypass Concern

It’s a server script, nothing can be done. Stop trying to correct things you don’t have knowledge on, please.

image
image

image
image

I can’t upload more due to amount of stuff I have to censor. Keep in mind it’s an “All Ages” game, this is not acceptable at all.

@evilitself can you like add some sort of anti-bypass please

Heya! Here I made a comprehensive code that detects if a user tries to send a bypassed chat message. It should work for every separator characters that does the bypassing stuff.

It also warns the user before kicking them. So no false kicks

--> Services
local TextService = game:GetService("TextService")
local Players = game:GetService("Players")

--> User warnings
local UserWarnings = {}

--> Create a simple character size library thing
local CharacterSizeLib = {
	Cache = {}
}
function CharacterSizeLib:GetSize(code : number)
	if self.Cache[code] then
		return self.Cache[code]
	end
	local param = Instance.new("GetTextBoundsParams")
	param.Size = 50
	param.Text = utf8.char(code)
	self.Cache[code] = TextService:GetTextBoundsAsync(param)
	return self.Cache[code]
end


function IsTextReallyFiltered(TextToScan : string, UserId : number) : "safe" | "attempted"
	local CleanTextToScan = ""
	local work = pcall(function()
		for _,Char in utf8.codes(TextToScan) do
			local CharSize = CharacterSizeLib:GetSize(Char)
			if CharSize.X > 2 then
				CleanTextToScan ..= utf8.char(Char)
			end
		end
	end)
	if not work then
		return "safe"
	end

	--> Something's sus about this text so we gotta try to filter it again but without those invisible characters
	if TextToScan ~= CleanTextToScan then
		local work,result : TextFilterResult = pcall(function()
			return TextService:FilterStringAsync(CleanTextToScan,UserId,Enum.TextFilterContext.PublicChat)
		end)
		if work and result:GetNonChatStringForBroadcastAsync() ~= CleanTextToScan then
			return "attempted"
		else
			return "safe"
		end
	else
		return "safe"
	end
end


local TextChatService = game:GetService('TextChatService')
local General : TextChannel = TextChatService:WaitForChild('TextChannels'):WaitForChild("RBXGeneral")
General.ShouldDeliverCallback = function(message : TextChatMessage, textSource : TextSource)
	local UserId = message.TextSource.UserId
	if IsTextReallyFiltered(message.Text,UserId) == "attempted" then
		
		--> Warn user
		UserWarnings[UserId] = (UserWarnings[UserId] or 0) + 1
		-- Your warn notification code thing here
		
		
		--> Kick player if they kept repeating it
		if UserWarnings[UserId] >= 5 then
			local Player = Players:GetPlayerByUserId(UserId)
			if Player then
				Player:Kick("No bypassed bad words please 🙏")
			end
		end
		
		return nil
	end
end
Players.PlayerRemoving:Connect(function(Player)
	UserWarnings[Player.UserId] = nil
end)

Spoiler I haven’t tested this code yet.

I hope this helps while Robox is still tinkering with their “child safety” features

@be_nj Could we maybe get some eyes on this (referring to OP, not the reply)? Shouldn’t be too hard to patch out. Let me know if you need me to file a bug report for better tracking.

I can confirm relevant teams are already aware and are working to address

5 Likes

I didn’t even know it was that easy to do WITHOUT exploits, why can you bypass by putting > symbols :sob:

Yea this has been a issue for a while

It works with most words it seems like which is a big concern

image

it shouldn’t be this easy to bypass the filter

I’m sorry, WITH ONE ARROW? Do they even filter custom names?

They do

image

They didn’t in the past but they are now filtering those names aswell since a few months

Honestly that’s dumb since only you can see them, but still, that’s such a stupid bypass, ONE > SYMBOL!?

At this point, they should filter the strings WITHOUT special symbols.

This has been tested and people use this to bypass words completely ingame

image

I don’t even know if this can get moderated because reporting is handeled by AI

This shouldn’t be really hard to fix

when did this discontinue? Luobu | Roblox Wiki | Fandom i dont remember it discontinuing at all

I thought they didnt support it anymore.

As far as my game goes, I have tried working with people to solve the bypass issue. I haven’t read up on this whole thread yet, so I’m unsure what conclusions you guys came to - but it was very difficult to adequately detect whether a message was trying to bypass the filter, or just using normal special characters. There are a good amount of characters people use to bypass the filter with, that also show up in other languages dialects.

I ended up just starting to log messages with special characters to see what characters people were using, and then adding a script that removes messages using those characters [that I manually added to a blacklist] from the chat. The issue is that there are an infinite amount of special characters that may or may not behave differently when shown on the Roblox client, and even if you get rid of the invisible characters, you are still left with character look-a-likes - like the Russian alphabet that has characters like these, “г, в, к, м, е, а, о, у, н, р, с, т, ш, ь.”

It’s also very difficult to consistently enforce. At first, I was planning on just kicking/banning people using characters, but I always found out that were false positives. It’d often kick people if they used certain emotes, or speak certain languages. I didn’t like the idea of kicking or banning people unreliably, so that’s how I just landed on trying to remove the messages instead. However, after I did this update, the bypassing did slow down but very quickly people found other methods to bypass and it became a never ending cycle of patching and then them discovering new methods. Ultimately, there’s only so much we can do without the help of Roblox. I would love to solve the problem, but I think people assume my game is enabling these behaviours even though almost all of these bypasses work on other games. It puts me in a weird position.

1 Like

Giving warning won’t be enough, some malicious peoples might spam some inapropriate messages until they get kicked, meanwhile they can report the game and get you falsely banned. I recommand using BanAsync for like 16 minutes so the player will be disconnected an unable to chat but not permanently banned.

Completely agree. Roblox has ignored my thread about this issue.

Still a problem… You guys still working on it huh?

What are the characters seen as by us?

Are they >, <, or just a space?