在这里,我们将给大家分享关于php–如果我使用MySQLi预处理语句,我是否需要转义我的变量?的知识,让您更了解mysql预编译防止注入的本质,同时也会涉及到如何更有效地mysqlc-api预处理语句
在这里,我们将给大家分享关于php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?的知识,让您更了解mysql预编译防止注入的本质,同时也会涉及到如何更有效地mysql c-api 预处理语句、mysql – 创建CSV文件时,是否需要转义某些字符?、MySqli预处理、mysqli预处理技术使用详解的内容。
本文目录一览:- php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?(mysql预编译防止注入)
- mysql c-api 预处理语句
- mysql – 创建CSV文件时,是否需要转义某些字符?
- MySqli预处理
- mysqli预处理技术使用详解
php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?(mysql预编译防止注入)
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?"); $stmt->bind_param('s',$Session); $stmt->execute(); $stmt->close();
我是否还需要使用MysqLi_real_escape_string()来转义$Session等变量;如下:
$Session = MysqLi_real_escape_string($con1,$_COOKIE['Session']); $stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?"); $stmt->bind_param('s',$Session); $stmt->execute(); $stmt->close();
根据关于SO的类似问题的this回答:
prepared statements / parameterized queries are sufficient to prevent 1st order injection on that statement. If you use un-checked dynamic sql anywhere else in your application you are still vulnerable to 2nd order injection.
总之,预处理语句在发送的数据和SQL查询本身之间创建了一个分隔,确保数据不会被误解为SQL查询.但是,攻击者仍然可以将sql作为数据输入,虽然在使用预准备语句时首次存储它时不会执行,但在检索结果时仍必须谨慎.准备好的语句可以保护您在该特定位置的应用程序,但由于sql仍然允许存储在数据库中,因此如果您以后在没有参数化的情况下使用该数据,则您的应用程序是不安全的.
mysql c-api 预处理语句
stmt = mysql_stmt_init(mysql)
mysql_stmt_prepare(stmt, "SELECT ?", strlen("SELECT ?"))
mysql_stmt_bind_param(stmt, param_bind)
mysql_stmt_execute(stmt)
mysql_stmt_bind_result(stmt, result_bind)
mysql_stmt_store_result(stmt)
while (!mysql_stmt_fetch(stmt))
mysql_stmt_close(stmt)
stmt = mysql_stmt_init(mysql);
mysql_stmt_prepare(stmt, "delete from aaa", strlen("delete from aaa"));
mysql_stmt_bind_param(stmt, bind)
mysql_stmt_execute(stmt) //修改bind的变量,可执行多次
mysql_stmt_execute(stmt)
mysql_stmt_execute(stmt)
mysql_stmt_affected_rows(stmt)
mysql – 创建CSV文件时,是否需要转义某些字符?
我正在从Ruby生成CSV文件.问题是列字符串将包含双引号,单引号.我怎么能逃避这些事情呢?
"Mary had a little so called \"lamb\"","34","none"
"something is not \"right\"","23","none"
每列用双引号括起来,后跟逗号(没有空格),并写入文件.
另外,如何将CSV插入MysqL?你需要使用像PHP的MysqL_real_escape_string这样的东西吗?
解决方法:
编写CSV数据很简单,最简单的方法是用双引号替换双引号的每个实例,然后用双引号括起整个事物.或者,如果您的数据不包含双引号,逗号,回车符,换行符或前导/尾随空格,则不必使用引号括起数据或担心转义.您可以在here找到更多信息.
解析CSV要复杂得多,特别是如果您尝试处理各种形式的格式错误的数据,在这种情况下,您几乎肯定希望使用现有模块.
MySqli预处理
预处理是先提交SQL语句到服务端,执行预编译,
客户端执行SQL语句时,只需要上传输入参数即可。
如果涉及多次读取或存储,效率高于普通SQL执行操作。
1.普通SQL执行
1 <?php
2 header(''content-type:text/html;charset=utf-8'');
3 $mysqli=new mysqli(''localhost'',''root'','''',''test'');
4 $mysqli->query(''set names utf8'');
5 $sql="INSERT INTO users(name,money) values(''张三'',100)";
6 $result=$mysqli->query($sql);
7 ?>
2.预处理(增删改)
1 <?php
2 header(''content-type:text/html;charset=utf-8'');
3 $mysqli=new mysqli(''localhost'',''root'','''',''test'');
4 $mysqli->query(''set names utf8'');
5
6 $sql="INSERT INTO users(name,money) values(?,?)"; //参数以?代替
7 $stmt=$mysqli->prepare($sql); //预处理
8
9 $name=''张三'';
10 $money=100;
11 $stmt->bind_param(''si'',$name,$money); //绑定参数
12 $result=$stmt->execute();
13
14 $name=''李四'';
15 $money=200;
16 $stmt->bind_param(''si'',$name,$money); //绑定参数
17 $result=$stmt->execute();
18 ?>
3.预处理(查询)
1 <?php
2 header(''content-type:text/html;charset=utf-8'');
3 $mysqli=new mysqli(''localhost'',''root'','''',''test'');
4 $mysqli->query(''set names utf8'');
5 $sql=''SELECT * FROM users WHERE id>?''; //参数以?代替
6 $stmt=$mysqli->prepare($sql); //预处理
7 $id=1;
8 $stmt->bind_param(''i'',$id); //绑定参数
9 $stmt->bind_result($id,$name,$money); //查询需要绑定结果集 [必须绑定所有字段]
10 $stmt->execute(); //执行sql语句
11 //取出结果集
12 while($stmt->fetch()){
13 $data[]=[
14 ''id''=>$id,
15 ''name''=>$name,
16 ''monry''=>$money
17 ];
18 }
19 var_dump($data);
20
21 ?>
mysqli预处理技术使用详解
本篇文章,介绍了PHP mysqli扩展库 预处理技术的使用分析。需要的朋友参考下
相关mysql视频教程推荐:《mysql教程》
1、使用mysqli扩展库 预处理技术 mysqli stmt 向数据库添加3个用户
<?php //mysqli扩展库 预处理技术 mysqli stmt 向数据库添加3个用户 //1、创建mysqli对象 $mysqli = new MySQLi("localhost","root","root","test"); if($mysqli->connect_error){ die($mysqli->conncet_error); } //2、创建预编译对象 $sql="insert into user1(name,password,email,age) values(?,?,?,?)"; $mysqli_stmt=$mysqli->prepare($sql); //绑定参数 $name="小芳"; $password="123456"; $email="xiaofang@126.com"; $age=18; //参数绑定->给?号赋值 这里类型和顺序要一致 $mysqli_stmt->bind_param("sssi",$name,$password,$email,$age); //执行 $b=$mysqli_stmt->execute(); //继续添加 $name="小杨"; $password="123456"; $email="xiaoyang@126.com"; $age=18; //参数绑定->给?号赋值 这里类型和顺序要一致 $mysqli_stmt->bind_param("sssi",$name,$password,$email,$age); //执行 $b=$mysqli_stmt->execute(); //继续添加 $name="小G"; $password="123456"; $email="xiaoG@126.com"; $age=18; //参数绑定->给?号赋值 这里类型和顺序要一致 $mysqli_stmt->bind_param("sssi",$name,$password,$email,$age); //执行 $b=$mysqli_stmt->execute(); if(!$b){ echo "操作失败".$mysqli_stmt->error; }else{ echo "操作成功"; } //关闭预编译 $mysqli_stmt->close(); $mysqli->close(); ?>
2、使用预处理查询id>5的用户id name email
<?php //使用预处理查询id>5的用户id name email $mysqli=new MySQLi("localhost","root","root","test"); if($mysqli->connect_error){ die($mysqli->connect_error); } //创建预编译对象 $sql="select id,name,email from user1 where id>?"; $mysqli_stmt=$mysqli->prepare($sql); $id=5; //绑定参数 $mysqli_stmt->bind_param("i",$id); //绑定结果集 $mysqli_stmt->bind_result($id,$name,$email); //执行 $mysqli_stmt->execute(); //取出绑定的值 while($mysqli_stmt->fetch()){ echo "<br/>$id--$name--$email"; } //关闭资源 //释放结果 $mysqli_stmt->free_result(); //关闭与编译语句 $mysqli_stmt->close(); //关闭连接 $mysqli->close(); ?>
以上就是mysqli预处理技术使用详解的详细内容,更多请关注php中文网其它相关文章!
我们今天的关于php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?和mysql预编译防止注入的分享已经告一段落,感谢您的关注,如果您想了解更多关于mysql c-api 预处理语句、mysql – 创建CSV文件时,是否需要转义某些字符?、MySqli预处理、mysqli预处理技术使用详解的相关信息,请在本站查询。
本文标签: