Skip to content

Commit dda8d75

Browse files
committed
Bind rmqID instead of using stringWithFormat.
This is to fix #14846.
1 parent dbecea0 commit dda8d75

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

FirebaseMessaging/Sources/FIRMessagingRmqManager.m

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,14 @@ - (int64_t)queryLastRmqId {
277277
- (FIRMessagingPersistentSyncMessage *)querySyncMessageWithRmqID:(NSString *)rmqID {
278278
__block FIRMessagingPersistentSyncMessage *persistentMessage;
279279
dispatch_sync(_databaseOperationQueue, ^{
280-
NSString *queryFormat = @"SELECT %@ FROM %@ WHERE %@ = '%@'";
280+
NSString *queryFormat = @"SELECT %@ FROM %@ WHERE %@ = ?";
281281
NSString *query =
282282
[NSString stringWithFormat:queryFormat,
283283
kSyncMessagesColumns, // SELECT (rmq_id, expiration_ts,
284284
// apns_recv, mcs_recv)
285285
kTableSyncMessages, // FROM sync_rmq
286-
kRmqIdColumn, // WHERE rmq_id
287-
rmqID];
286+
kRmqIdColumn // WHERE rmq_id
287+
];
288288

289289
sqlite3_stmt *stmt;
290290
if (sqlite3_prepare_v2(self->_database, [query UTF8String], -1, &stmt, NULL) != SQLITE_OK) {
@@ -293,6 +293,13 @@ - (FIRMessagingPersistentSyncMessage *)querySyncMessageWithRmqID:(NSString *)rmq
293293
return;
294294
}
295295

296+
if (sqlite3_bind_text(stmt, 1, [rmqID UTF8String], (int)[rmqID length], SQLITE_STATIC) !=
297+
SQLITE_OK) {
298+
[self logError];
299+
sqlite3_finalize(stmt);
300+
return;
301+
}
302+
296303
const int rmqIDColumn = 0;
297304
const int expirationTimestampColumn = 1;
298305
const int apnsReceivedColumn = 2;

FirebaseMessaging/Tests/UnitTests/FIRMessagingRmqManagerTest.m

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,19 @@ - (void)testSavingSyncMessage {
8181
XCTAssertFalse(persistentMessage.mcsReceived);
8282
}
8383

84+
- (void)testQuerySyncMessageWithRmqID {
85+
// This is to make sure there is no sql injection vulnerability.
86+
NSString *rmqID = @"' --";
87+
int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 1;
88+
[self.rmqManager saveSyncMessageWithRmqID:rmqID expirationTime:expirationTime];
89+
90+
FIRMessagingPersistentSyncMessage *persistentMessage =
91+
[self.rmqManager querySyncMessageWithRmqID:rmqID];
92+
XCTAssertEqual(persistentMessage.expirationTime, expirationTime);
93+
XCTAssertTrue(persistentMessage.apnsReceived);
94+
XCTAssertFalse(persistentMessage.mcsReceived);
95+
}
96+
8497
/**
8598
* Test updating a sync message initially received via MCS, now being received via APNS.
8699
*/

0 commit comments

Comments
 (0)