Предотвращение управления URL нападает MVC?

Из того, как это звучит, вы хотите создать игру, в которой кирпичи получают урон при выстреле, но по какой-то причине они не получают урон. Вещи, которые я бы искал при отладке, это попытаться ответить на следующие вопросы:

1) Появляются ли пули, когда и где я хочу, чтобы?

2) Пули попадают в правильное направление?

3) Обнаружили ли кирпичи, что они были затронуты пулей?

Ваш пример кода дает подсказки только по вопросам 1 и 2. Одной из проблем может быть то, что ваша пуля расчет скорости посылает пулю в направлении, которое вы не ожидаете.

Попробуйте что-то вроде этого в LocalScript, чтобы убедиться, что пули созданы и перемещаются:

-- alias some variables to make it easier to find things
local fireButton = script.Parent -- <-- assumed that this is a button
local carWorkspace = script.Parent.Parent.Parent.Parent.Parent.Parent.Workspace
local car1 = carWorkspace.Car1
local machineGun = car1.Body.Weapons.MachineGun

-- create some constants for math stuff
local bulletSpeed = 30.0 -- <-- this is super slow so that we can test it
local counterGravityVect = Vector3.new(0, 93.2, 0) -- <-- this is witchcraft

-- make a helper for cloning bullets
local function createBullet(templateBullet, targetVector)
    local newBullet = templateBullet:Clone()
    newBullet.Transparency = 0
    newBullet.Anchored = false
    newBullet.Parent = game.Workspace

    -- use a BodyForce instead of Velocity to propel the bullet
    -- NOTE - there's no clear documentation about how much force you need
    --        just mess with bulletSpeed until it moves fast enough for you
    newBullet.Massless = true
    local targetForce = BodyForce.new()
    targetForce.Force = counterGravityVect + (targetVector * bulletSpeed)
    targetForce.Parent = newBullet

    return newBullet
end 

function fireGun()
    print("Gun fired, creating bullets...)

    -- play the bang sounds
    machineGun.Part1.Sound:Play()
    machineGun.Part2.Sound:Play()

    -- get the orientation of the machine gun
    local targetVect = machineGun.CFrame.LookVector

    -- spawn two new bullets and fire them
    -- in the same direction as the machine gun
    local b1 = createBullet(machineGun.bullet1, targetVect)
    local b2 = createBullet(machineGun.bullet2, targetVect)
end

-- listen for mouse or touch input to the
fireButton.Activated:Connect(fireGun)

Но вам также нужно убедиться, что ваши кирпичи получают урон при попадании. Вот простой способ сделать это:

1) Создать деталь

2) Добавить NumberValue как дочерний элемент

3) Добавить скрипт в деталь, которая выглядит как это:

print("Hello world!- wall")
local wall = script.Parent
local health = wall.Health
local maxHealth = 10

-- top off the health
health.Value = maxHealth

-- add an event listener to the wall to make sure that it can get shot
wall.Touched:Connect(function(toucher)
    print("Wall Touched ", toucher)
    if (toucher.Name == "bullet") then
        print("Got shot, losing health : ", health.Value - 1)
        health.Value = health.Value - 1
        toucher:Destroy()

        if health.Value <= 0 then
            wall:Destroy()
        end
    end
end)

Я надеюсь, что это несколько охватило основы того, что может пойти не так. Дайте мне знать, если что-то из этого не имеет смысла. Удачи!

11
задан Sam 17 August 2014 в 21:10
поделиться

4 ответа

Число 3 является правильным. Server-Side Security Validation - это всегда то, что вам нужно, потому что это механизм, который вы полностью контролируете и на который можете положиться.

Номер 1 - это Security by Obscurity, и если кто-то случайно опубликует свой URL где-нибудь (как люди часто делают с Session-IDs, когда копируют/вставляют ссылки), ваша "безопасность" будет нарушена.

Номер 2 кажется слабой защитой - если вы идете на такие хлопоты, лучше реализовать надлежащую защиту. Это также позволяет людям добавлять страницу в закладки.

18
ответ дан 3 December 2019 в 03:53
поделиться

You shouldn't make your URLs "manipulation-proof" to protect underlying functionality. Besides: most websites make URLs more readable like http://stackoverflow.com/questions/741653/preventing-url-manipulation-attacks-with-mvc for instance - obfuscation would be a step backwards.

Rather check for permissions within your Controllers and raise an exception if the user is not allowed to edit profile 6. If you don't want to have the "checks" everywhere, maybe you could put them into an ActionFilter, or create some helper method like CurrentUser.FindProfileToEditById(profileId) (which throws an exception if the action is not allowed) instead of Profile.FindById(id).

If you want a generic service where you do not have a "current user", you might go with the GUID (so does Doodle for instance) - however this will always be a security threat in various ways (Facebook had this issue with their photo-albums).

3
ответ дан 3 December 2019 в 03:53
поделиться

Я использую пользовательские фильтры авторизации для реализации контроля доступа на основе ролей и владельцев. Стандартный AuthorizationFilter позволит вам указать именованные роли или пользователей, которые могут иметь доступ к действию. Я расширил это, чтобы вы могли указать, что текущий пользователь может иметь доступ, если он является «владельцем» данных. У меня есть два дополнительных фильтра, RoleOrOwnerAuthorizationFilter и RoleOrOwnerAssociatedAuthorizationFilter. Сначала проверяется, что настраиваемый параметр (обычно id ), переданный в RouteData, является идентификатором текущего пользователя в моей таблице пользователей или если текущий пользователь входит в какую-либо из перечисленных ролей. Если это так, проверка завершается успешно, если нет, она возвращает представление об ошибке авторизации.

Вторая позволяет мне указать таблицу соединений и параметры, которые будут использоваться для связи параметра в RouteData со столбцом в таблице соединений и текущим пользователь к другому столбцу в соединительной таблице. Если существует запись, соответствующая как значению параметра, так и пользователю, я заключаю, что пользователь связан с данными и может иметь доступ. Это также разрешает доступ, если вы находитесь в указанной роли. Между этими тремя различными атрибутами у меня есть почти все мои потребности в управлении доступом, что означает, что я применяю безопасность просто путем украшения соответствующим образом настроенным атрибутом.

4
ответ дан 3 December 2019 в 03:53
поделиться

The url used to access your site is data from the client, and when security is concerned, you should always consider client provided data hostile.

Unfortunately there are no silver bullets to deal with this problem. You'll need to implement access restrictions throughout the application.

1
ответ дан 3 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: