5

我可以尽可能多地清理和验证我的输入,但这绝对不能涵盖所有内容,如果我足够用力、足够彻底地擦洗,我将彻底清除我的输入。

我意识到有很多关于这个主题的帖子,但似乎他们总是回到 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仅适用于存储过程,这是一个明确的选择,但我不确定我是否想自愿扩展我的职责,通过制作插入/更新过程来包括在实际数据库中的维护。

4

2 回答 2

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?如果在数据库中,维护起来会容易很多,一般是存储过程的形式。

于 2013-04-24T21:31:06.457 回答
0

您还没有回答“如果不允许 PDO,您打算如何与 MS SQL 数据库通信”的问题,但我假设有 mssql_* 函数可以使用。

这些没有现成的转义功能,但似乎它们为您提供了使用准备好的语句 - 这将完成这项工作。

否则,您将拥有与安全相关的任务来自己创建转义函数。当您第一次看到它时,字符替换并不是很复杂,您可能很幸运只需要使用定义的编码来覆盖您的确切用例。所以这可能真的就像在 MSSQL 手册中查找字符串中的哪些字符不允许作为简单字符一样简单,以及如何转义它们。

请注意,您可能会错过边缘情况,如果可以避免,我宁愿使用准备好的语句功能。

更新:我误读了手册,mssql_execute() 只调用存储过程,而不是准备好的语句。你不能存储过程吗?将是一个简单的出路。但我想知道无论如何你应该如何与数据库交谈。

Update2:我在 php.net 的评论中找到了一个链接,用于 mssql_bind 指向关于转义的 SO 答案:如何使用 PHP 在 SQL Server 中转义字符串?

于 2013-04-24T23:28:50.020 回答