iT邦幫忙

0

PHP正規表示 - 疑問

我為了過濾使用者輸入可能造成SQL Injection問題,所以用preg_replace()去過濾成特定輸出,我希望產生的效果是:

  1. 允許不分大小寫英文字母以及數字
  2. 特殊符號只允許 ",",其餘皆替換成空白
    我目前設計的規則如下:
$str = "1#2,'3'4--";
$pattern = '/[\W]/';
$replacement = '';
$val = preg_replace($pattern, $replacement, $str);
echo $str; // 1234

我想顯示的是 12,34,請問第2點可如何實現?

看更多先前的討論...收起先前的討論...
wrxue iT邦新手 1 級 ‧ 2021-03-04 10:02:48 檢舉
要預防被注入、安全的執行SQL,必定要用「Parameterized Query」 + 「Prepared Statement」,缺一不可
用黑名單限制符號,能限制到多強程度?
player iT邦大師 1 級 ‧ 2021-03-04 15:35:15 檢舉
參數化查詢
https://zh.wikipedia.org/zh-tw/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2
$pattern = '/[^\w^\d^\.]/';


最後一行應該是
echo $val;
吧?
eric1223 iT邦新手 5 級 ‧ 2021-03-05 15:18:17 檢舉
是,撰寫內容的時候打錯了,謝謝提醒

2 個回答

2
舜~
iT邦高手 1 級 ‧ 2021-03-04 11:23:29
最佳解答

preg_replace的正規表示使用 /[^0-9A-z,]/ ,將符合的全部取代呈空白即可,
屆時只會剩下 0~9,大小寫a~z,"," ,其他的都變成空白了

1
Han
iT邦新手 3 級 ‧ 2021-03-04 10:03:49

我想這問題應該不太算是php 算正規表示的問題
https://regex101.com/ 可透過此網站測試
改成以下,去除掉 非文字、逗號 就是你要的結果了
[\W,]

看更多先前的回應...收起先前的回應...
Han iT邦新手 3 級 ‧ 2021-03-04 10:05:45 檢舉

不過也如樓上 wrxue 所說
避免injection不會這樣處理,應該透過 bind variable 方式進行處理

\W 有包含底線,可能要直接寫 [^A-z0-9,]

eric1223 iT邦新手 5 級 ‧ 2021-03-04 10:18:13 檢舉

SQL語法有使用參數化查詢的寫法,但有欄位是用in的方式,所以值才會用到",",[^A-z0-9,]確實可以符合條件,感謝各位提供建議與說明。

wrxue iT邦新手 1 級 ‧ 2021-03-04 11:07:14 檢舉

用 in 也可以使用參數化查詢,請不要用字串串接的方式累死自己又不安全

我要發表回答

立即登入回答