0

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

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

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

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

所以,重申......

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

谢谢

$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();
4

0 回答 0