Skip to content

Commit 12b8d51

Browse files
committed
Audit fix and unit test for "JSON injection inside token metadata"
1 parent f7d8e69 commit 12b8d51

3 files changed

Lines changed: 88 additions & 45 deletions

File tree

contracts/zkPhoto.sol

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,24 @@ contract zkPhoto is ERC721 {
3737
verifierAddr = _verifier;
3838
}
3939

40+
/**
41+
* @dev check invalid characters in input string
42+
* @param String input string to be checked
43+
*/
44+
function HasQuotationMark(
45+
string calldata String
46+
) private pure returns (bool) {
47+
bytes calldata StringBytes = bytes(String);
48+
bytes1 quote = bytes1("\"");
49+
uint256 length = StringBytes.length;
50+
for (uint256 i = 0; i < length; ++i) {
51+
if (StringBytes[i]==quote) {
52+
return true;
53+
}
54+
}
55+
return false;
56+
}
57+
4058
/**
4159
* @dev generateTokenURI based on input
4260
* @param name name in tokenURI
@@ -93,19 +111,21 @@ contract zkPhoto is ERC721 {
93111
uint256[2][16] calldata c,
94112
uint256[65][16] calldata input
95113
) public returns (uint256) {
114+
require(!HasQuotationMark(name) && !HasQuotationMark(description) && !HasQuotationMark(image), "Invalid metadata");
115+
96116
bytes32 _hash = generateHash(input);
97117

98118
require(!hashExists[_hash], "Image already exists");
99119

100-
for (uint256 i = 0; i < 16; i++) {
120+
for (uint256 i = 0; i < 16; ++i) {
101121
uint256[2] memory _a = [a[i][0], a[i][1]];
102122
uint256[2][2] memory _b = [
103123
[b[i][0][0], b[i][0][1]],
104124
[b[i][1][0], b[i][1][1]]
105125
];
106126
uint256[2] memory _c = [c[i][0], c[i][1]];
107127
uint256[65] memory _input;
108-
for (uint256 j = 0; j < 65; j++) {
128+
for (uint256 j = 0; j < 65; ++j) {
109129
_input[j] = input[i][j];
110130
}
111131
require(

test/malicious_token.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"name":"hong kong add oil\", \"image\": \"hi","description":"pouring latte art","image":"data:image/png;base64,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"}

0 commit comments

Comments
 (0)