Understand and prevent common security vulnerabilities.
Clients can trigger server events with malicious data.
RegisterNetEvent('myresource:purchase')
AddEventHandler('myresource:purchase', function(itemId)
local source = source
-- Validate input
if type(itemId) ~= 'number' then return end
if itemId < 1 or itemId > 1000 then return end
-- Process purchase
end)Using load() or eval() with user input.
Never use eval with user input:
-- BAD
load(userInput)()
-- GOOD
-- Use whitelisted functions onlyUnsanitized SQL queries.
Use prepared statements:
-- BAD
MySQL.query('SELECT * FROM users WHERE id = ' .. userId)
-- GOOD
MySQL.query('SELECT * FROM users WHERE id = ?', {userId})