我可以尽可能多地清理和验证我的输入,但这绝对不能涵盖所有内容,如果我足够用力、足够彻底地擦洗,我将彻底清除我的输入。
我意识到有很多关于这个主题的帖子,但似乎他们总是回到 PDO 或 Mysql(是的 - 即使有人发布关于 SQL Server 的帖子,他们收到的答案中有一半建议 mysql_real_escape_string - 疯狂的世界)。 我也不能用。即使在我打字并且屏幕右侧出现“类似问题”的小问题时,我仍不断点击各种链接,但没有任何内容能完全回答我的问题。
我正在使用 SQL Server。我正在使用 PHP 5.2.4。我不能使用 PDO(因为......?我的老板说“不”,这就是足够的理由)。
有没有办法我可以编写一种安全的方法来准备我自己的查询语句?
过去,我曾尝试在 PHP 中构建这样的语句。(其中 $input_* 变量是某种形式的用户输入,或者我将它们从某些东西中拉出来)
$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
仅适用于存储过程,这是一个明确的选择,但我不确定我是否想自愿扩展我的职责,通过制作插入/更新过程来包括在实际数据库中的维护。