Dav*_*man 9

别.逃逸.SQL.

别.引用.SQL.

使用SQL占位符/参数(?).SQL语句的结构和占位符表示的数据值完全分开发送到数据库,因此(除了数据库引擎或DBD模块中的错误),绝对没有办法将数据值解释为SQL命令.

my $name = "Robert'); DROP TABLE Students; --";
my $sth = $dbh->prepare('SELECT id, age FROM Students WHERE name = ?');
$sth->execute($name);  # Finds Little Bobby Tables without harming the db
Run Code Online (Sandbox Code Playgroud)

作为附带的好处,如果你重新使用你的SQL语句(它只需要准备一次),使用占位符也会更有效,如果你不这样做,那么使用占位符效率也会更高(如果你没有明确地调用prepare,它仍然会得到在执行查询之前隐式调用).


Chr*_*oms 5

喜欢报价

如果您担心utf8,我还建议您阅读DBD :: MySQL的文档.