什么是pg_escape_string呢?

Sri*_*ran 7 php postgresql

我正在使用以下脚本从html表单中获取数据并存储在Postgres数据库中.有这个pg_escape_string函数,它将表单中的值存储到php变量中.在整个网络中搜索,我发现pg_escape_string转义字符串以插入数据库.我对此不太清楚.它究竟逃脱了什么?当它说一个字符串被转义时实际发生了什么?

<html>
   <head></head>
   <body>       

 <?php
 if ($_POST['submit']) {
     // attempt a connection
     $dbh = pg_connect("host=localhost dbname=test user=postgres");
     if (!$dbh) {
         die("Error in connection: " . pg_last_error());
     }

     // escape strings in input data
     $code = pg_escape_string($_POST['ccode']);
     $name = pg_escape_string($_POST['cname']);

     // execute query
     $sql = "INSERT INTO Countries (CountryID, CountryName) VALUES('$code', '$name')";
     $result = pg_query($dbh, $sql);
     if (!$result) {
         die("Error in SQL query: " . pg_last_error());
     }

     echo "Data successfully inserted!";

     // free memory
     pg_free_result($result);

     // close connection
     pg_close($dbh);
 }
 ?>       

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
      Country code: <br> <input type="text" name="ccode" size="2">  
      <p>
      Country name: <br> <input type="text" name="cname">       
      <p>
      <input type="submit" name="submit">
    </form> 

   </body>
 </html>
Run Code Online (Sandbox Code Playgroud)

Rya*_*per 7

请考虑以下代码:

$sql = "INSERT INTO airports (name) VALUES ('$name')";
Run Code Online (Sandbox Code Playgroud)

现在假设$name"Chicago O'Hare".当您进行字符串插值时,您将获得以下SQL代码:

INSERT INTO airports (name) VALUES ('Chicago O'Hare')
Run Code Online (Sandbox Code Playgroud)

这是不正确的,因为撇号被解释为SQL引号,您的查询将会出错.

更糟糕的事情也可能发生.实际上,SQL注入被MITER 评为2011年最危险软件错误.

但是你永远不应该使用字符串插值来创建SQL查询.请使用带参数的查询.

$sql = 'INSERT INTO airports (name) VALUES ($1)';
$result = pg_query_params($db, $sql, array("Chicago O'Hare"));
Run Code Online (Sandbox Code Playgroud)

  • 它的作用是将 'Chicago O'Hare' 更改为 'Chicago O''Hare'(具体如何转义取决于您的数据库设置) (2认同)