2011-09-27 49 views
-1

如何修改此代碼以改善對sql注入和其他威脅的防護?它是一個MS SQL數據庫。如何改進針對SQL注入和其他威脅的PHP代碼

<?php include_once("db.php"); ?> 

<?php 
$id = $_REQUEST['id']; 
settype($id, 'string'); 

$tsql = "SELECT Table1.Fund FROM Table1 WHERE Table1.Fund='%s'"; 
$tsqlnew=sprintf($tsql, $id); 

$stmt = sqlsrv_query($conn, $tsqlnew); 
if($stmt === false) 
{ 
echo "Error in query preparation/execution.\n"; 
die(print_r(sqlsrv_errors(), true)); 
} 

$chd = ''; 

while($data = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
$chd .= '[\''.$data['Fund'] .'\'],'; 
} 
$chd = substr($chd,0,-1); 

?> 

我也想知道如果我的數據庫連接可以改善。謝謝你的幫助!

<?php 

$myServer = "server"; 
$myUser = "userPlaceHolder"; 
$myPass = "passwordPlaceHolder"; 
$myDB = "SQL"; 

$conn = sqlsrv_connect($myServer, array('UID'=>$myUser, 'PWD'=>$myPass, 'Database'=>$myDB)); 

if($conn === false) 
{ 
echo "Could not connect.\n"; 
die(print_r(sqlsrv_errors(), true)); 
} 
?> 
+0

假設您的$ _REQUEST ['id']來自輸入字段。使用mysql_real_escape_string函數來查看字符串中的特殊字符。 http://php.net/manual/en/function.mysql-real-escape-string.php – B4NZ41

+0

可能重複[什麼是淨化PHP用戶輸入的最佳方法?](http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php) –

+0

老實說?改變整個代碼!在我看來,閱讀http://php.net/PDO和http://php.net/Filter更好,即使你必須使用php 5,正如Marc B已經提出的那樣。你的代碼看起來像在90年代,我很確定幾個小時的閱讀關於PHP編碼實踐。 –

回答

6

您的代碼不會完全NOTHING防止注入攻擊。僅僅強迫變量具有字符串數據類型就像一張衛生紙可以防止海嘯一樣有效。

爲防止注入攻擊,您必須轉義您插入到查詢字符串中的所有數據,無論這是用戶提供的還是您自己創建/插入的內容。

最好的選擇是使用prepared statements,這可以免除您轉義數據的責任。

即使插入的數據不是「惡意的」,任何SQL元字符(特別是引號)仍然可以銷燬查詢並導致語法錯誤。

+0

如果衛生紙的整體質量比海嘯有更多的儲存能量,衛生紙實際上獲勝了;) – hakre

+0

@Hakre:我不想看到需要這麼大塊的後端...「這不是月亮......「 –

+0

謝謝,這個鏈接非常有幫助。我最初使用了這個[link](http://php.net/manual/en/security.database.sql-injection.php)中建議的settype()編碼,但它顯然不是一個好的解決方案,並且可以工作如果輸入是數字,那更好。 – tito