2016-08-13 27 views
0

我目前正在爲我的應用程序設置php腳本,並且我對於如何獲得安全級別以防止注入sql服務器提供了一點幫助。用戶輸入php的sql保護

有幾個腳本從應用程序接收輸入,而不是直接從用戶接收輸入,例如內容瀏覽和內容分級,但最終它是輸入。

,做接收用戶直接輸入爲「name」和「creator name」的劇本是這樣的:

$utc_str = gmdate("M d Y H:i:s", time()); 
$TIMESTAMP = strtotime($utc_str); 
$DATA = $_POST['DATA']; 
$NAME = $_POST['NAME']; 
$CREATOR = $_POST['CREATOR']; 

if(strlen($NAME) > 15 || strlen($CREATOR) > 15) exit("Error 2"); 

$stmt = $connect->prepare("INSERT INTO `ugcl` (`DATA`,`NAME`,`CREATOR`,`CREATEDSTAMP`) 
          VALUES (?, ?, ?, ". $TIMESTAMP .")"); 
$stmt->bind_param("sss", $DATA, $NAME, $CREATOR); 

if($stmt->execute()) 
{ 
    echo "Successs"; 
} 
else 
{ 
    echo "Error"; 
} 

我應該使用在所有接收輸入的腳本綁定PARAMS? 還有其他建議嗎?

+0

如果(preg_match(「/^[a-zA-Z0-9] + $ /」,$ str)== 1),您可以這樣做以增加安全性// string只包含a到z, A到Z,0到9 } –

+0

@IlayaRajaS這只是限制數據庫可以採取的數據。應該使用參數化查詢,這是不必要的。 – chris85

+0

綁定到您的SQL查詢的所有值。輸出值時還要考慮XSS注入。 'bind_param'是一個mysqli函數,你是否在'sql server'中使用'mysqli'? – chris85

回答

1

是的,你應該使用準備好陳述在php每當進行輸入或輸出。

始終綁定參數,以便服務器始終知道要使用的數據類型。這將確保您的應用程序具有更高的安全性。您輸入的所有內容應在原始語句中用作?,並將變量與適當的數據類型綁定。

你直接輸入$TIMESTAMP,我不會親自推薦。通過bind_param運行,不會花費太多精力。

此外,一旦查詢語句完成,請始終關閉與$stmt->close()$conn->close()的連接。如果您在頁面中有多個查詢,請在查詢開始時啓動連接,並在所有查詢完成後結束連接。

此外,關於安全性的另一個說明 - 首先驗證用戶輸入並進行消毒。不要信任用戶數據。永遠不要讓他們在第一時間有效。

編輯:另請考慮使用PDO進行數據庫交互。