php - Mysql真实转义字符串的正确使用

标签 php mysql sql sql-injection mysql-real-escape-string

我是 SQL 注入(inject)的新手,想知道我是否正确使用了 mysql_real_escape_string?我应该为数据库和密码制作字符串以确保安全吗?如果有任何建议,我们将不胜感激!

    <html>
    <body>

<img src="searchlogo.png" style="PADDING-TOP: 50px">
    <form action='./search.php' method='get' >
<label>Search Our Archives</label>
<input type="text" name="k" size="50" value='<?php echo $_GET['k'];?>'/ >
<button type="submit">Search</button>

   </form>
   <hr/>
    <?php
    $k = $_GET['k'];
    $terms = explode(" ", $k);
    $query ="SELECT * FROM search WHERE ";

    foreach ($terms as $each){
        $i++;

        if ($i == 1)
            $query .= "keywords LIKE'%$each%'";
        else
            $query .= "OR keywords LIKE'%$each%'";
    }

   $db = mysql_connect("**host***","***database***","***password***",
        mysql_real_escape_string($user),
        mysql_real_escape_string($password));
    if (!$db) {
    die("Database connection failed: " . mysql_error());
   }


     $db_select = mysql_select_db("***database***",$db);
     if (!$db_select) {
    die("Database selection also failed: " . mysql_error());
    }


   $result = mysql_query("SELECT * FROM search", $db);
   if (!$result) {
   die("Database query failed: " . mysql_error());
   }


   while ($row = mysql_fetch_assoc($result)){
            $id = $row['id'];
            $title = $row['title'];
            $description = $row['description'];
            $keywords = $row['keywords'];
            $link = $row['link'];

            echo "<h2><a href='$link'>$title</a></h2>$description<br /><br      />";
        }


    mysql_close($db);


    $query = mysql_query($query);
    $numrows = mysql_num_rows($query);
    if ($numrows >0){


    }

    else    
        echo "No results found for \"<b>$k</b>\"";
     ?>

     </body>
    </html>

最佳答案

没有。在包含在 SQL 文本中之前,您错过了转义 $each 的内容,此处:

    $query .= "keywords LIKE'%$each%'";

我们的偏好是避免使用已弃用的 mysql_ 函数,并使用 PDO 或 mysqli 接口(interface)。我们更愿意使用带有绑定(bind)占位符的准备好的语句。它们真的没有那么难。

如果我要“转义”包含在 SQL 文本中的潜在不安全值,我会首先分解该分配,看起来像这样。

  $query .= "keywords LIKE '%" . $each . "%'";

现在,我们可以在函数调用中“包装”该变量引用,如下所示:

  $query .= "keywords LIKE '%" . mysql_real_escape_string($each) . "%'";

无论您将可能不安全的值作为 SQL 文本的一部分,您都需要重复该模式。

并且没有必要在连接参数中包含 $username$password。那不是 SQL 语句。需要“转义”的是包含在 SQL 语句文本中的值。


同样,我们的首选是使用 PDO 或 mysqli,并使用带有绑定(bind)占位符的准备好的语句。例如:

  $query .= " keywords LIKE CONCAT('%', ? , '%')";

此外,您在 HTML 中包含的值可能包含一些具有潜在危险的内容。通过适当的转义来运行它是一个很好的做法。在某些情况下 http://php.net/manual/en/function.htmlspecialchars.php就足够了。


顺便说一句,当动态附加到包含 SQL 文本的字符串时,我的偏好是在我添加的内容的开头包含所需的分隔符空间,而不必记住包含我附加到的字符串末尾的额外空间。这只是个人喜好。

关于php - Mysql真实转义字符串的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049378/

相关文章:

php - php中根据文件夹状态监控文件夹和事件触发

javascript - 将 GoogleGraph 保存为矢量图像

php - 如果没有更多条目要加载,在 mysql 查询中添加 if 语句?

sql - 特定列的postgresql(redshift)最大值

C# - 为什么时间和日期不保存在 mysql 数据库中?

javascript - 我有 symfony 版本 1.4 。我想知道是否可以从 1.4 升级到 3

php - 多张图片上传 PHP & Mysql

php - mysqli_real_escape_string创建SQL语法错误

c# - .NET 和 MySQL 中 SHA1 的区别

sql - 如何在 SQL Developer 中运行以下 Oracle exec 语句?