防止在没有PDO的情况下使用PHP为SQL Server注入SQL

防止在没有PDO的情况下使用PHP为SQL Server注入SQL,php,sql-server,sql-injection,Php,Sql Server,Sql Injection,我可以尽可能多地清理和验证我的输入,但这肯定不能涵盖所有内容,如果我足够用力、足够彻底地擦拭,我将完全擦除我的输入 我意识到有很多关于这个话题的帖子,但他们似乎总是回到PDO或Mysql(是的,即使有人发布了关于SQL Server的帖子,他们收到的一半答案都是Mysql\u real\u escape\u string-疯狂世界)。我无法使用这两个帖子。即使在我打字的时候,屏幕右侧也会出现一些“类似的问题”,我一直在点击各种链接,但没有什么能完全回答我的问题 我正在使用SQL Server。我

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

我意识到有很多关于这个话题的帖子,但他们似乎总是回到PDO或Mysql(是的,即使有人发布了关于SQL Server的帖子,他们收到的一半答案都是Mysql\u real\u escape\u string-疯狂世界)。我无法使用这两个帖子。即使在我打字的时候,屏幕右侧也会出现一些“类似的问题”,我一直在点击各种链接,但没有什么能完全回答我的问题

我正在使用SQL Server。我使用的是PHP5.2.4。我不能使用PDO(因为…?我的老板说“不”,这就足够了)

有没有一种方法可以安全地编写自己的查询语句

在过去,我曾尝试在PHP中构建这样的语句。(其中,$input_*变量是某种形式的用户输入,或者我从某些东西中提取了它们)

但这也可能很脆弱。。。明显地我做的最后一件事是删除所有必要的标点符号(有时我知道他们没有理由使用某些字符)

但必须有其他的选择。。。正确的?而
mssql_bind
仅适用于存储过程,这是一个明确的选择,但我不确定是否愿意自愿扩展职责,通过执行插入/更新过程将维护包括在实际数据库中

我会说“因为老板说‘不’”是一个可怕的理由。告诉他(她?)他错了。我对PHP知之甚少,但不管是哪种语言,防止注入的唯一简单方法是通过参数化查询或存储过程。如果在PHP中实现这一点的唯一方法是使用PDO,那么就使用PDO

以下是您使用PDO的理由:


为什么代码中有SQL呢?如果它在数据库中,通常以存储过程的形式进行维护要容易得多。

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

这些函数没有现成的转义函数,但它们似乎为您提供了使用准备好的语句的功能——这将完成任务

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

请注意,您可能会错过边缘情况,如果您可以避免,我宁愿使用prepared statement功能

更新:我误读了手册,mssql_execute()只调用存储过程,而不是准备好的语句。你不能存储程序吗?这是一个简单的出路。但我想知道你怎么跟数据库说话


更新2:我在php.net上的mssql_bind评论中找到一个链接,指向一个关于转义的SO答案:

在将数据放入查询之前,请给出一些清理数据的建议:测试数据长度(min/max),测试数据值(min/max),使用正则表达式进行验证,使用is_numeric()等函数,使用ctype_*函数,使用htmlentities()。编写一个函数/方法,使用有意义的工具,并在将数据发送到数据库之前运行所有数据。想办法让你的老板相信参数化查询是件好事。@BennyHill我想验证是最好也是唯一的途径。他知道PDO将是一件好事,但升级PHP作为一个整体对我们来说比升级单个DB驱动程序更重要。SQL Server也不是我们通常支持的东西。它最终会发生。。。只是现在做不到。。。因此,我需要一个最安全的替代方案来处理我现有的问题。关于@Dave Johnson,我会说“因为老板说‘不’”,这是一个可怕的理由。-我完全同意这一点,但有时当老板下决心时,你必须找到另一种方法或另一份工作。:)@是的,我已经处理过了。除非老板能想出一个胜过安全问题的理由,否则我会选择新的工作路线:)我用过PDO,我喜欢它,而且它非常简单。。。但我不能使用它,也不能因此而离开。即使不是完美的,是否真的没有人能为我提供一个不处理PDO(这个答案)或MYSQL(下面这个答案)的解决方案?我不是建议你退出。我是说你应该说服你的老板让你使用参数化查询。我想不出任何合乎逻辑的论据来反对它。根据我所看到的,PDO、MySQL和存储过程是您最好的选择(看起来您可以在没有PDO的情况下执行存储过程)。否则,您似乎只能希望您考虑数据验证的所有可能性。
代码中为什么有SQL?
-真的。。。?我不想在别人的数据库里维护东西。。。我很忙,特别是为了直接更新。事实上,我甚至不知道如何在PHP中使用最少的SQL来完成我的工作。我会在需要时创建存储过程或视图,但我不知道或不包括对此数据库的不断更改,因此这会使它变得更难。。。
$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