1
我需要評估一些簡單的用戶提交的數學。例如,乘以2個數字。javascript評價簡單的用戶提交的數學node.js
這讓我開始注射攻擊。
我的計劃是將一堆值列入白名單,並在評估前用正則表達式替換其他所有內容。
這有什麼問題嗎?
例字符串:
324*32
(5+4-17)/3
我需要評估一些簡單的用戶提交的數學。例如,乘以2個數字。javascript評價簡單的用戶提交的數學node.js
這讓我開始注射攻擊。
我的計劃是將一堆值列入白名單,並在評估前用正則表達式替換其他所有內容。
這有什麼問題嗎?
例字符串:
324*32
(5+4-17)/3
我想不出任何特別惡劣的方式來弄亂你的服務器太多隻使用數字和運營商屈指可數,但是,也有一些事情你需要找出於:
鑑於[^...]
是一個字符類,您不需要將每個值與|
分開。這可能是你真正想要的:[^^()\d*\/+-]
。這將匹配你所做的一切不是想要允許的。
此外,重要的是要記住,在JavaScript中,^
不代表權力,而是「排他性」或「排他性」。這意味着,例如,那2^3 == 1
。所以你可能不希望白名單^
:[^()\d*\/+-]
。
您可能會遇到像(1 * (2 + 3)
這樣的無效語法,因此您應該留意這一點。你可能只需要一個try catch塊並且有意義地處理這樣的事情(把問題報告給用戶或其他東西)。
請添加字符串樣本進行檢查。正如我所假設的那樣,字符串'54 * 4'或'5 - 7'必須通過正則表達式測試? – 2011-05-18 16:00:19
不是你的問題的答案,但是你的角色類是錯誤的 - 你不需要管道,'^'在開始時否定了它,並且你不能在角色類中使用重複操作符。改用'[()^ \ d */+ - ]'。 – 2011-05-19 05:47:26
如果您將'[',']'和'!'添加到該集合中,我們可以開始造成一些損害! '([] [1] + [])[2] +(![] + [])[4] +([] [1] + [])[1] +([] [1] + [] )[5] +(![] + [])[4] +([] [1] + [])[2]'===''denied'' – 2011-05-19 06:17:48