php - 防止动态 SQL 中的 SQL 注入(inject)

标签 php mysql sql sql-injection

这个问题在这里已经有了答案:





How can I prevent SQL injection in PHP?

(28 个回答)


2年前关闭。




我之前问过这个问题Preventing SQL Injection in dynamical SQL ,但不清楚是什么导致问题被关闭,后来在评论中被告知我应该再次问这个问题。

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

例如,用户可以创建一个 View 并提供以下条件:

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

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

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

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

    我认识到我必须非常小心,因为这样做很容易受到 SQL 禁令的影响。例如,我不能只是使用 PDO 转义用户的输入并将其存储在数据库中,然后检索数据并在查询中使用它,因为当它被检索时,它不再被转义。

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

    这是实现此功能的公认方法吗?有没有更简单的方法来确保用户输入的安全?我之前的帖子 Preventing SQL Injection in dynamical SQL表示永远不应该尝试这种类型的练习,但是,我不知道该怎么做。我还应该采取其他措施来防止注入(inject)吗?

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

    谢谢

    最佳答案

    你好,我明白了。

    这就是你要找的:
    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);
    

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

    问候。

    关于php - 防止动态 SQL 中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23616284/

    相关文章:

    php - 使用个人账户的 Paypal 付款列表

    mysql - "SQLSTATE[23000]: Integrity constraint violation"具有有效约束

    php - 从数组中排除多个值

    java - 查询两张表的外键

    php - Laravel 5.4 - 在哪里更改登录过程

    php - 正则表达式删除 [标题]

    php - 使用 php 在页面上时激活类

    mysql - 在搜索范围的 MySQL WHEN 语句中捕获 NULL 或零结果

    sql - 登录失败。该登录名来自不受信任的域,不能与Windows身份验证一起使用

    sql - 将 float 转换或转换为 nvarchar?