这段代码是否足以保护我免受SQL注入攻击和PHP注入攻击?

时间:2012-03-31 00:29:39

标签: sql code-injection

此代码是否足以保护我免受SQL注入攻击和PHP注入攻击?

我在函数的包含文件中有这个函数:

function strclean ($string) {
  $outstr = '';
  if (strlen ($string) > 0) {
    $ix = 0;
    $char = substr ($string, $ix, 1);
    // strip leading spaces
    while ($char == ' ') {
      $ix = $ix + 1;
      $char = substr ($string, $ix, 1);
      }
    // disarm naughty characters
    while ($ix < strlen ($string)) {
      $char = substr ($string, $ix, 1);
      if ($char == '<') $char = '&lt;';
      else if ($char == '>') $char = '&gt;';
      else if ($char == '"') $char = '&quot;';
      else if ($char == '&') $char = '&amp;';
      else if ($char < chr(20)) $char = '';
      $outstr = $outstr . $char;
      $ix = $ix + 1;
      }
    // strip trailing spaces
    while (substr ($outstr, strlen ($outstr) - 1, 1) == ' ' && strlen ($outstr) > 0) {
      $outstr = substr ($outstr, 0, strlen ($outstr) - 1);
      }
    $outstr = mysql_real_escape_string ($outstr);
    }
  return $outstr;
  }

稍后在我的页面中,我从表单输入中返回了各种字符串,例如:

$username = strclean ($_POST['username']);
$password = strclean ($_POST['password']);

甚至后来,我有以下SQL:

$result = mysql_query ('SELECT * FROM users WHERE 
  username = "' . $username . '"', $dbconn) or die (mysql_error());

我不会在查询中一起搜索用户名和密码。在此之后几行,我检查一下这样的有效密码:

if ($rowsfound == 1) {
  $userrow = mysql_fetch_array ($result);
  $userword = $userrow ["password"];
  if ($userword == $password) {
     // logon
     }
  else {
    // incorrect password
    }
  }
else if ($rowsfound == 0) {
  // unknown user
  }  
else {
  // something strange happened!  possible sql injection attack?
  }

1 个答案:

答案 0 :(得分:1)

一般规则是拒绝所有内容并仅允许通过有效字符,而不是删除您认为无效的内容。 最重要的方面是你之后使用这些字符串做什么。如果你后来有一句话说:     tsql = "SELECT * FROM Users WHERE Username='" . $username . "' AND " 那么这是主要的风险领域,尽管mysql_real_escape_string应该避免这种情况。

通过使用允许将参数传递到数据库的库或功能,永远不会有任何sql注入,因为数据库参数不能被解释为TSQL,只留下PHP / Javascript注入的可能性。 基本上,将bind_param函数视为唯一真正的保护。

每当在屏幕上显示数据时,请考虑使用htmlspecialchars()之类的内容将其转换为HTML。如果您以后无需转义,那么存储转义的内容是没有意义的,只要您始终认为它是原始的,数据库中的原始数据就不会带来任何风险。

总之,您列出的代码可能会或可能不会减少注入,但有太多组合可以排除所有可能性,包括用户使用单引号(您只是替换双引号)等方面。 所有用户输入数据都有潜在危险。可以随意存储它,但每当使用它时,请确保使用上述选项之一保护您的操作。

我的PHP现在有点生疏,但完全相同的规则适用于SQL Server,Oracle,.NET,Java任何其他数据库/语言。