我将文本存储在数据库中,该数据库表示稍后将用于生成将用于将来查询的SQL脚本的内容。我知道这很危险,但是,需要这个功能而且不知道如何获得它。
首次存储用户提供的内容时,我使用了一个prepare语句,但是,我觉得这会给人一种虚假的安全感。当我稍后检索该值并在将来的查询中使用它时,任何危险的用户输入都会以其原始形式返回。
一种策略是针对每个使用内容的未来查询,对预处理语句,pdo :: quote()等采取适当的操作。请注意,在我的下面的示例中,我没有这样做并使用潜在危险的SQL直接在pdo :: query()中,我担心有一天我会忘记这样做。
相反,当我从$ _POST获取数据时,我正在考虑采取行动。有没有办法一劳永逸地删除任何潜在的内容,然后无需担心地存储和检索它?如果没有,从$ _POST收到的可接受值是整数,日期,日期时间或数字,我想我可以确保数据属于这些数据类型之一。
所以,重申......
由于
$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();