我可以尽可能地清理和验证我的输入,但这绝对不能涵盖所有内容,如果我足够努力、足够彻底地擦洗,我将完全擦除我的输入。
我意识到有很多关于这个主题的帖子,但似乎他们总是回到 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
仅适用于存储过程,这是一个明确的选择,但我不确定我是否想自愿扩大我的职责,通过制作插入/更新过程来包括实际数据库中的维护。
我想说“因为老板说‘不’”是一个可怕的理由。告诉他(她?)他错了。我对 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 呢?如果是在数据库中,维护起来就容易多了,一般是存储过程的形式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)