Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这段代码足以保护我免受SQL注入攻击和PHP注入攻击吗?_Sql_Code Injection - Fatal编程技术网

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

这段代码足以保护我免受SQL注入攻击和PHP注入攻击吗?,sql,code-injection,Sql,Code Injection,这段代码足以保护我免受SQL注入攻击和PHP注入攻击吗 我将此函数包含在函数的include文件中: function strclean ($string) { $outstr = ''; if (strlen ($string) > 0) { $ix = 0; $char = substr ($string, $ix, 1); // strip leading spaces while ($char == ' ') { $ix = $i

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

我将此函数包含在函数的include文件中:

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;
  }
甚至后来,我有了以下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?
  }

一般的规则是否认一切,只允许有效的字符,而不是删除你认为无效的。 最重要的一点是以后如何处理这些字符串。如果你有一句话后来说:
tsql=“从用户名=”的用户中选择*”$用户名。“'和”
这是主要的风险领域,尽管
mysql\u real\u escape\u string
应该避免这种情况

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

每当在屏幕上显示数据时,考虑一些类似于“代码> HTMLPrimeCARSARS())的代码,将其转换为HTML。如果你需要它,在以后不被释放的时候存储它是没有意义的,只要你一直认为它是原始的,数据库中的原始数据就不会有风险。 总之,您列出的代码可能会减少注入,也可能不会减少注入,但有太多的组合,无法排除所有可能性,包括用户使用单引号(您只是在替换双引号)等方面。 所有用户输入数据都有潜在危险。您可以随意将其原始存储,但无论何时使用,请确保使用上述选项之一保护您的操作


我的PHP现在有点生疏了,但SQL Server、Oracle、.NET、Java和其他任何数据库/语言都适用同样的规则。

为什么你要自己制作一个,而不是在PHP核心中使用函数?因为它很长,而且读起来很复杂,我认为这不是一个可行的方法。请看一个类似的问题。可能重复的可能重复的可能重复的后面,我有一行写着:
$result=mysql\u query('SELECT*FROM username=“”。$username.”,$dbconn)我不在查询中搜索密码。几行之后,我根据数据库上的密码测试了提供的密码。是的,这正是要避免的类型!如果有人发现您的复杂逻辑中存在缺陷,他们可以将任何语句注入该SQL。查看mysql库中的
bind_param
函数并使用它们。这样就根本不需要逃跑了。理论上,你可以假设
mysql\u real\u escape\u string
可以防止这种情况发生,但我从不冒险。
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?
  }