php如何防止sql注入
如果用户用一个没有经过修改的sql查询语句替换input值,这样应用程序就会容易受到SQL注入,就像下面的例子:
$unsafe_variable = $_POST['user_input']; 
mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')");
因为用户可以输入像value'); DROP TABLE table;-- ,查询就变成:
INSERT INTO table (column) VALUES('`**`value'); DROP TABLE table;--`**`') 
我们要做什么来防止这种情况发生?
使用预处理语句和参数化查询。可以任何参数和sql语句分离发送解析到数据库服务器。这种方式可以使攻击都不能注入恶意的SQL。
你基本上有两种选择来实现这一目标:
1.使用pdo。
  $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
  $stmt->execute(array('name' => $name));
  foreach ($stmt as $row) {
    // do something with $row
  }
  需要注意的是使用PDO来访问MySQL数据库时,真正的预处理语句不使用默认值。为了解决这个问题,你必须禁用预处理语句的模拟形式。创建使用PDO连接的一个例子是:
  
  $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
  $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
在上面的例子中,错误模式不是严格必需的,但它是表示添加它。这样,脚本将不会在有致命错误停止时出现错误。并给出了开发者抛出的PDOExceptions任何错误(s)的机会。
第一个setAttribute,它告诉PDO禁用模拟预处理语句和使用真正的预处理语句。这可以确保该语句和值不会被PHP发送到MySQL服务器(使攻击者没有机会注入恶 意的SQL),然后解析。
虽然你可以在构造函数中的选项设置字符集,一定要注意重要的是'老'版本的PHP(<5.3.6)
2.使用mysqli。
 $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
 $stmt->bind_param('s', $name);
 $stmt->execute();
 $result = $stmt->get_result();
 while ($row = $result->fetch_assoc()) {
    // do something with $row
 }
近期文章
- 织梦5.7{dede:php}标签不起作用的解决办法
 - php版本non-thread-safe和thread-safe的区别
 - 什么是fatal flex scanner internal error--end of buffer missed
 - php文件命名建议用小写
 - php cookie字典
 - seft和static在php中有什么不同
 - 用php快速获取图片大小
 - 用php的json_decode()检测json数据是否合法
 - php三个等号
 - unset和=null有什么不同
 - php如何捕获一个警告信息
 - 如何获得php数组中最后一个元素的键名?
 - 在PHP中,你如何改变数组中某一元素的键名?
 - php多维数组转xml
 - php如何转化数组为SimpleXML对象
 - php如何把数组定义为常量
 - php根据数组中的值删除数组中的元素
 - 计算两个日期相差多少天
 - 如何捕获var_dump的输出结果保存到一个字符串中?
 - 用php获取完整的URL