iT邦幫忙

1

<Javascript> 防 SQL Injection

  • 分享至 

  • twitterImage

各位大大好

小弟接手維護一套Classic ASP老網站
發現其中存在大大小小SQL Injection漏洞
URL注入部分已自行處理好了
但是登入表單仍有問題

以前是使用身分證號作為登入密碼
也同樣用JS在擋Inject
但最近改成亂數密碼.如(H38a8BM46w)
原本的JS自然會造成無法登入
但實在不知如何修改...
想向各位大神請益

謝謝
.....
以下附上原始程式碼

function checkvalue() {
        var tmp = login.id.value.toLowerCase();

        var passwordtmp = login.password.value.toLowerCase();
        if (passwordtmp.length < 10) {
            alert("請輸入10碼的密碼 (身分證號碼)!");
            return false;
        }
        if (passwordtmp.substring(0, 1) < "a" || passwordtmp.substring(0, 1) > "z") {
            alert("密碼請使用英文字母開頭");
            return false;
        }
        for (p = 2; p < passwordtmp.length; p++) {
            tmp2 = passwordtmp.substring(p, p + 1);
            if (tmp2 < "0" || tmp2 > "9") {
                alert("密碼後8碼請使用數字,請勿使用其他文字");
                return false;
            }
        }
        return true;
    }
看更多先前的討論...收起先前的討論...
淺水員 iT邦大師 6 級 ‧ 2021-06-23 14:14:51 檢舉
SQL Injection 在瀏覽器端擋是沒有用的
攻擊者不會乖乖地用你寫的網頁送資料
serverguy iT邦新手 5 級 ‧ 2021-06-23 14:18:30 檢舉
回覆潛水員大大
主管認為沒必要改寫後端
因為這是內部系統...
老職員阿姨伯伯們"應該"不會想去搞這些...
謝謝回覆
淺水員 iT邦大師 6 級 ‧ 2021-06-23 14:57:14 檢舉
你要先想好密碼的規則是什麼
目前的限制是「英文+任意+8個數字」
而你亂數產生的密碼並不符合這樣的規則

實作的部分可以考慮用 regex 會比較簡單
參考:https://www.w3schools.com/jsref/jsref_search.asp
serverguy iT邦新手 5 級 ‧ 2021-06-23 16:03:44 檢舉
應該說還算是符合英+數規則啦
直接貼密碼產生段程式碼給大大看好了
tmpstr = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
randomize
randstr=""
for j=1 to 10
randstr = randstr & mid(tmpstr,int(62*rnd+1),1)
next
抱歉如果有誤會的地方是我問的不夠好
謝謝回覆
froce iT邦大師 1 級 ‧ 2021-06-23 16:18:45 檢舉
你直接說英文字母大小寫加數字共10位就好
那看來我的code直接矇對了,你直接用就好。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
小魚
iT邦大師 1 級 ‧ 2021-06-23 14:10:05

為什麼是在前端擋?
Injection不是後端的問題嗎?

看更多先前的回應...收起先前的回應...
serverguy iT邦新手 5 級 ‧ 2021-06-23 14:15:55 檢舉

回覆小魚大大
因為後段被改到亂七八糟
只好用前端最粗淺的方式擋
至少內部系統比較不會有人想破解它
謝謝回覆

小魚 iT邦大師 1 級 ‧ 2021-06-23 16:13:08 檢舉

如果是內部系統,
可能會比較安全一點吧...

我好奇你的問題是甚麼?
看不懂它在寫甚麼嗎?
那你還是先從基本的程式跟JavaScript開始學,
才不會改好了一個,
又改壞了另外一個...

serverguy iT邦新手 5 級 ‧ 2021-06-23 16:17:51 檢舉

不是不是
原本那串JS也是我寫的
只是密碼格式改掉之後有點迷茫
不知道怎麼改能考慮才是最周到的
不會擋了這個放了另一個
或者不小心搞砸系統
謝謝回覆~

小魚 iT邦大師 1 級 ‧ 2021-06-23 16:23:18 檢舉

force大大的方法應該是可行的,
因為你原本的判斷方式不能用了,
變成每個都可能是英文或數字.

如果要防SQL Injection應該也是可以,
(排除對方連js都改掉的情況)
畢竟你已經把空白跟特殊符號過濾掉了.

小魚 iT邦大師 1 級 ‧ 2021-06-23 16:24:00 檢舉

題外話,
如果哪個年輕小夥子能把js都能改掉,
邀請他來做IT吧.

小魚
其實!!!可以!!
最基本的F12打開。什麼JS都可以改掉了。

小魚 iT邦大師 1 級 ‧ 2021-06-23 19:04:40 檢舉

㊣浩瀚星空㊣
我知道可以改啊,
但是有辦法改的人,
應該可以來做IT的工作了 XD

Lin2602 iT邦新手 5 級 ‧ 2021-06-29 09:10:30 檢舉

哪有,只要稍微有一點點了解的人就可以很簡單的 bypass 掉前端檢查啊 @@

1
froce
iT邦大師 1 級 ‧ 2021-06-23 14:53:11

你這樣只有在前端做檢查使用者輸入而已,不建議。改了跟沒改一樣,說真的還不如繼續用舊的

function checkvalue() {
        var re = /^[a-zA-Z0-9]{10}$/
        if (re.test(login.password.value)) {
            return true;
        } else {
            alert("密碼格式不符");
            return false
        }
        
    }

老職員阿姨伯伯們"應該"不會想去搞這些...

這些阿姨伯伯們更不會去搞什麼injecting...
依你主管的邏輯,根本不用改好嗎?XD

看更多先前的回應...收起先前的回應...
serverguy iT邦新手 5 級 ‧ 2021-06-23 16:06:01 檢舉

真的~
主要還是想擋'or 1=1 --
這種攻擊法啦
真正想攻的人不會吃我這套
主要是防新進小伙手癢之類的XD
謝謝回覆

froce iT邦大師 1 級 ‧ 2021-06-23 16:16:43 檢舉

新進小伙手癢就把他抓來一起修code,就不會手癢了啦。

Andy Tsou iT邦新手 5 級 ‧ 2021-06-24 14:13:08 檢舉

or 1=1 SQL參數就解決了

froce iT邦大師 1 級 ‧ 2021-06-24 14:43:16 檢舉

對啊,改前端幹麻...

1
耿直小伙
iT邦新手 1 級 ‧ 2021-06-23 14:58:39

用亂數密碼代表沒規則,所以不用想東想西,只要避免輸入空值,沒登入成功顯示失敗就好,這也不叫防 SQL Injection,純粹防呆

serverguy iT邦新手 5 級 ‧ 2021-06-23 15:59:51 檢舉

笑死XD
真的是防呆
但也是規劃防 'or 1=1 --
這種菜菜的攻擊
只能說防君子不防小人啦
謝謝回覆

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-23 15:41:19

這只是資料格式的檢查驗證
跟 SQL Injection 沒什麼搭嘎

function checkvalue() {
        var tmp = login.id.value.toLowerCase();

        var passwordtmp = login.password.value.toLowerCase();
        if (passwordtmp.length < 10) {
            alert("請輸入10碼的密碼!");
            return false;
        }
        
        //Regular Expression for Alpha-Numeric
        var pattern=/^[a-zA-Z0-9]+$/;

        //If the inputString is NOT a match
        if (!pattern.test(passwordtmp)) {
          alert("not a match");
          return false;
        }

        return true;
    }
看更多先前的回應...收起先前的回應...
serverguy iT邦新手 5 級 ‧ 2021-06-23 15:57:54 檢舉

啊大大抱歉...
我突然意識到我好像問錯了...
是防 'or 1=1 -- 這種攻擊啦
也算是 SQL Inject攻擊吧
謝謝回覆

誠如上面各位高手所說
要防 "or 1=1" 這種攻擊
要修改的是 server 端的程式而不是 javascript

serverguy iT邦新手 5 級 ‧ 2021-06-23 16:10:20 檢舉

了解!這我會再跟主管溝通
主要是想防"試試手氣"的年輕同仁
我也在想長輩們應該沒這麼閒
沒事搞攤內部系統應該沒太大好處
因目前主管認為重整老程式還要花時間
折衷處理改用JS當前端守門員
謝謝回覆~

archer9080 iT邦研究生 4 級 ‧ 2021-06-23 16:23:45 檢舉

ㄜ...個人覺得能知道SQL Injection
還知道 "or 1=1" 手癢想試試
只守前端應該也沒用吧/images/emoticon/emoticon06.gif

當警告也許還可以

但後端應該也要防一下

直接紀錄是哪位小可愛 約來一起聊聊/images/emoticon/emoticon71.gif

如果是這樣
那麼/^[a-zA-Z0-9]+$/的 Regular Expression 應該就夠了
(只允許 a-z,A-Z,0-9,不允許其他符號)

froce iT邦大師 1 級 ‧ 2021-06-24 11:01:51 檢舉

ㄜ...
不用寫到這麼多,一個 /^[a-zA-Z0-9]{10}$/就包含檢查字數了,我上面的code。

froce iT邦大師 1 級 ‧ 2021-06-24 11:06:17 檢舉

然後要修那種 or 1 = 1,我看一堆網頁都只教你防1=1的code,那2=2、3=3、'我要注死你'='我要注死你'呢?
要防sql injection的一定要後端,並且用框架省力多了。
sql injection修前端沒用的。

0
Lin2602
iT邦新手 5 級 ‧ 2021-06-29 09:11:25

在我看來,前端要做的事情就是儘量提高使用者體驗,完全不應該考慮到後端安全性,因為沒有意義。

我要發表回答

立即登入回答