首頁 >後端開發 >php教程 >常見的PHP安全性攻擊及解決辦法

常見的PHP安全性攻擊及解決辦法

小云云
小云云原創
2018-03-13 11:42:472656瀏覽

本文主要和大家分享常見的PHP安全性攻擊及解決方法,了解常見的PHP應用程式安全威脅,可以確保你的PHP應用程式不受攻擊。因此,本文將列出 6個常見的 PHP 安全性攻擊,歡迎大家來閱讀和學習。

1、SQL注入

SQL注入是一種惡意攻擊,使用者利用在表單欄位輸入SQL語句的方式來影響正常的SQL執行。還有一種是透過system()或exec()指令注入的,它有相同的SQL注入機制,但只針對shell指令。

01    $username = $_POST[&#39;username&#39;];02    $query = "select * from auth where username = &#39;".$username."&#39;";03    echo $query;04    $db = new mysqli(&#39;localhost&#39;, &#39;demo&#39;, ‘demo&#39;, ‘demodemo&#39;);05    $result = $db->query($query);06    if ($result && $result->num_rows) {07        echo "<br />Logged in successfully";08    } else {09        echo "<br />Login failed";10    }

上面的程式碼,在第一行沒有過濾或轉義使用者輸入的值($_POST['username'])。因此查詢可能會失敗,甚至會損壞資料庫,這要看$username是否包含變換你的SQL語句到別的東西上。

防止SQL注入

選項:

使用mysql_real_escape_string()过滤数据
手动检查每一数据是否为正确的数据类型
使用预处理语句并绑定变量

使用準備好的預處理語句

分离数据和SQL逻辑
预处理语句将自动过滤(如:转义)
把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题
01    $query = 'select name, district from city where countrycode=?';02    if ($stmt = $db->prepare($query) )03    {04        $countrycode = 'hk';05        $stmt->bind_param("s", $countrycode); 
06        $stmt->execute();07        $stmt->bind_result($name, $district);08        while ( $stmt ($stmt->fetch() ){09            echo $name.', '.$district;10            echo 'ff9d32c555bb1d9133a29eb4371c1213';11        }12        $stmt->close();13    }

2、XSS攻擊

XSS(跨站點腳本攻擊)是一種攻擊,由使用者輸入一些資料到你的網站,其中包括客戶端腳本(通常JavaScript)。如果你沒有過濾就輸出資料到另一個web頁面,這個腳本將會被執行。

接收使用者提交的文字內容

01    <?php02    if (file_exists(&#39;comments&#39;)) {03        $comments = get_saved_contents_from_file(&#39;comments&#39;);04    } else {05        $comments = &#39;&#39;;06    }07     08    if (isset($_POST[&#39;comment&#39;])) {09        $comments .= &#39;<br />&#39; . $_POST[&#39;comment&#39;];10        save_contents_to_file(&#39;comments&#39;, $comments);11    }12    >
输出内容给(另一个)用户1    <form action=&#39;xss.php&#39; method=&#39;POST&#39;>2    Enter your comments here: <br />3    <textarea name=&#39;comment&#39;></textarea> <br />4    <input type=&#39;submit&#39; value=&#39;Post comment&#39; />5    </form><hr /><br />6     7    <?php echo $comments; ?>

將會發生什麼事?

烦人的弹窗
刷新或重定向
损坏网页或表单
窃取cookie
AJAX(XMLHttpRequest)

防止XSS攻擊:為了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。 htmlentities()的基本用法很簡單,但也有許多進階的控制,請參考 XSS速查表。

3、會話固定

會話安全,假設一個PHPSESSID很難猜。然而,PHP可以接受一個會話ID通過一個Cookie或URL。因此,欺騙一個受害者可以使用一個特定的(或其他的)會話ID 或釣魚攻擊。

4、會議捕獲和劫持

這是與會話固定有著相同的想法,然而,它涉及竊取會話ID。如果會話ID儲存在Cookie中,攻擊者可以透過XSS和JavaScript竊取。如果會話ID包含在URL上,也可以透過嗅聞或從代理伺服器取得。

防止會話捕獲和劫持

更新ID
如果使用会话,请确保用户使用SSL

5、跨站點請求偽造(CSRF)

CSRF攻擊,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但不是故意的。它有許多的變體,例如下面的例子:

1    ![](http://example.com/single_click_to_buy.php?user_id=123&item=12345)

防止跨網站請求偽造

#一般來說,確保用戶來自你的表單,並且匹配每一個你發送的表單。有兩點一定要記住:

对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。
生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。

6、程式碼注入

程式碼注入是利用電腦漏洞透過處理無效資料造成的。問題出在,當你不小心執行任意程式碼,通常透過檔案包含。寫得很糟糕的程式碼可以允許一個遠端檔案包含並執行。如許多PHP函數,如require可以包含URL或檔名,例如:

01    <form>Choose theme:02        <select name = theme>03            <option value = blue>Blue</option>04            <option value = green>Green</option>05            <option value = red>Red</option>06        </select>07        <input type = submit>08    </form>09    <?php10        if($theme) {11            require($theme.&#39;.txt&#39;);12        }13    ?>

在上面的例子中,透過傳遞使用者輸入的一個檔名或檔名的一部分,來包含以"http:/ /"開頭的檔案。

防止程式碼注入

过滤用户输入
在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件。

其他的一般原則

  1. #不要依賴伺服器設定來保護你的應用,特別是當你的網頁伺服器/ PHP是由你的ISP管理,或當你的網站可能遷移/部署到別處,未來再從別處遷移/部署在到其他地方。請在網站程式碼中嵌入具有安全意識的檢查/邏輯 (HTML、JavaScript、PHP,等等)。

  2. 設計伺服器端的安全腳本:
    —例如,使用單行執行- 單點身份驗證和資料清理
    —例如,在所有的安全敏感頁面嵌入一個PHP函數/文件,用來處理所有登入/安全性邏輯檢查

  3. 確保你的程式碼更新,並打上最新補丁。

相關推薦:

php安全實例詳解

PHP安全地上傳圖片

php安全配置記錄和常見錯誤的詳細總結介紹

#

以上是常見的PHP安全性攻擊及解決辦法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn