PDO防止sql注入的机制
技术百科
黄舟
发布时间:2017-02-25
浏览: 次 使用PDO访问MySQL数据库时,真正的real prepared statements 默认情况下是不使用的。为了解决这个问题,你必须禁用 prepared statements的*效果。下面是使用PDO创建链接的例子:
代码如下:
$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setattribute() 这一行是强制性的,它会告诉 pdo 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保sql语句和相应的值在传递到mysql服务器之前是不会被php解析的(禁止了所有可能的恶意sql注入攻击)
。虽然你可以配置文件中设置 字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 php(
我们来看一段完整的代码使用实例:
代码如下:
$dbh = new PDO("mysql:host=localhost; dbname=dbtest", "user", "pass");
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的*效果
$dbh->exec("set names 'utf8'");
$sql="select * from test where name = ? and password = ?";
$stmt = $dbh->prepare($sql);
$exeres = $stmt->execute(array($testname, $pass));
if ($exeres) {
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
}
$dbh = null;
上面这段代码就可以防范sql注入。为什么呢?
当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。
但是我们需要注意的是以下几种情况,PDO并不能帮助你防范SQL注入
1、你不能让占位符 ? 代替一组值,如:
代码如下:
SELECT * FROM blog WHERE userid IN ( ? );
2、你不能让占位符代替数据表名或列名,如:
代码如下:
SELECT * FROM blog ORDER BY ?;
3、你不能让占位符 ? 代替任何其他SQL语法,如:
代码如下:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
以上就是PDO防止sql注入的机制的内容,更多相关内容请关注PHP中文网(www.)!
# 的是
# 能让
# 这段
# 相关内容
# 你可以
# 才会
# 几种
# 你不
# 给了
# sql注入
# 中文网
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- Python生成器表达式内存优化_惰性计算说明【指
- Python配置文件操作教程_JSONINIYAM
- 如何在Golang中实现自定义Benchmark_
- php本地部署支持nodejs吗_php与node
- Win10电脑怎么设置IP地址_Windows10
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- c# F# 的 MailboxProcessor
- Python与OpenAI接口集成实战_生成式AI
- Win11怎么更改输入法顺序_Win11调整语言首
- Win11怎样安装微信开发者工具_Win11安装开
- c++如何判断文件是否存在_c++ filesys
- Win10怎么关闭自动更新错误弹窗_Win10策略
- 如何在 Go 中正确测试带 Cookie 的 HT
- Win10怎样卸载自带Edge_Win10卸载Ed
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- 如何解决同一段404代码在不同主机上表现不一致的问
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- Win10怎么限制单程序CPU占用上限_Win10
- Win11怎么用设置清理回收站_Win11设置清理
- c++怎么使用std::tuple存储多元组数据_
- 如何在Golang中实现基础配置管理功能_Gola
- Windows蓝屏错误0x00000018怎么处理
- 如何在 Go 中创建包含映射(map)的切片(sl
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- PHP怎么接收前端传的时间戳_处理时间戳参数转换技
- Windows 10自带杀毒软件在哪_Window
- 如何在 Go 同包不同文件中正确引用结构体
- 如何使用Golang实现负载均衡_分发请求到多个服
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- Windows10如何删除Windows.old_
- Python随机数生成_random模块说明【指导
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- Go语言中正确反序列化多个同级XML元素为结构体切
- 如何使用Golang安装API文档生成工具_快速生
- Win10怎样安装PPT模板_Win10安装PPT
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- 如何优化Golang程序CPU性能_Golang
- php打包exe后无法写入文件_权限问题解决方法【
- 如何在 Go 中可靠地测试含 time.Time
- Drupal 中 HTML 链接被双重转义导致渲染
- 如何使用Golang反射创建map对象_动态生成键
- Win11怎么关闭OneDrive同步_Win11
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Win10系统更新错误0x80240034怎么办
- php8.4新语法match怎么用_php8.4m
- Win11摄像头无法使用怎么办_Win11相机隐私
- php8.4如何实现队列任务_php8.4redi
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- Win11快速助手怎么用_Win11远程协助连接教

QQ客服