天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

編寫安全 PHP應(yīng)用程序的七個習(xí)慣深入分析

在提及安全性問題時,需要注意,除了實際的平臺和操作系統(tǒng)安全性問題之外,您還需要確保編寫安全的應(yīng)用程序。在編寫 php 應(yīng)用程序時,請應(yīng)用下面的七個習(xí)慣以確保應(yīng)用程序具有最好的安全性:
•驗證輸入
•保護(hù)文件系統(tǒng)
•保護(hù)數(shù)據(jù)庫
•保護(hù)會話數(shù)據(jù)
•保護(hù)跨站點腳本(Cross-site scripting,XSS)漏洞
•檢驗表單 post
•針對跨站點請求偽造(Cross-Site Request Forgeries,CSRF)進(jìn)行保護(hù)

驗證輸入
在提及安全性問題時,驗證數(shù)據(jù)是您可能采用的最重要的習(xí)慣。而在提及輸入時,十分簡單:不要相信用戶。您的用戶可能十分優(yōu)秀,并且大多數(shù)用戶可能完全按照期望來使用應(yīng)用程序。但是,只要提供了輸入的機(jī)會,也就極有可能存在非常糟糕的輸入。作為一名應(yīng)用程序開發(fā)人員,您必須阻止應(yīng)用程序接受錯誤的輸入。仔細(xì)考慮用戶輸入的位置及正確值將使您可以構(gòu)建一個健壯、安全的應(yīng)用程序。
雖然后文將介紹文件系統(tǒng)與數(shù)據(jù)庫交互,但是下面列出了適用于各種驗證的一般驗證提示
•使用白名單中的值
•始終重新驗證有限的選項
•使用內(nèi)置轉(zhuǎn)義函數(shù)
•驗證正確的數(shù)據(jù)類型(如數(shù)字)
白名單中的值(White-listed value)是正確的值,與無效的黑名單值(Black-listed value)相對。兩者之間的區(qū)別是,通常在進(jìn)行驗證時,可能值的列表或范圍小于無效值的列表或范圍,其中許多值可能是未知值或意外值。
在進(jìn)行驗證時,記住設(shè)計并驗證應(yīng)用程序允許使用的值通常比防止所有未知值更容易。例如,要把字段值限定為所有數(shù)字,需要編寫一個確保輸入全都是數(shù)字的例程。不要編寫用于搜索非數(shù)字值并在找到非數(shù)字值時標(biāo)記為無效的例程。

保護(hù)文件系統(tǒng)
2000 年 7 月,一個 Web 站點泄露了保存在 Web 服務(wù)器的文件中的客戶數(shù)據(jù)。該 Web 站點的一個訪問者使用 URL 查看了包含數(shù)據(jù)的文件。雖然文件被放錯了位置,但是這個例子強(qiáng)調(diào)了針對攻擊者保護(hù)文件系統(tǒng)的重要性。
如果 php 應(yīng)用程序?qū)ξ募M(jìn)行了任意處理并且含有用戶可以輸入的變量數(shù)據(jù),請仔細(xì)檢查用戶輸入以確保用戶無法對文件系統(tǒng)執(zhí)行任何不恰當(dāng)?shù)牟僮鳌G鍐?1 顯示了下載具有指定名的圖像的 php 站點示例。
清單 1. 下載文件
復(fù)制代碼 代碼如下:
<?php
if ($_POST['submit'] == 'Download') {
    $file = $_POST['fileName'];
    header("Content-Type: application/x-octet-stream");
    header("Content-Transfer-Encoding: binary");
    header("Content-Disposition: attachment; filename=/"" . $file . "/";" );
    $fh = fopen($file, 'r');
    while (! feof($fh))
    {
        echo(fread($fh, 1024));
    }
    fclose($fh);
} else {
    echo("<html><head><");
        echo("title>Guard your filesystem</title></head>");
    echo("<body><form id=/"myFrom/" action=/"" . $_SERVER['php_SELF'] .
        "/" method=/"post/">");
    echo("<div><input type=/"text/" name=/"fileName/" value=/"");
    echo(isset($_REQUEST['fileName']) ? $_REQUEST['fileName'] : '');
    echo("/" />");
    echo("<input type=/"submit/" value=/"Download/" name=/"submit/" /></div>");
    echo("</form></body></html>");
}

正如您所見,清單 1 中比較危險的腳本將處理 Web 服務(wù)器擁有讀取權(quán)限的所有文件,包括會話目錄中的文件(請參閱 “保護(hù)會話數(shù)據(jù)”),甚至還包括一些系統(tǒng)文件(例如 /etc/passwd)。為了進(jìn)行演示,這個示例使用了一個可供用戶鍵入文件名的文本框,但是可以在查詢字符串中輕松地提供文件名。
同時配置用戶輸入和文件系統(tǒng)訪問權(quán)十分危險,因此最好把應(yīng)用程序設(shè)計為使用數(shù)據(jù)庫和隱藏生成的文件名來避免同時配置。但是,這樣做并不總是有效。清單 2 提供了驗證文件名的示例例程。它將使用正則表達(dá)式以確保文件名中僅使用有效字符,并且特別檢查圓點字符:..。
清單 2. 檢查有效的文件名字符
復(fù)制代碼 代碼如下:
function isValidFileName($file) {
    /* don't allow .. and allow any "word" character / / */
    return preg_match('/^(((?:/.)(?!/.))|/w)+$/', $file);
}

保護(hù)數(shù)據(jù)庫
2008 年 4 月,美國某個州的獄政局在查詢字符串中使用了 SQL 列名,因此泄露了保密數(shù)據(jù)。這次泄露允許惡意用戶選擇需要顯示的列、提交頁面并獲得數(shù)據(jù)。這次泄露顯示了用戶如何能夠以應(yīng)用程序開發(fā)人員無法預(yù)料的方法執(zhí)行輸入,并表明了防御 SQL 注入攻擊的必要性。
清單 3 顯示了運行 SQL 語句的示例腳本。在本例中,SQL 語句是允許相同攻擊的動態(tài)語句。此表單的所有者可能認(rèn)為表單是安全的,因為他們已經(jīng)把列名限定為選擇列表。但是,代碼疏忽了關(guān)于表單欺騙的最后一個習(xí)慣 ― 代碼將選項限定為下拉框并不意味著其他人不能夠發(fā)布含有所需內(nèi)容的表單(包括星號 [*])。
清單 3. 執(zhí)行 SQL 語句
復(fù)制代碼 代碼如下:
<html>
<head>
<title>SQL Injection Example</title>
</head>
<body>
<form id="myFrom" action="<?php echo $_SERVER['php_SELF']; ?>"
    method="post">
<div><input type="text" name="account_number"
    value="<?php echo(isset($_POST['account_number']) ?
        $_POST['account_number'] : ''); ?>" />
<select name="col">
<option value="account_number">Account Number</option>
<option value="name">Name</option>
<option value="address">Address</option>
</select>
<input type="submit" value="Save" name="submit" /></div>
</form>
<?php
if ($_POST['submit'] == 'Save') {
    /* do the form processing */
    $link = mysql_connect('hostname', 'user', 'password') or
        die ('Could not connect' . mysql_error());
    mysql_select_db('test', $link);

  $col = $_POST['col'];
    $select = "SELECT " . $col . " FROM account_data WHERE account_number = "
        . $_POST['account_number'] . ";" ;
    echo '<p>' . $select . '</p>';
    $result = mysql_query($select) or die('<p>' . mysql_error() . '</p>');
    echo '<table>';
    while ($row = mysql_fetch_assoc($result)) {
        echo '<tr>';
        echo '<td>' . $row[$col] . '</td>';
        echo '</tr>';
    }
    echo '</table>';
    mysql_close($link);
}
?>
</body>
</html>

因此,要形成保護(hù)數(shù)據(jù)庫的習(xí)慣,請盡可能避免使用動態(tài) SQL 代碼。如果無法避免動態(tài) SQL 代碼,請不要對列直接使用輸入。清單 4 顯示了除使用靜態(tài)列外,還可以向帳戶編號字段添加簡單驗證例程以確保輸入值不是非數(shù)字值。
清單 4. 通過驗證和 mysql_real_escape_string() 提供保護(hù)
復(fù)制代碼 代碼如下:
<html>
<head>
<title>SQL Injection Example</title>
</head>
<body>
<form id="myFrom" action="<?php echo $_SERVER['php_SELF']; ?>"
    method="post">
<div><input type="text" name="account_number"
    value="<?php echo(isset($_POST['account_number']) ?
        $_POST['account_number'] : ''); ?>" /> <input type="submit"
    value="Save" name="submit" /></div>
</form>
<?php
function isValidAccountNumber($number)
{
    return is_numeric($number);
}
if ($_POST['submit'] == 'Save') {
    /* Remember habit #1--validate your data! */
    if (isset($_POST['account_number']) &&
    isValidAccountNumber($_POST['account_number'])) {
        /* do the form processing */
        $link = mysql_connect('hostname', 'user', 'password') or
        die ('Could not connect' . mysql_error());
        mysql_select_db('test', $link);
        $select = sprintf("SELECT account_number, name, address " .
  " FROM account_data WHERE account_number = %s;",
        mysql_real_escape_string($_POST['account_number']));
        echo '<p>' . $select . '</p>';
        $result = mysql_query($select) or die('<p>' . mysql_error() . '</p>');
        echo '<table>';
        while ($row = mysql_fetch_assoc($result)) {
            echo '<tr>';
            echo '<td>' . $row['account_number'] . '</td>';
            echo '<td>' . $row['name'] . '</td>';
            echo '<td>' . $row['address'] . '</td>';
            echo '</tr>';
        }
        echo '</table>';
        mysql_close($link);
    } else {
        echo "<span style=/"font-color:red/">" .
    "Please supply a valid account number!</span>";
    }
}
?>
</body>
</html>

本例還展示了 mysql_real_escape_string() 函數(shù)的用法。此函數(shù)將正確地過濾您的輸入,因此它不包括無效字符。如果您一直依賴于 magic_quotes_gpc,那么需要注意它已被棄用并且將在 php V6 中刪除。從現(xiàn)在開始應(yīng)避免使用它并在此情況下編寫安全的 php 應(yīng)用程序。此外,如果使用的是 ISP,則有可能您的 ISP 沒有啟用 magic_quotes_gpc。
最后,在改進(jìn)的示例中,您可以看到該 SQL 語句和輸出沒有包括動態(tài)列選項。使用這種方法,如果把列添加到稍后含有不同信息的表中,則可以輸出這些列。如果要使用框架以與數(shù)據(jù)庫結(jié)合使用,則您的框架可能已經(jīng)為您執(zhí)行了 SQL 驗證。確保查閱文檔以保證框架的安全性;如果仍然不確定,請進(jìn)行驗證以確保穩(wěn)妥。即使使用框架進(jìn)行數(shù)據(jù)庫交互,仍然需要執(zhí)行其他驗證。

保護(hù)會話
默認(rèn)情況下,php 中的會話信息將被寫入臨時目錄。考慮清單 5 中的表單,該表單將顯示如何存儲會話中的用戶 ID 和帳戶編號。
清單 5. 存儲會話中的數(shù)據(jù)
復(fù)制代碼 代碼如下:
<?php
session_start();
?>
<html>
<head>
<title>Storing session information</title>
</head>
<body>
<?php
if ($_POST['submit'] == 'Save') {
    $_SESSION['userName'] = $_POST['userName'];
    $_SESSION['accountNumber'] = $_POST['accountNumber'];
}
?>
<form id="myFrom" action="<?php echo $_SERVER['php_SELF']; ?>"
    method="post">
<div><input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="text" name="userName"
    value="<?php echo(isset($_POST['userName']) ? $_POST['userName'] : ''); ?>" />
<br />
<input type="text" name="accountNumber"
    value="<?php echo(isset($_POST['accountNumber']) ?
    $_POST['accountNumber'] : ''); ?>" />
<br />
<input type="submit" value="Save" name="submit" /></div>
</form>
</body>
</html>

清單 6 顯示了 /tmp 目錄的內(nèi)容。
清單 6. /tmp 目錄中的會話文件
復(fù)制代碼 代碼如下:
-rw-------  1 _www    wheel       97 Aug 18 20:00 sess_9e4233f2cd7cae35866cd8b61d9fa42b

正如您所見,在輸出時(參見清單 7),會話文件以非常易讀的格式包含信息。由于該文件必須可由 Web 服務(wù)器用戶讀寫,因此會話文件可能為共享服務(wù)器中的所有用戶帶來嚴(yán)重的問題。除您之外的某個人可以編寫腳本來讀取這些文件,因此可以嘗試從會話中取出值。
清單 7. 會話文件的內(nèi)容
復(fù)制代碼 代碼如下:
userName|s:5:"ngood";accountNumber|s:9:"123456789";

存儲密碼
不管是在數(shù)據(jù)庫、會話、文件系統(tǒng)中,還是在任何其他表單中,無論如何密碼都決不能存儲為純文本。處理密碼的最佳方法是將其加密存儲并相互比較加密的密碼。雖然如此,在實踐中人們?nèi)匀话衙艽a存儲到純文本中。只要使用可以發(fā)送密碼而非重置密碼的 Web 站點,就意味著密碼是存儲在純文本中或者可以獲得用于解密的代碼(如果加密的話)。即使是后者,也可以找到并使用解密代碼。
您可以采取兩項操作來保護(hù)會話數(shù)據(jù)。第一是把您放入會話中的所有內(nèi)容加密。但是正因為加密數(shù)據(jù)并不意味著絕對安全,因此請慎重采用這種方法作為保護(hù)會話的惟一方式。備選方法是把會話數(shù)據(jù)存儲在其他位置中,比方說數(shù)據(jù)庫。您仍然必須確保鎖定數(shù)據(jù)庫,但是這種方法將解決兩個問題:第一,它將把數(shù)據(jù)放到比共享文件系統(tǒng)更加安全的位置;第二,它將使您的應(yīng)用程序可以更輕松地跨越多個 Web 服務(wù)器,同時共享會話可以跨越多個主機(jī)。

要實現(xiàn)自己的會話持久性,請參閱 php 中的session_set_save_handler() 函數(shù)。使用它,您可以將會話信息存儲在數(shù)據(jù)庫中,也可以實現(xiàn)一個用于加密和解密所有數(shù)據(jù)的處理程序。清單 8 提供了實現(xiàn)的函數(shù)用法和函數(shù)骨架示例。您還可以在 參考資料 小節(jié)中查看如何使用數(shù)據(jù)庫。
清單 8. session_set_save_handler() 函數(shù)示例
復(fù)制代碼 代碼如下:
function open($save_path, $session_name)
{
    /* custom code */
    return (true);
}
function close()
{
    /* custom code */
    return (true);
}
function read($id)
{
    /* custom code */
    return (true);
}
function write($id, $sess_data)
{
    /* custom code */
    return (true);
}
function destroy($id)
{
    /* custom code */
    return (true);
}
function gc($maxlifetime)
{
    /* custom code */
    return (true);
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

針對 XSS 漏洞進(jìn)行保護(hù)
XSS 漏洞代表 2007 年所有歸檔的 Web 站點的大部分漏洞(請參閱 參考資料)。當(dāng)用戶能夠把 HTML 代碼注入到您的 Web 頁面中時,就是出現(xiàn)了 XSS 漏洞。HTML 代碼可以在腳本標(biāo)記中攜帶 JavaScript 代碼,因而只要提取頁面就允許運行 JavaScript。清單 9 中的表單可以表示論壇、維基、社會網(wǎng)絡(luò)或任何可以輸入文本的其他站點。
清單 9. 輸入文本的表單
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Your chance to input XSS</title>
</head>
<body>
<form id="myFrom" action="showResults.php" method="post">
<div><textarea name="myText" rows="4" cols="30"></textarea><br />
<input type="submit" value="Delete" name="submit" /></div>
</form>
</body>
</html>

清單 10 演示了允許 XSS 攻擊的表單如何輸出結(jié)果。
清單 10. showResults.php
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Results demonstrating XSS</title>
</head>
<body>
<?php
echo("<p>You typed this:</p>");
echo("<p>");
echo($_POST['myText']);
echo("</p>");
?>
</body>
</html>

清單 11 提供了一個基本示例,在該示例中將彈出一個新窗口并打開 Google 的主頁。如果您的 Web 應(yīng)用程序不針對 XSS 攻擊進(jìn)行保護(hù),則會造成嚴(yán)重的破壞。例如,某個人可以添加模仿站點樣式的鏈接以達(dá)到欺騙(phishing)目的(請參閱 參考資料)。
清單 11. 惡意輸入文本樣例
復(fù)制代碼 代碼如下:
<script type="text/Javascript">myRef = window.open('http://www.google.com','mywin',
'left=20,top=20,width=500,height=500,toolbar=1,resizable=0');</script>

要防止受到 XSS 攻擊,只要變量的值將被打印到輸出中,就需要通過 htmlentities() 函數(shù)過濾輸入。記住要遵循第一個習(xí)慣:在 Web 應(yīng)用程序的名稱、電子郵件地址、電話號碼和帳單信息的輸入中用白名單中的值驗證輸入數(shù)據(jù)。
下面顯示了更安全的顯示文本輸入的頁面。
清單 12. 更安全的表單
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Results demonstrating XSS</title>
</head>
<body>
<?php
echo("<p>You typed this:</p>");
echo("<p>");
echo(htmlentities($_POST['myText']));
echo("</p>");
?>
</body>
</html>

針對無效 post 進(jìn)行保護(hù)
表單欺騙 是指有人把 post 從某個不恰當(dāng)?shù)奈恢冒l(fā)到您的表單中。欺騙表單的最簡單方法就是創(chuàng)建一個通過提交至表單來傳遞所有值的 Web 頁面。由于 Web 應(yīng)用程序是沒有狀態(tài)的,因此沒有一種絕對可行的方法可以確保所發(fā)布數(shù)據(jù)來自指定位置。從 IP 地址到主機(jī)名,所有內(nèi)容都是可以欺騙的。清單 13 顯示了允許輸入信息的典型表單。
清單 13. 處理文本的表單
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Form spoofing example</title>
</head>
<body>
<?php
if ($_POST['submit'] == 'Save') {
    echo("<p>I am processing your text: ");
    echo($_POST['myText']);
    echo("</p>");
}
?>
</body>
</html>

清單 14 顯示了將發(fā)布到清單 13 所示表單中的表單。要嘗試此操作,您可以把該表單放到 Web 站點中,然后把清單 14 中的代碼另存為桌面上的 HTML 文檔。在保存表單后,在瀏覽器中打開該表單。然后可以填寫數(shù)據(jù)并提交表單,從而觀察如何處理數(shù)據(jù)。
清單 14. 收集數(shù)據(jù)的表單
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Collecting your data</title>
</head>
<body>
<form action="processStuff.php" method="post">
<select name="answer">
<option value="Yes">Yes</option>
<option value="No">No</option>
</select>
<input type="submit" value="Save" name="submit" />
</form>
</body>
</html>

表單欺騙的潛在影響是,如果擁有含下拉框、單選按鈕、復(fù)選框或其他限制輸入的表單,則當(dāng)表單被欺騙時這些限制沒有任何意義。考慮清單 15 中的代碼,其中包含帶有無效數(shù)據(jù)的表單。
清單 15. 帶有無效數(shù)據(jù)的表單
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Collecting your data</title>
</head>
<body>
<form action="http://path.example.com/processStuff.php"
    method="post"><input type="text" name="answer"
    value="There is no way this is a valid response to a yes/no answer..." />
<input type="submit" value="Save" name="submit" />
</form>
</body>
</html>

思考一下:如果擁有限制用戶輸入量的下拉框或單選按鈕,您可能會認(rèn)為不用擔(dān)心驗證輸入的問題。畢竟,輸入表單將確保用戶只能輸入某些數(shù)據(jù),對吧?要限制表單欺騙,需要進(jìn)行驗證以確保發(fā)布者的身份是真實的。您可以使用一種一次性使用標(biāo)記,雖然這種技術(shù)仍然不能確保表單絕對安全,但是會使表單欺騙更加困難。由于在每次調(diào)用表單時都會更改標(biāo)記,因此想要成為攻擊者就必須獲得發(fā)送表單的實例,去掉標(biāo)記,并把它放到假表單中。使用這項技術(shù)可以阻止惡意用戶構(gòu)建持久的 Web 表單來向應(yīng)用程序發(fā)布不適當(dāng)?shù)恼埱蟆G鍐?16 提供了一種表單標(biāo)記示例。
清單 16. 使用一次性表單標(biāo)記
復(fù)制代碼 代碼如下:
<?php
session_start();
?>
<html>
<head>
<title>SQL Injection Test</title>
</head>
<body>
<?php
echo 'Session token=' . $_SESSION['token'];
echo '<br />';
echo 'Token from form=' . $_POST['token'];
echo '<br />';
if ($_SESSION['token'] == $_POST['token']) {
    /* cool, it's all good... create another one */
} else {
    echo '<h1>Go away!</h1>';
}
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
?>
<form id="myFrom" action="<?php echo $_SERVER['php_SELF']; ?>"
    method="post">
<div><input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="text" name="myText"
    value="<?php echo(isset($_POST['myText']) ? $_POST['myText'] : ''); ?>" />
<input type="submit" value="Save" name="submit" /></div>
</form>
</body>
</html>

針對 CSRF 進(jìn)行保護(hù)
跨站點請求偽造(CSRF 攻擊)是利用用戶權(quán)限執(zhí)行攻擊的結(jié)果。在 CSRF 攻擊中,您的用戶可以輕易地成為預(yù)料不到的幫兇。清單 17 提供了執(zhí)行特定操作的頁面示例。此頁面將從 cookie 中查找用戶登錄信息。只要 cookie 有效,Web 頁面就會處理請求。
清單 17. CSRF 示例
復(fù)制代碼 代碼如下:
<img src="http://www.example.com/processSomething?id=123456789" />

CSRF 攻擊通常是以 <img> 標(biāo)記的形式出現(xiàn)的,因為瀏覽器將在不知情的情況下調(diào)用該 URL 以獲得圖像。但是,圖像來源可以是根據(jù)傳入?yún)?shù)進(jìn)行處理的同一個站點中的頁面 URL。當(dāng)此 <img> 標(biāo)記與 XSS 攻擊結(jié)合在一起時 ― 在已歸檔的攻擊中最常見 ― 用戶可以在不知情的情況下輕松地對其憑證執(zhí)行一些操作 ― 因此是偽造的。
為了保護(hù)您免受 CSRF 攻擊,需要使用在檢驗表單 post 時使用的一次性標(biāo)記方法。此外,使用顯式的 $_POST 變量而非 $_REQUEST。清單 18 演示了處理相同 Web 頁面的糟糕示例 ― 無論是通過 GET 請求調(diào)用頁面還是通過把表單發(fā)布到頁面中。
清單 18. 從 $_REQUEST 中獲得數(shù)據(jù)
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Processes both posts AND gets</title>
</head>
<body>
<?php
if ($_REQUEST['submit'] == 'Save') {
    echo("<p>I am processing your text: ");
    echo(htmlentities($_REQUEST['text']));
    echo("</p>");
}
?>
</body>
</html>

清單 19 顯示了只使用表單 POST 的干凈頁面。
清單 19. 僅從 $_POST 中獲得數(shù)據(jù)
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Processes both posts AND gets</title>
</head>
<body>
<?php
if ($_POST['submit'] == 'Save') {
    echo("<p>I am processing your text: ");
    echo(htmlentities($_POST['text']));
    echo("</p>");
}
?>
</body>
</html>

結(jié)束語
從這七個習(xí)慣開始嘗試編寫更安全的 php Web 應(yīng)用程序,可以幫助您避免成為惡意攻擊的受害者。和許多其他習(xí)慣一樣,這些習(xí)慣最開始可能很難適應(yīng),但是隨著時間的推移遵循這些習(xí)慣會變得越來越自然。
記住第一個習(xí)慣是關(guān)鍵:驗證輸入。在確保輸入不包括無效值之后,可以繼續(xù)保護(hù)文件系統(tǒng)、數(shù)據(jù)庫和會話。最后,確保 php 代碼可以抵抗 XSS 攻擊、表單欺騙和 CSRF 攻擊。形成這些習(xí)慣后可以幫助您抵御一些簡單的攻擊。

php技術(shù)編寫安全 PHP應(yīng)用程序的七個習(xí)慣深入分析,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 一个人日本的视频免费完整版 | xxx性欧美在线观看 xxx性欧美在线 | 色偷偷在线视频 | 免费看欧美xxx片 | 日本边添边摸边做边爱边 | 免费完整版观看 | 中文字幕在线观看亚洲 | 快播看黄片| 欧美国产成人在线 | 色欲AV色欲AV久久麻豆 | 无遮掩H黄纯肉动漫在线观看星 | 久久精品中文闷骚内射 | 欧美性xxx免费看片 欧美性xxx极品 | 51国产午夜精品免费视频 | 国产人妻人伦精品无码.麻豆 | 在教室伦流澡到高潮H女攻视频 | 久久国产高清字幕中文 | 欧美一级情欲片在线 | 久久国产乱子伦精品免费不卡 | 神马电影院午夜神福利在线观看 | 日本一区精品久久久久影院 | 免费看成人毛片 | 草草久久久亚洲AV成人片 | 99精品日韩 | 2017欧美狠狠色 | 簧片高清在线观看 | 国产在线精品一区二区在线看 | 一天不停的插BB十几次 | 伊人久久五月丁婷婷 | 无码任你躁久久久久久久 | 国产精品野外AV久久久 | 99国产亚洲精品无码成人 | 亚洲性无码av在线 | 国产在线一卡二卡 | 国产性夜夜性夜夜爽91 | 爽死你个放荡粗暴小淫货漫画 | 被免费网站在线视频 | 狠狠色狠狠色综合日日2019 | 邪恶肉肉全彩色无遮琉璃神社 | 国产精品一区二区在线观看 | 日本精品久久无码影院 |