pg_escape_string到底是做什么的?

7
我正在使用以下脚本,它从html表单中获取数据并存储在Postgres DB中。有这个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>
2个回答

9
考虑以下代码:
$sql = "INSERT INTO airports (name) VALUES ('$name')";

假设$name的值为"芝加哥奥黑尔"。当您进行字符串插值时,会得到以下SQL代码:
INSERT INTO airports (name) VALUES ('Chicago O'Hare')

这段代码存在问题,因为 撇号 被解释为 SQL 引号,会导致查询出错。

更糟的情况还有其他。实际上, SQL 注入被 MITRE 评为 2011年最危险的软件错误#1

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

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

2
它的作用是将“芝加哥奥黑尔”更改为“芝加哥O'哈雷”(如何进行转义取决于您的数据库设置)。 - dsas

1

1
这个内容很老了,但是对于后来者,pg_escape_string() 是防止 SQL 注入的一种方法,但并不能完全预防。使用预处理语句更好。(https://dev59.com/GnRB5IYBdhLWcg3wEDyl) - Pandu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接