您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關網站是怎么防范SQL注入,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
我們知道現在大部分網站的數據庫都是用的MYSQL,當網站出現如下方這樣的表單的時候,表單需要將數據錄入數據庫,但如果有個人非常熟悉MYSQL的語句,并且知道了表單的名稱(和列名稱),網站的擁有者并不注意這些的時候,那么他就可以輕松地注入。
如我的這個頁面中這個語句,就是非常容易收到攻擊的例子。
為了方便解釋,我們把它簡化一下:
mysqli_query($conn,"insert into XXXX(pick_name) values ('$_POST[pickName]')");
我們知道,它是將表單傳過來的 pickName(對應表單中的 拾物名稱*) 參數傳遞到數據庫內的XXXX中的pick_name列里
但如果“用戶”知道我們的表單名稱,它輸入:value');Delect from XXXX;--
如此,整個語句變成了:
mysqli_query($conn,"insert into XXXX(pick_name) values ('value');Delect from XXXX;--')");
那么恭喜你,XXXX這個表就消失了。
于是如果我敢這么輸入的話,我也把自己的網站黑了。
又比如php手冊中這個可怕的例子(MSSQL):
攻擊數據庫所在主機的操作系統(MSSQL Server)
<?php
$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
?>
如果攻擊提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作為變量 $prod的值,那么 $query 將會變成
<?php
$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
?>
MSSQL服務器會執行SQL的這條語句,添加了一個用戶,如此攻擊者將有可能獲得一個賬號訪問主機。
從上面大家也可以看到,SQL注入的關鍵就在于能否知道表的名稱,如果你還想弄一些小玩意兒,那你還得知道列名。這里和我們的題目無關就不再多講了。接下來講一下如何防范SQL注入。
常用的防范措施有兩種,一種是預處理語句、還有一種就是參數化查詢,這里我們講預處理語句。
$stmt = $conn->prepare('SELECT * FROM XXXX WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
bind_param就是將$name變量捆綁進入?中.'s'的意思是$name所對應的變量必須是一個字符串,這樣我們就固定了它必須是一個字符串,它不能轉化為命令。從而使得SQL注入無效。
上述就是小編為大家分享的網站是怎么防范SQL注入了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。