GVKun编程网logo

php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?(mysql预编译防止注入)

7

在这里,我们将给大家分享关于php–如果我使用MySQLi预处理语句,我是否需要转义我的变量?的知识,让您更了解mysql预编译防止注入的本质,同时也会涉及到如何更有效地mysqlc-api预处理语句

在这里,我们将给大家分享关于php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?的知识,让您更了解mysql预编译防止注入的本质,同时也会涉及到如何更有效地mysql c-api 预处理语句、mysql – 创建CSV文件时,是否需要转义某些字符?、MySqli预处理、mysqli预处理技术使用详解的内容。

本文目录一览:

php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?(mysql预编译防止注入)

php – 如果我使用MySQLi预处理语句,我是否需要转义我的变量?(mysql预编译防止注入)

如果我使用 MySQLi准备好的语句,如下所示:
$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();
不,如果您在应用程序中的任何地方使用预准备语句,则可以安全地进行sql注入.然而,一个重要的“陷阱”是二阶段注入攻击,当某些查询使用预处理语句而其他查询不使用时,会发生这种情况.

根据关于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 预处理语句

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文件时,是否需要转义某些字符?

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预处理

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预处理技术使用详解

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预处理技术使用详解的相关信息,请在本站查询。

本文标签: