【发布时间】:2013-04-24 20:55:53
【问题描述】:
我可以尽可能多地清理和验证我的输入,但这绝对不能涵盖所有内容,如果我足够用力、足够彻底地擦洗,我将彻底清除我的输入。
我意识到有很多关于这个主题的帖子,但似乎他们总是回到 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 仅适用于存储过程,这是一个明确的选择,但我不确定我是否愿意自愿扩大我的职责,通过制作插入/更新过程将维护包括在实际数据库中。
【问题讨论】:
-
只是在将数据放入查询之前清理数据的一些建议:测试数据的长度(最小/最大),测试数据的值(最小/最大),使用正则表达式验证,使用 is_numeric() 等。人。函数,使用 ctype_* 函数,使用 htmlentities()。编写一个函数/方法,使用有意义的工具并通过它运行所有数据,然后再将其发送到数据库。想办法让你的老板相信参数化查询是件好事。
-
@BennyHill 我猜验证是最好的也是唯一的途径。他知道 PDO 将是一件好事,但现在升级整个 PHP 对我们来说比单个 DB 驱动程序更重要。 SQL Server 也不是我们通常支持的东西。它最终会发生......只是现在做不到......所以我需要最安全的替代方案,可以与我已有的东西一起使用。
标签: php sql-server sql-injection