首頁 > 資料庫 > mysql教程 > 如何保護Web 網站免受 SQL注入攻擊?

如何保護Web 網站免受 SQL注入攻擊?

黄舟
發布: 2017-05-20 17:21:03
原創
1472 人瀏覽過

如何保護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 =&#39;mr&#39;;
    $name ="&#39;or Name LIKE&#39;%";
    $query="select * from user where username = &#39;".$name."&#39;";//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[&#39;username&#39;];?></div></td>
</tr>
<?php
    }
}catch (Exception $e){
    echo "ERROR!!".$e->getMessage()."<br>";
}
?>
登入後複製

在這個實例中,假定SQL語句中的 $name 變數來自使用者提交的表單。通常使用者會提交像「mr」這種內容,這就會產生下面的SQL語句:

select * from user where username = &#39;mr&#39;
登入後複製
登入後複製

這在腳本中不會造成任何問題,然而,一個「聰明」的攻擊者可能會輸入“'OR Name LIKE'%”,從而得到下面的SQL 語句:

select * from user where username = &#39;mr&#39;
登入後複製
登入後複製

這在腳本中不會造成任何問題,然而,一個“聰明”的攻擊者可能會輸入“'OR Name LIKE'%”,從而得到下面的SQL 語句:

select * from user where username ="OR Name LIKE&#39;%&#39;
登入後複製

這種輸入會為攻擊者打開整個表,如果是非常敏感的數據,將被完全暴露在外。那麼採用什麼方法才能解決這個問題呢?

解決方案

要解決這個問題,可以使用PDO中的quote 方法轉義傳遞給SQL 字串的數據,只需要將SQL程式碼修改成:

$sql="select * from user where username = &#39;".$pdo->quote($name)."&#39;";
登入後複製

記住需要引用SQL 查詢中使用的每塊數據,這個沒有快捷途徑,除非考慮使用prepare()和execute()方法。

說明:

#如果正在使用PDO->query()方法,那麼總需要使用quote( )方法引用使用者的輸入,記住是「總需要」。

如果選擇使用prepare()和execute()方法,那麼不必引用那些需要綁定到預編譯SQL 的值(例如:將被插入導資料庫的值),驅動程式會為使用者做所有的事,然而,有時可能無法將一個變數綁定到預編譯SQL 語句,在這種情況下,如果正在建立一個動態SQL語句,那麼就需要引用所有用到的無法被綁定的值(如:GROUP BY 子句或ORDER BY或表名稱)。

那麼關於如何保護Web 網站免受 SQL注入攻擊的解決辦法到這裡就介紹完了,相信小夥伴們都可以輕鬆的掌握這節的知識點~

以上是如何保護Web 網站免受 SQL注入攻擊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板