Binding参数如何防止Sql注入?

How does Binding parameters prevent Sql Injection?

在 PHP 中,我发现了一些防止 Sql 注入的方法。绑定参数就是其中之一。但是我无法找到关于绑定参数如何实际防止 Sql 注入的完整解释。我认为绑定参数只是节省了将不同数据绑定到相同 Sql 语句的时间。如何预防 Sql 注射?

我想一个简单的例子会解释你的事情:

  "select * from myTable where name = " + condition;

假设用户输入 condition

  '123'; delete from myTable; commit;

然后会发生什么?执行的查询将是

  select * from myTable where name = '123'; delete from myTable; commit;

或者实际上我们有 三个 具有灾难性后果的查询:

  select * from myTable where name = '123';
  
  delete from myTable; 
  
  commit;

如果是绑定变量

  "select * from myTable where name = @prmName"

无论用户输入是什么,它都将是 一个且只有一个 查询,上面的奇怪输入将始终被视为 字符串 ,而不是作为查询 的 部分。结果将(很可能)是一个 空游标 ,因为 myTable 中没有 name

  "'123'; delete from myTable; commit;"