2013-04-24 46 views
4

我可以消毒和驗證我的輸入儘可能多,但絕對不包括一切,如果我足夠徹底擦洗足夠徹底,我會完全擦掉我的輸入。預防SQL注入與SQL Server和沒有PDO

我意識到有很多關於這個主題的帖子,但它似乎總是回到PDO或Mysql(是的 - 即使有人發佈關於SQL Server,一半他們收到的答案建議mysql_real_escape_string - 瘋狂世界)。我也不能使用。即使在我輸入時,屏幕右側出現一些「類似問題」,我仍然點擊各個鏈接,但沒有完全回答我的問題。

我正在使用SQL Server。我正在使用PHP 5.2.4。我不能使用PDO(因爲......?我的老闆說'不',這就足夠了)。

有沒有一種方法可以編寫一個安全的方式來準備我自己的查詢語句?

過去,我試圖在PHP中構建這樣的語句。 (其中$輸入_ *變量是某種形式的用戶輸入,或者我把他們出來的東西)

$query = " 
    declare @varID int 
    declare @var1 int 
    declare @var2 varchar(100) 

    set @varID = cast('$input_ID' as int) 
    set @var1 = cast('$input_var1' as int) 
    set @var2 = cast('$input_var2' as varchar(100)) 

    update table_name_goes_here 
     set var1 = @var1, 
      var2 = @var2 
     where ID = @varID; 
    "; 
# $query is then executed 

但可以是脆弱,太...明明....我做的最後一件事就是刪除所有必要的標點符號(有時我知道他們將沒有理由使用某些字符)

但是必須有其他選項...對吧?而mssql_bind只適用於存儲過程,這是一個明確的選擇,但我不確定是否願意通過插入/更新程序來自願擴展我的職責,將維護包括在實際數據庫中。

+2

只是一些建議,以便讓你可以在你的查詢之前清理數據:測試的時間長度數據(最小/最大),測試數據的值(最小/最大),使用正則表達式進行驗證,使用is_numeric()等。人。函數,使用ctype_ *函數,使用htmlentities()。編寫一個函數/方法,使用有意義的工具,並在將所有數據發送到數據庫之前通過它運行所有數據。找出某種方式來說服你的老闆參數化查詢是一件好事。 – 2013-04-24 21:32:59

+0

@BennyHill我想驗證是最好的唯一途徑。他知道PDO將是一件好事,但整體上升級PHP對我們來說比單個數據庫驅動程序更重要。我們通常不支持SQL Server。它最終會發生......現在不能這樣做......所以我需要最安全的替代方案,與我已有的方法一起工作。 – 2013-04-24 21:56:20

回答

0

您還沒有回答「如果不允許PDO與MS SQL數據庫交談」,但我假設有mssql_ *函數可以使用。

這些沒有現成的轉義函數,但似乎他們提供給你使用準備好的語句 - 哪些可以完成這項工作。

否則,你會有安全相關的任務來自己創建一個轉義函數。當你第一次看到它時,替換字符並不是很複雜,你可能很幸運只需要用確定的編碼來覆蓋你的確切用例。所以這可能就像在MSSQL手冊中查詢字符串中的字符不被允許爲簡單字符一樣容易,以及如何避免它們。

儘管您可能會錯過邊緣案例,但如果可以避免它,我寧願使用準備好的語句功能。

更新:我誤讀了手冊,mssql_execute()只調用存儲過程,沒有準備好語句。你不能存儲程序嗎?將是一個簡單的出路。但我想知道你應該如何與數據庫交談。

UPDATE2:我發現在php.net的mssql_bind回指向的評論一個鏈接,以便回答有關轉義:How to escape strings in SQL Server using PHP?

2

我會說「因爲老闆說'不''是一個可怕的原因。告訴他(她?)他錯了。我對PHP知之甚少,但不管語言如何,防止注入的唯一簡單方法是通過參數化查詢或存儲過程。如果在PHP中唯一的方法是使用PDO,那麼使用PDO。

這是你使用PDO推理:https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

http://msdn.microsoft.com/en-us/magazine/cc163917.aspx

爲什麼會出現在代碼中的任何SQL呢?如果數據庫位於數據庫中,通常以存儲過程的形式進行維護要容易得多。

+0

關於@Dave Johnson「我會這樣說」,因爲老闆說'不''是一個可怕的原因。「 - 我完全同意這個觀點,但有時候,當老闆放下腳步時,你必須找到另一種方式或找到另一份工作。 :) – Revent 2013-04-24 21:39:58

+0

@Revent - 是的,我已經處理了。除非老闆可以想出一個勝過安全問題的理由,否則我會選擇新的工作路線:) – 2013-04-24 21:46:10

+0

我已經使用了PDO,而且我喜歡它,它非常容易......但我無法使用它,也無法使用它就因爲這個而走出去。 **即使不完美,是否真的沒有人能爲我提供一個不涉及PDO(答案)或MYSQL(答案在下面的答案)的解決方案?** – 2013-04-24 21:50:12