在动态SQL中防止SQL注入

时间:2014-05-12 18:32:19

标签: php mysql sql sql-injection

我之前提到过这个问题Preventing SQL Injection in dynamical SQL,但不清楚导致问题被解决的问题,后来在评论中告诉我应该再问这个问题。

我的PHP / MySQL应用程序的一个要求是允许所有用户创建自己的多个"视图"的数据。这些视图不是传统的SQL视图,而是由应用程序执行。

例如,用户可以创建视图并提供以下条件:

  • 视图名称。
  • 每页所需记录。
  • 使用下拉菜单显示哪些列。
  • 结果的任何过滤器。第一个下拉菜单用于选择列,第二个下拉菜单用于选择运算符(等于,不等于,大于等),然后使用第三个下拉菜单选择要匹配的值或用户直接输入要匹配的值。
  • 是否应将记录分组到给定列上。

根据用户的选择,可能需要将各种表连接到查询以支持select,where和group by子句,并且应用程序用于消除重复的表连接(如果存在)。 / p>

用户完成视图配置后,会出现一个下拉菜单,允许他们选择所需的视图,并显示相应的结果。

我已经通过在多个表中存储用户的选择来实现此功能,并且还存储结果查询(实际上,我将查询的各个部分存储在各个列中,因此我可以在初始中计算总结果在SQL表中查询并返回第二个查询中的正确结果数。请注意,我仅存储用户的选择,以便我可以允许他们编辑他们的视图要求,而不是动态创建结果查询(稍后将详细介绍)。

我认识到我必须非常小心,因为这样做可能会导致SQL禁令。例如,我无法使用PDO转义用户的输入并将其存储在数据库中,然后检索数据并在查询中使用它,因为在检索数据时,它不再被转义

为了克服这种风险,我尽可能将用户输入限制为整数,并在可能的情况下对其进行类型化。在用户输入为百分比和美元的情况下,我乘以100,将结果作为整数进行类型转换,然后在存储之前除以100。一些过滤器需要将text作为WHERE子句中的值,并且如前所述,不需要转义数据,而是使用$user_input= preg_replace('/[^a-z0-9,]/i', '', $_POST['user_input']);来保证安全。

这是实现此功能的可接受方法吗?有没有更简单的方法来确保用户输入是安全的?我之前的帖子Preventing SQL Injection in dynamical SQL表示不应该尝试这种做法,但是,我不知道如何做到这一点。我是否应采取其他措施来预防注射?

或者我可能不会在用户保存其视图配置时创建查询并将其存储在表中,而是在每次用户选择给定视图时使用用户保存的值动态创建查询。这会产生负面的性能影响并增加共谋,但我想我可以做到。你会建议使用这个策略吗?

谢谢

1 个答案:

答案 0 :(得分:-3)

你好,我想你了。

这就是你要找的东西: http://www.php.net/manual/en/function.addslashes.php

$safestring=mysql_real_escape_string($_POST['user_input']);
$safestring=addslashes($safestring);

如果你想让它更安全,那就是用户无法在输入中输入html, 使用上面的函数后使用此函数(即mysql_real_escape_string)

$safestring=htmlspecialchars($safestring);

现在您的所有使用输入都将保持不变, 如果字符串是"用户的输入"它将作为"用户的输入而保持"而不是改为"用户输入",所以没有任何东西被替换,而且它仍然是安全的。

问候。