我可以消毒和驗證我的輸入儘可能多,但絕對不包括一切,如果我足夠徹底擦洗足夠徹底,我會完全擦掉我的輸入。預防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
只適用於存儲過程,這是一個明確的選擇,但我不確定是否願意通過插入/更新程序來自願擴展我的職責,將維護包括在實際數據庫中。
只是一些建議,以便讓你可以在你的查詢之前清理數據:測試的時間長度數據(最小/最大),測試數據的值(最小/最大),使用正則表達式進行驗證,使用is_numeric()等。人。函數,使用ctype_ *函數,使用htmlentities()。編寫一個函數/方法,使用有意義的工具,並在將所有數據發送到數據庫之前通過它運行所有數據。找出某種方式來說服你的老闆參數化查詢是一件好事。 – 2013-04-24 21:32:59
@BennyHill我想驗證是最好的唯一途徑。他知道PDO將是一件好事,但整體上升級PHP對我們來說比單個數據庫驅動程序更重要。我們通常不支持SQL Server。它最終會發生......現在不能這樣做......所以我需要最安全的替代方案,與我已有的方法一起工作。 – 2013-04-24 21:56:20