如何保護Web 網站免受 SQL注入攻擊?
SQL注入攻擊是指攻擊者利用網站中合法使用者的輸入機制發送SQL 程式碼到資料庫執行,避免SQL 注入攻擊的黃金法則是:再來自外部來源的所有數據到達資料庫之前將其轉義。此法則不僅適用於INSERT 和UPDATE 語句,也適用於SELECT查詢~
在腳本的查詢中使用預編譯語句幾乎可以消除所有的SQL注入攻擊問題,但是如果選擇使用query()方法,將不具備這種保護一一必須對新增至查詢的使用者輸入手動轉義。其程式碼如下:
<?php $dbms = "mysql"; // 数据库的类型 $dbName ="php_cn"; //使用的数据库名称 $user = "root"; //使用的数据库用户名 $pwd = "root"; //使用的数据库密码 $host = "localhost"; //使用的主机名称 $dsn = "$dbms:host=$host;dbname=$dbName"; $name ='mr'; $name ="'or Name LIKE'%"; $query="select * from user where username = '".$name."'";//sql语句 try { $pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo $result = $pdo->query($query); //输出结果集中的数据 foreach ($result as $row){ //输出结果集中的数据 ?> <tr> <td bgcolor="#FFFFFF"><div align="center"><?php echo $row['username'];?></div></td> </tr> <?php } }catch (Exception $e){ echo "ERROR!!".$e->getMessage()."<br>"; } ?>
在這個實例中,假定SQL語句中的 $name 變數來自使用者提交的表單。通常使用者會提交像「mr」這種內容,這就會產生下面的SQL語句:
select * from user where username = 'mr'
這在腳本中不會造成任何問題,然而,一個「聰明」的攻擊者可能會輸入“'OR Name LIKE'%”,從而得到下面的SQL 語句:
select * from user where username = 'mr'
這在腳本中不會造成任何問題,然而,一個“聰明”的攻擊者可能會輸入“'OR Name LIKE'%”,從而得到下面的SQL 語句:
select * from user where username ="OR Name LIKE'%'
這種輸入會為攻擊者打開整個表,如果是非常敏感的數據,將被完全暴露在外。那麼採用什麼方法才能解決這個問題呢?
解決方案
要解決這個問題,可以使用PDO中的quote 方法轉義傳遞給SQL 字串的數據,只需要將SQL程式碼修改成:
$sql="select * from user where username = '".$pdo->quote($name)."'";
記住需要引用SQL 查詢中使用的每塊數據,這個沒有快捷途徑,除非考慮使用prepare()和execute()方法。
說明:
#如果正在使用PDO->query()方法,那麼總需要使用quote( )方法引用使用者的輸入,記住是「總需要」。
如果選擇使用prepare()和execute()方法,那麼不必引用那些需要綁定到預編譯SQL 的值(例如:將被插入導資料庫的值),驅動程式會為使用者做所有的事,然而,有時可能無法將一個變數綁定到預編譯SQL 語句,在這種情況下,如果正在建立一個動態SQL語句,那麼就需要引用所有用到的無法被綁定的值(如:GROUP BY 子句或ORDER BY或表名稱)。
那麼關於如何保護Web 網站免受 SQL注入攻擊的解決辦法到這裡就介紹完了,相信小夥伴們都可以輕鬆的掌握這節的知識點~
以上是如何保護Web 網站免受 SQL注入攻擊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!