最近在使用框架的时候仍是有点不安,不知道框架的设计者有没有考虑到SQL-Injection的问题,我在顶层需不须要作一些必要的过滤等等,由此我特地的去StackOverflow看了下,真是获益良多,而后我去看了下框架的DB库的内部方法,而后就比较安心了。分享下国内外PHP程序员在处理SQL-Injection的一些方案。php
国外广泛都推荐,只要你是使用查询都应该作到两点:1.prepared statements(准备好的声明) 2.parameterized queries (参数化的查询请求)。mysql
我一开始也不理解这个是什么意思,后来看他们举例就大概知道了。比较安全的SQL,你须要一开始对查询的变量进行准备。如:程序员
$name = $_POST['name']; $sql = 'select * from user where name'.$name;
那么最好就是对$name先处理下,sql
$name = mysql_real_escape_string($_POST['name']); //
而后,让请求过来的变量成为参数,而不是SQL语言自己。安全
$sql = 'select * from user where name=\''.$name.'\'';
固然,这种写法仍是比较粗糙。框架
因此,通常都会推荐使用PDO 或者是MYSQLI的prepare() excute()方法。.net
$stmt = $pdo->prepare('SELECT * FROM user WHERE name = :name'); $stmt->execute(array('name' => $name));
关于PDO::prepare()
设计
这样作的好处就是,你再也不须要担忧查询请求会插入一些SQL语句,由于这些语句都将会看成是请求变量(一个字符串或者是数字),再也不会误觉得是SQL语言自己。这样能够大大的减小SQL注入的机会。code