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

时间:2016-01-27 22:30:20

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

我是SQL注入的新手,想知道我是否正确使用了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>

1 个答案:

答案 0 :(得分:4)

没有。在SQL文本中包含的$each之前,您错过了 $query .= "keywords LIKE'%$each%'"; 的内容,此处:

mysql_

我们倾向于避免使用已弃用的 $query .= "keywords LIKE '%" . $each . "%'"; 函数,并使用PDO或mysqli接口。我们更喜欢使用带有绑定占位符的预准备语句。他们真的不是那么难。

如果我要去&#34;逃避&#34; SQL文本中包含可能不安全的值,我首先将该分配分解为这样。

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

现在,我们可以&#34;包装&#34;函数调用中的变量引用,如下所示:

$username

您需要在任何地方重复该模式,包括可能不安全的值,作为SQL文本的一部分。

并且没有必要在连接参数中包装$password $query .= " keywords LIKE CONCAT('%', ? , '%')"; 。那不是SQL语句。需要做什么&#34;逃脱&#34;是包含在SQL语句文本中的值。

同样,我们倾向于使用PDO或mysqli,并使用带有绑定占位符的预准备语句。例如:

{{1}}

此外,您在HTML中包含的值可能包含一些潜在危险的内容。通过适当的逃避来实现这一目标是一种很好的做法。在某些情况下http://php.net/manual/en/function.htmlspecialchars.php就足够了。

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