如何安全地将SQL脚本存储在另一个表中

时间:2013-01-23 13:12:23

标签: php mysql

我将文本存储在数据库中,该数据库表示稍后将用于生成将用于将来查询的SQL脚本的内容。我知道这很危险,但是,需要这个功能而且不知道如何获得它。

首次存储用户提供的内容时,我使用了一个prepare语句,但是,我觉得这会给人一种虚假的安全感。当我稍后检索该值并在将来的查询中使用它时,任何危险的用户输入都会以其原始形式返回。

一种策略是针对每个使用内容的未来查询,对预处理语句,pdo :: quote()等采取适当的操作。请注意,在我的下面的示例中,我没有这样做并使用潜在危险的SQL直接在pdo :: query()中,我担心有一天我会忘记这样做。

相反,当我从$ _POST获取数据时,我正在考虑采取行动。有没有办法一劳永逸地删除任何潜在的内容,然后无需担心地存储和检索它?如果没有,从$ _POST收到的可接受值是整数,日期,日期时间或数字,我想我可以确保数据属于这些数据类型之一。

所以,重申......

  1. 我应该如何最好地存储以后用作SQL以供将来查询的内容?
  2. 如何永久删除可用作SQL注入的内容而不是仅仅转义它?
  3. 由于

    $user_input=$_POST['suspect_user_input']; //Acceptable values are an integer, a date, a datetime, or a number
    $sql='INSERT INTO table1 (id,user_input) VALUES(123,?)';
    $stmt = db::db()->prepare($sql);
    $stmt->execute(array($user_input));
    unset($user_input);
    ...
    ...
    $sql='SELECT user_input FROM table1 WHERE id=123';
    $stmt = db::db()->query($sql);
    $user_input=$stmt->fetchColumn();
    $partial_select_statement='SELECT * FROM '.$user_input;
    $sql='INSERT INTO table2 (id,partial_select_statement) VALUES(321,'.$partial_select_statement.')';
    $stmt = db::db()->exec($sql);
    unset($partial_select_statement);
    ...
    ...
    $sql='SELECT partial_select_statement FROM table2 WHERE id=321';
    $stmt = db::db()->query($sql);
    $partial_select_statement=$stmt->fetchColumn();
    $new_sql=$partial_select_statement.' WHERE foo=bar';
    $stmt = db::db()->query($new_sql);
    $rs=$stmt->fetch();
    

0 个答案:

没有答案