一千萬個為什麽

搜索

這是否足以在使用SQL Server時阻止查詢註入?

我最近開始了一個需要與PHP/SQL Server集成的項目。我正在尋找最快和最簡單的功能來防止SQL註入SQL Server,因為我更喜歡MySQL,並且不期待更多的SQL Server相關項目。

這個功能足夠嗎?

$someVal = mssql_escape($_POST['someVal']);

$query = "INSERT INTO tblName SET field = $someVal";

mssql_execute($query);

function mssql_escape($str) {
    return str_replace("'", "''", $str);
}

如果沒有,我應該采取哪些額外步驟?


EDIT: I am running on a Linux server - sqlsrv_query() only works if your hosting environment is windows

最佳答案

最佳選擇:不要使用連接在一起的SQL語句 - 使用參數化查詢。

例如。 創建類似的內容

string stmt = "INSERT INTO dbo.MyTable(field1,field2) VALUES(" + value1 + ", " + value2 + ")"

或類似的東西,然後嘗試通過替換單引號或其他東西來“消毒”它 - 你永遠不會抓住所有東西,總會找到繞過你的“安全防護”的方法。

相反,使用:

string stmt = "INSERT INTO dbo.MyTable(field1,field2) VALUES(@value1, @value2)";

然後在執行此INSERT語句之前設置參數值。這是避免SQL註入的唯一可靠方法 - 使用它!

更新:如何使用PHP的參數化查詢 - 我在這裏找到了什麽 - 這有幫助嗎?

$tsql = "INSERT INTO DateTimeTable (myDate, myTime,
                                    myDateTimeOffset, myDatetime2)
         VALUES (?, ?, ?, ?)";

$params = array(
            date("Y-m-d"),//Current date in Y-m-d format.
            "15:30:41.987",//Time as a string.
            date("c"),//Current date in ISO 8601 format.
            date("Y-m-d H:i:s.u")//Current date and time.
          );

$stmt = sqlsrv_query($conn, $tsql, $params);

所以看起來你不能使用像'value1,@ value2這樣的“命名”參數,而只是使用問號?對於每個參數,您基本上只需創建一個參數數組,然後將其傳遞給查詢。

本文使用PHP訪問SQL Server數據庫也可能有所幫助 - 它有一個類似的如何使用參數化查詢插入數據的示例。

UPDATE: after you've revealed that you're on Linux, this approach doesn't work anymore. Instead, you need to use an alternate library in PHP to call a database - something like PDO.

PDO既可以在任何* nix類型的操作系統上運行,也可以在各種數據庫(包括SQL Server)上運行,並且它也支持參數化查詢:

$db = new PDO('your-connection-string-here');
$stmt = $db->prepare("SELECT priv FROM testUsers WHERE username=:username AND password=:password");
$stmt->bindParam(':username', $user);
$stmt->bindParam(':password', $pass);
$stmt->execute();

轉載註明原文: 這是否足以在使用SQL Server時阻止查詢註入?