так что у меня проблема с безопасностью в моем коде.
Дело в том, что я написал некоторый код для размещения кнопки в форме, поэтому, когда вы нажимаете на нее, вы проверяете некоторые вещи. Итак, у меня есть кнопка, которая вызывает метод test_oid, который находится в моем контроллере. Этот метод отображает файл с тем же именем и так далее.
Моя проблема в методе контроллера. Этот метод вызывается через ajax, и я передаю некоторые параметры через ajax этому контроллеру, параметры, которые имеют значение с params [: что угодно]. Теперь, когда я отправляю sh это на мой gitlab, я пытаюсь слить, это говорит мне об уязвимости с помощью некоторого внедрения команд в этом методе, и очевидно, что это связано с параметрами.
Я знаю о name_object_params, в котором вы разрешаете, какие из них вы хотите использовать. Это мой метод params:
def monitor_category_params
params.require(:monitor_category)
.permit(:name, :description, :technology, :category, :main_category,
:impact, :operation, :sensor_types, :default,:oid, :snmp_vars, :snmp_oper,
:custom_tab_name, :custom_tab_unit, :redfish, :ipmi)
end
Но я думаю, что эти параметры используются для создания и обновления, когда вы нажимаете на кнопку отправки из формы, дело в том, что я все еще внутри формы, у меня нет нажал кнопку отправки еще.
Теперь, это мой метод в контроллере:
def test_oid
oid_result = ''
sensor_id = nil
sensor_ip = params[:sensor_ip] || nil
oid = params[:oid] || nil
if number?(params[:sensor_id])
sensor_id = params[:sensor_id]
end
community = Sensor.find(sensor_id).snmp_community if !sensor_id.nil?
if oid and community and sensor_ip
oid_result = `whatever`
end
if request.xhr?
render json: {result: oid_result}, :layout => false
end
end
и это вызов этого метода из ajax:
$.ajax({
url: "/monitor/test_oid",
type: 'GET',
dataType: 'json',
data: {oid: valor, sensor_id: sensor_id, sensor_ip: sensor_ip}
})
, где я передаю переменные, которые я использую позже с параметрами.
Так в чем здесь проблема? Код работает и все, но есть эта проблема безопасности, в которой, я думаю, люди могут вводить код с параметрами, но поскольку параметры, с которыми я работаю, взяты из ajax, в чем проблема? Спасибо за ответы, я очень новичок в этом языке и все еще пытаюсь понять маги c.
Эта ошибка, которую возвращает тест.
+SECURITY WARNINGS+
+------------+-------------------+----------+-------------------+------------->>
| Confidence | Class | Method | Warning Type | Message >>
+------------+-------------------+----------+-------------------+------------->>
| High | MonitorController | test_oid | Command Injection | Possible com>>
+------------+-------------------+----------+-------------------+------------->>
edit: as предложил, я использовал open3.capture2 вместо обратных галочек, так что теперь мой код выглядит так:
def test_oid
oid_result = ''
sensor_id = nil
sensor_ip = params[:sensor_ip] || nil
oid = params[:oid] || nil
if number?(params[:sensor_id])
sensor_id = params[:sensor_id]
end
community = Sensor.find(sensor_id).snmp_community if !sensor_id.nil?
if oid and community and sensor_ip
# We use Open3.capture2 to skip a command injection security problem.
oid_result = Open3.capture2('nice', '-n', '19', 'snmpbulkwalk', '-v', '2c', '-c', community, sensor_ip, oid)
oid_result2 = `echo "#{oid_result.first}" | awk '/kB$/{ $(NF-1)= $(NF-1)*1024;} {print $0}' | sed 's/ [A-Za-z]*$//' | awk '{print $NF}' | grep -o '[[:digit:]]*' | paste -s -d';' -`
end
if request.xhr?
render json: {result: oid_result2}, :layout => false
end
end
теперь тест выдает мне 2 ошибки ввода команд.