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;"
在 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;"