[php:sql-injection>如何防止没有准备好的语句可以使用时?

问题描述 投票:-1回答:1

一个简单的问题:我有一个不使用预准备语句的框架(mySQLi)。当我有一些用户输入(通过公共形式但不允许HTML代码)时,如何避免sql注入。该注释必须存储在mysqli数据库中。

检测和删除可能的注入代码的最佳实践是什么?请不要使用准备好的语句的建议,如果不重写整个框架,这些建议将不可用!

编辑

我不是在问如何进行MySQLi查询!我问如何在php级别上防止sql注入。重复:一些网站访问者在纯文本字段中留下评论。该访客(脚本小子)认为,在此注释中,他可以发布sql-injection。

现在:在将注释添加到数据库之前,如何从注释中删除此伪代码。诸如“嘿,使用准备好的状态”,“使用pdo”,“使用这些带有这些参数的查询”之类的答案无法回答我的问题。还可以回答诸如“更改”您的框架”或不足够!

我知道可以通过preg_replace(..)删除此类代码,依此类推。是的,我知道有些人不使用这种技术..所以最好不要朝这个方向回答!

mysqli pdo prepared-statement sql-injection
1个回答
-1
投票

至少对于字符串输入,在每个输入上使用“转义”功能与使用准备好的语句一样安全。

但是出于某些原因,关心防止SQL注入的开发人员建议改用查询参数,包括但不限于以下原因:

  • 查询参数也适用于数值。

  • 使用查询参数的代码更易于编写和阅读,并且不太容易出错。我们希望开发人员能够更可靠地使用查询参数。

例如,您可以编写如下代码:

$sql = "INSERT INTO mytable (col1, col2, col3, col4, col5, col6) 
  VALUES ('" . mysqli_real_escape_string($_POST['col1']) . "', " 
  . mysqli_real_escape_string($_POST['col2']) . "', '" 
  . mysqli_real_escape_string($_POST['col3']) . "', '" 
  . mysqli_real_escape_string($_POST['col4']) . ", '" 
  . mysqli_real_escape_string($_POST['col5']) . "', '" 
  . mysqli_real_escape_string($_POST['col6']) . "')";

您能发现错误吗?只要有足够的时间,我相信您可以。但这会减慢您的编码速度,并且在寻找缺少引号字符和其他错误时可能会给您带来疲劳。

但是写起来要容易得多,事后阅读起来也容易:

$sql = "INSERT INTO mytable (col1, col2, col3, col4, col5, col6) 
  VALUES (?, ?, ?, ?, ?, ?)";

查询参数对于更多数据类型是安全的,它们可以帮助您更快地编写代码,并且减少错误。这是一个很大的胜利。

[像上面的其他评论一样,我不同意您关于MySQLi不支持查询参数的说法。在文档中已清楚显示:https://www.php.net/manual/en/mysqli.prepare.php

如果您有一些使用MySQLi但不支持mysqli::prepare()的包装器代码,那么我建议您停止使用该包装器代码。

© www.soinside.com 2019 - 2024. All rights reserved.