将mysqli_real_escape_string与其他消毒功能结合使用

时间:2015-08-04 19:48:02

标签: php mysql security sql-injection sanitization

我的表格输入消毒功能:

select SUM(SOTRAN.ACTQTY) AS value, 
       case when SOTRAN.ACTQTY > 10 then 
         'Week of ' + CONVERT(VARCHAR(10),dateadd(wk, datediff(wk, 0, SOTRAN.tdate), 0),1) else 
          'Others' end AS label
  from SOTRAN AS SOTRAN
 WHERE (SOTRAN.tdate>='1/1/2015 12:00:00 AM' 
   AND SOTRAN.tdate<='12/31/2015 11:59:59 PM' )  
 GROUP BY case when SOTRAN.ACTQTY > 10 then 
         'Week of ' + CONVERT(VARCHAR(10),dateadd(wk, datediff(wk, 0, SOTRAN.tdate), 0),1) else 
          'Others' end;

我的SQL行:

function clean_input($data) 
            {
              $data = trim($data);
              $data = strip_tags($data);
              $data = stripslashes($data);
              $data = htmlspecialchars($data);
              return $data;
            }   

这是正确的用法吗?

1 个答案:

答案 0 :(得分:3)

  

这是正确的用法吗?

不,不是。如果您在输入周围使用单引号并且未使用certain multibyte charsets,那么它将是相当安全的,但它确实不是建议的安全性或可用性/数据完整性方法。

防止SQL注入

使用准备好的陈述。使用PHP,您可以使用mysqliPDO(另请注意this,这可能是一个问题,具体取决于您的版本/配置。)

以下是OWASP所说的内容:

  

第二种技术是在将用户输入放入之前将其转义   查询。然而,与使用相比,这种方法[mysqli_real_escape_string]是脆弱的   参数化查询,我们无法保证它会阻止所有SQL   在所有情况下注射。这种技术只能用于   谨慎,以经济有效的方式改进遗留代码。

clean_input function

让我们看一下这些功能:

  • trim :从字符串的开头和结尾删除空格。这在某些情况下可能很有用,并且在很多情况下都不会受到伤害。它并没有真正影响安全性。
  • strip_tags :删除NULL bytes, HTML and PHP tags。对于某些攻击(一些代码注入,一些XSS,一些LFI / RFI),这可能是一个很好的第一道防线,但它可能会破坏您的数据(例如the smaller sign (<) is interesting变为the smaller sign ()。它也不是针对任何上述攻击的正确防御,因此我不建议像这样使用它。
  • stripslashes :顾名思义,它会删除斜杠。这仅在魔术引号打开时才有用(这是添加斜杠的功能),因此您应首先检查,否则可能会损坏您的数据。如果启用了魔术引号(它不应该是),建议使用stripslashes,否则会损坏数据。
  • 再次
  • htmlspecialchars ,这可能会损坏您的数据(例如,您没有将原始数据保存在数据库中,而是更改了数据)。在大多数情况下,对于XSS是正确的防御(对于异常,请参阅here,并使用ENT_QUOTES),但在将数据插入数据库之前确实不应该发生,原因有两个:1。损坏的数据2这种方法可以很容易地引入XSS漏洞。 XSS是在回显数据时引入的漏洞,因此应该防止它。否则,很难记住哪些数据是安全的,哪些数据不安全。

总结:您的方法在将输入数据插入数据库之前更改输入数据,这可能会影响可用性。这甚至没有增加那么多安全性,当然也不被认为是安全性的最佳实践方法。