当我在PostgresSQL中使用类似的东西时,我想知道我是否可以安全地使用SQL注入:

CREATE or REPLACE FUNCTION sp_list_name( VARCHAR )
RETURNS SETOF v_player AS '
   DECLARE
      v_start_name ALIAS FOR $1;
      r_player  v_player%ROWTYPE;
      v_temp VARCHAR;
   BEGIN
      v_temp := v_start_name || ''%'';
      FOR r_player IN
         SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
      LOOP
         RETURN NEXT r_player;
      END LOOP;
      RETURN;
   END;
' LANGUAGE 'plpgsql' VOLATILE;

我想使用此功能列出以字母开头的玩家姓名。

select * from sp_list_name( 'A' );

给我的球员姓氏以A开头。

我试着用

注入sql
select * from sp_list_name( 'A; delete from t_player;--' );
select * from sp_list_name( '''; delete from t_player;--' );

我安全吗?

我可以注射哪种情况?

此致

有帮助吗?

解决方案

就您的程序而言,您似乎很安全,因为SP中的变量不会扩展为代码,但如果您不使用参数化查询,例如“ SELECT,您仍然可以暴露自己* FROM sp_list_name(?); "在应用代码中。类似于“ SELECT * FROM sp_list_name('$ start_name'); "可以通过用户传递起始名称“ ”来破坏;从t_player删除last_name NOT IN(' ")。所以使用参数化查询或健全性检查您在计划中的输入。

NB:请注意,存储过程中的变量会扩展为代码,即使它包含'或;,(不包括传递给它) EXECUTE ,您将使用 quote_literal ,而不是手动 替换 函数)所以更换;或者“完全没必要(在存储过程中,使用它的应用程序当然是一个不同的故事)并且会阻止你总是找到” tl; dr “或“ O'Grady ”队。

存储过程中的 Leo Moore,Karl,LFSR Consulting v_temp_name NOT 扩展为SP中的代码(无 EXECUTE ),需要在应用程序中进行检查,而不是SP(或者OP可能只是在他们的应用程序代码中使用参数化查询)。其他人的建议类似于担心

my $bar = "foo; unlink('/etc/password');"; 
my $baz = $bar;

在没有评估的情况下实际运行取消链接。

其他提示

防止sql注入的规则#1:清理所有来自某人/你无法信任/无法控制的内容的输入。

问题本身并不在于数据库代码,而在于执行这些语句的应用程序。

防止SQL注入的正确方法是通过白名单 * - short设置您要接受的字符并将其过滤掉。

错误的方法是黑名单 - 黑名单列出不接受的字符是会导致麻烦,因为你不能跟上攻击者的步伐。有很多方法可以通过ASCII表,转义字符以及其他方式来处理黑名单。

此外,这是一个很好的备忘单,可以在您的网站上试用。运行一些测试并尝试让事情失败。

* 在应用程序中,而不是DB(感谢James)

您不是为自己生成SQL,所以这看起来很安全(对我而言)。

我不知道您调用存储过程的数据来自哪里。所以你仍然要防止缓冲区溢出等。

参考。白名单。如果遵循某些其他条件,则可以。将所有输入分解为最简单的形式是绝对必要的,所以不要只检查SQL查询名称,单引号等。它们可以使用其他字符集来表示或编码,这就是白名单的一部分,而不是具体的SQL关键字本身。

我正在为一个特定的客户工作,该客户端允许使用受保护资源的用户名/密码(最终可以获得访问机场安全部分的访问权限!)。您可以通过输入'然后从那里构建SQL查询来检索用户帐户和密码来绕过登录字段。

问题是客户已经烧毁了#200; 200k与之前从未进行过网络开发的供应商建立网站。修复是另一个£ 60k,这是一个验证func(),它只检查union,select,等等关键词。当被问及他们为canicolisation /编码做了什么(我必须解释)时,它是风滚草时间。

开发房屋和(昂贵的)项目得到了罐装。

您可以考虑验证

 v_start_name 
的内容。检查字符串是否有冒号,注释字符,等号等。请记住检查字符和十六进制值。请记住允许使用带连字符的名称,例如“史密斯 - 布朗”可能是可以接受的'史密斯 - 布朗'可能会注射。

如果不熟悉SQL注入中的Hex,以下是快速介绍

http:// www .arejae.com /博客/使用-T-SQL SQL注入攻击 - 和 - hexadecimal.html

http://www.securityfocus.com/infocus/1768

DECLARE
      v_start_name ALIAS FOR $1;
      r_player  v_player%ROWTYPE;
      v_temp VARCHAR;
   BEGIN
      --  new pseudo code here
      if v_start_name has bad chars exit with error message
      -- end pseudo code here
      v_temp := v_start_name || ''%'';
      FOR r_player IN
         SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
      LOOP
         RETURN NEXT r_player;
      END LOOP;
      RETURN;
   END;

此致 卡尔

只需在你的v_start_name上进行替换即可删除&quot ;;"等等。

v_clean_name VARCHAR;
Select v_clean_name = Replace(v_start_name,';','');

这将取代;与空白挫败SQL注入攻击

有关详细信息,请参阅 PostgresSQL中的字符串函数

LFSR咨询公司也评论道。最好使用WhiteList(即不处理任何带有无效字符的输入,如';')而不是BlackList(即尝试清理数据,因为用户也可以对你的Replace进行SQL注入攻击)。

有关详细信息,请查看 SQL注入攻击

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top