fix(security): resolve F-01 — parameterize SQL queries in RainfallController index()
This commit is contained in:
@@ -30,21 +30,31 @@ class RainfallController extends Controller
|
||||
->where('rainfall',1)
|
||||
->orderBy('stationid')->get();
|
||||
|
||||
$bindings = [];
|
||||
$stationCondition = '';
|
||||
if ($stationFilter)
|
||||
{
|
||||
$stationCondition = " AND s.stationid = '{$stationFilter}'";
|
||||
if ($stationFilter) {
|
||||
$stationCondition = " AND s.stationid = ?";
|
||||
$bindings[] = $stationFilter;
|
||||
}
|
||||
$bindings[] = $displayDate;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
$bindings[] = $dateFilter;
|
||||
|
||||
$rainfallData = collect(DB::select("
|
||||
SELECT
|
||||
s.stationid,
|
||||
s.name,
|
||||
s.district,
|
||||
-- selected datetime filter
|
||||
CAST('$displayDate' AS timestamp) AS selected_timestamp,
|
||||
CAST(? AS timestamp) AS selected_timestamp,
|
||||
|
||||
-- Latest hourly value
|
||||
(
|
||||
SELECT l2.hourly
|
||||
FROM rainfall l2
|
||||
@@ -53,7 +63,6 @@ class RainfallController extends Controller
|
||||
LIMIT 1
|
||||
) AS hourly,
|
||||
|
||||
-- Latest daily rainfall
|
||||
(
|
||||
SELECT l3.daily
|
||||
FROM rainfall l3
|
||||
@@ -66,27 +75,27 @@ class RainfallController extends Controller
|
||||
SELECT l4.timestamp
|
||||
FROM rainfall l4
|
||||
WHERE l4.stationid = s.stationid
|
||||
AND DATE(l4.timestamp) <= CAST('$dateFilter' AS date)
|
||||
AND DATE(l4.timestamp) <= CAST(? AS date)
|
||||
ORDER BY l4.timestamp DESC
|
||||
LIMIT 1
|
||||
) AS last_updated,
|
||||
|
||||
-- Historical daily values for the past 7 days
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST('$dateFilter' as date) - INTERVAL '6 days' THEN l.daily END) AS day1,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST('$dateFilter' as date) - INTERVAL '5 days' THEN l.daily END) AS day2,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST('$dateFilter' as date) - INTERVAL '4 days' THEN l.daily END) AS day3,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST('$dateFilter' as date) - INTERVAL '3 days' THEN l.daily END) AS day4,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST('$dateFilter' as date) - INTERVAL '2 days' THEN l.daily END) AS day5,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST('$dateFilter' as date) - INTERVAL '1 day' THEN l.daily END) AS day6,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST('$dateFilter' as date) THEN l.daily END) AS day7
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST(? as date) - INTERVAL '6 days' THEN l.daily END) AS day1,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST(? as date) - INTERVAL '5 days' THEN l.daily END) AS day2,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST(? as date) - INTERVAL '4 days' THEN l.daily END) AS day3,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST(? as date) - INTERVAL '3 days' THEN l.daily END) AS day4,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST(? as date) - INTERVAL '2 days' THEN l.daily END) AS day5,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST(? as date) - INTERVAL '1 day' THEN l.daily END) AS day6,
|
||||
MAX(CASE WHEN DATE(l.timestamp) = CAST(? as date) THEN l.daily END) AS day7
|
||||
|
||||
FROM station s
|
||||
INNER JOIN rainfall l ON s.stationid = l.stationid
|
||||
WHERE TO_CHAR(l.timestamp, 'HH24:MI:SS') != '00:00:00'
|
||||
AND l.timestamp >= CAST('$dateFilter' as date) - INTERVAL '6 days'
|
||||
AND l.timestamp >= CAST(? as date) - INTERVAL '6 days'
|
||||
$stationCondition
|
||||
GROUP BY s.stationid, s.name, s.district
|
||||
"
|
||||
",
|
||||
$bindings
|
||||
));
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user