在动态SQL中防止SQL注入

之前我在动态SQL中提出了防止SQL注入的问题,但不清楚导致问题被关闭的原因,后来在评论中告诉我应该再次提出这个问题。

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

例如,用户可以创建一个视图并提供以下标准:

  • 视图的名称。
  • 每页所需的记录。
  • 使用下拉菜单显示哪些列。
  • 结果的任何过滤器。 第一个下拉菜单用于选择列,第二个下拉菜单用于选择操作符(等于,不等于,大于等),然后使用第三个下拉菜单选择要匹配的值或用户直接输入要匹配的值。
  • 记录是否应该分组在一个给定的列上。
  • 根据用户的选择,可能需要将各种表连接到查询以支持select,where和group by子句,并且应用程序用于消除存在的重复表连接。

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

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

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

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

    这是一个公认的方法来实现这个功能? 有没有更简单的方法来确保用户输入安全? 我之前的文章在动态SQL中阻止SQL注入表明,这种类型的练习不应该尝试,但是,我不知道该怎么做。 我应该采取其他措施来预防注射吗?

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

    谢谢


    你好,我想你。

    这是你正在寻找的: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);
    

    现在,所有使用输入都将保持原样,如果字符串是“用户输入”,它将保持为“用户输入”,而不会更改为“用户输入”,因此没有任何内容被替换,并且仍然安全。

    问候。

    链接地址: http://www.djcxy.com/p/93967.html

    上一篇: Preventing SQL Injection in dynamic SQL

    下一篇: SQL injection on autoincrement