【问题标题】:What do I need to escape when sending a query?发送查询时我需要逃避什么?
【发布时间】:2010-09-05 09:15:17
【问题描述】:

当您执行 SQL 查询时,您必须清理您的字符串,否则用户可能会在您的网站上执行恶意 SQL。

我通常只有一个函数 escape_string(blah),它:

  • 用双转义符 (\\) 替换转义符 (\)。
  • 用转义单引号 (\') 替换单引号 (')。

这足够了吗?我的代码有漏洞吗?有没有图书馆可以为我快速可靠地做到这一点?

我希望看到 Perl、Java 和 PHP 中的优雅解决方案。

【问题讨论】:

  • Replaces escapes () with double escapes (\). 行中的反斜杠显示一定有问题

标签: mysql oracle security


【解决方案1】:

我不确定 MySQL 是否支持参数化查询,如果支持,你应该努力走这条路。这将确保用户输入不会做任何恶意的事情。

否则,除了您提到的之外,一些“坏”字符将是分号 (;) 和 cmets(-- 和 /* */)。

【讨论】:

    【解决方案2】:

    您使用的是哪种语言?似乎它们几乎都有内置的 SQL 转义函数,使用起来会更好。

    例如,PHP 有mysql_real_escape_stringaddslashes

    【讨论】:

      【解决方案3】:

      MySQL C API 有它自己的mysql_escape_string()。最好使用它或等效的。

      【讨论】:

        【解决方案4】:

        在 MySQL 查询中,当使用 LIKE 时,还要确保将“_”字符转义,因为它不会被 mysql_real_escape_string 转义。

        参考请查看here

        【讨论】:

          【解决方案5】:

          使用准备好的语句。

          【讨论】:

            【解决方案6】:

            使用准备好的/参数化查询!

            【讨论】:

              【解决方案7】:

              为了获得最大的安全性、性能和正确性,请使用准备好的语句。 以下是如何使用不同语言(包括 PHP)的大量示例来做到这一点:

              https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

              【讨论】:

                【解决方案8】:

                在 PHP 中使用的一个很棒的东西是PDO。处理保护您的 SQL(以及所有一般的 SQL 内容)需要大量的猜测。它支持预处理语句,这对阻止 SQL 注入攻击大有帮助。

                本书The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed 中有一本很棒的PDO 入门书。让学习变得轻而易举,非常适合作为参考。除了实际的 SQL 查询之外,我什至不必再考虑其他任何事情了。

                【讨论】:

                  【解决方案9】:

                  在 PHP 中,我正在使用这个,我会感谢关于它的每一条评论:

                  function quote_smart($valeur) 
                  { 
                      if (get_magic_quotes_gpc()) 
                          $valeur = stripslashes($valeur); 
                  
                      if (!is_numeric($valeur)) 
                          $valeur = mysql_real_escape_string($valeur); 
                  
                      return $valeur; 
                  }
                  
                  
                  $IdS = quote_smart($_POST['theID']); 
                  $sql = " 
                  SELECT * FROM Students 
                  WHERE IdStudent={$IdS}; 
                  ";
                  

                  如果字段可以为 NULL,则需要再次验证:

                  $picture = NULL;
                  $theidyouwant = 7;
                  $Name = 'WOOD';
                  
                  
                  if(is_null($picture)) 
                      $p = 'NULL'; 
                  else
                      $p = "'".quote_smart($picture)."'"; 
                  
                  $IdS = quote_smart($theidyouwant);
                  
                  $requete = "SELECT * FROM Students
                      WHERE IdStudent={$IdS} AND
                      PictureStudent={$p} AND
                      NameStudent='{$Name}';
                      ";
                  

                  这就是享受! (希望帖子能正确发送下划线,而不是 _ ;)

                  【讨论】:

                    【解决方案10】:

                    最好使用带有占位符的准备好的语句。您使用的是 PHP 还是 .NET……无论哪种方式,准备好的语句都会提供更高的安全性,但我可以提供一个示例。

                    【讨论】:

                      【解决方案11】:

                      我也会逃避 cmets(双破折号)

                      --
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-06-29
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-04-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多