php长文本怎么防sql注入,PHP怎么防sql注入

防sql注入需要结合三方面来做:

参数检查,包括参数合法性和长度校验,对于特殊字符,还需要做特殊字符处理

数据库设计使用正确的数据类型,如果是字符类型,设定字符的长度

使用预定义语句和参数化绑定数据

php提供了MySQLi和PDO两种选择。

MySQLi:

$mysqli = new mysqli('localhost', 'user', 'password', 'user');

$stmt = $mysqli->prepare("INSERT INTO user (account,nickname,tall) VALUES (?, ?, ?)");

$account = 'jack';

$nickname = 'jack';

$tall = 18.5;

$stmt->bind_param('ssd', $account, $nickname, $tall);

PDO:

$account = 'jack';

$sql = 'SELECT account, nickname, tall FROM user WHERE account = :account';

$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$sth = $pdo->prepare($sql);

$sth->execute(array(':account' => $account));

$results = $sth->fetchAll();

PDO默认情况下是使用模拟预定义语句。PDO模拟预定义语句是PDO在模拟服务端对参数和sql语句进行绑定,这个过程包括对字符串进行转义。就类似于自己用mysqlrealescape_string做字符串转义后再拼接字符串,然后在发送到数据库服务器。所以需要禁用模拟预定义

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

但是有些情况下是避免不了拼接sql的。对于动态SQL,即sql查询的表、字段或者排序的字段、方向不确定,是变量,这时需要外部传参进来拼接成sql,如

$sql = 'select * from user order by '. $orderfield . $direction;

这种情况就需要传入的参数做检查,建立白名单

$orders = array("account","tall","nickname"); //允许排序的字段

$key = array_search($_GET['sort'],$orders));

$orderfield = $orders[$key];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值