2014-11-25 55 views
-1

为了教育目的,我在家制作了一个简单的网站,我使用的是PHP和MySql。 我有一个带wifi网络的数据库(来自wardriving),我可以在数据库中搜索SSID名称并查看网络是否在我的数据库中。 但我注意到,如果我在我的搜索中输入%%%我得到数据库中的所有结果,我该如何阻止?在MySql查询中阻止%%%

我的代码是:(编辑有点为这个职位删除敏感的东西)

<form method="post" action=""> 
    <input type="search" name="query" placeholder="Sök efter ditt SSID"/> 
    <input type="submit" name="submit" value="Sök" /> 
    </form> 
    <?php 

    include $_SERVER["DOCUMENT_ROOT"] . "/includes/connect.php"; 

    if(isset($_POST['submit'])){ 

    $db_tb_name="database"; 
    $db_tb_atr_name="ssid"; 

    $query = str_replace('%', '\%', mysql_real_escape_string($_POST['query'])); 

    //If search is longer than x characters... 
    if(strlen($query) >= 3) 
     { 
     //Do mysql query for results 
     $query_for_result=mysql_query("SELECT * FROM $db_tb_name WHERE $db_tb_atr_name like '%".$query."%'"); 

     //If query finds nothing, search is not in databse, echo... 
     if (mysql_num_rows($query_for_result) < 1) 
      { 
      echo "<br /><h3>Ditt SSID finns inte med i databasen</h3>"; 
      } 
     //Else echo table and populate with results 
     else 
      { 
      echo "<br>"; 
      $num_result = mysql_num_rows($query_for_result); 
      echo "<h3>Resultat av sökningen - $num_result träffar</h3>"; 
      echo "<table> 
      <thead> 
      <tr> 
       <th>SSID</th> 
       <th>MAC</th> 
       <th>Kanal</th> 
       <th>Kryptering</th> 
       <th>Algoritm</th> 
       <th>Autentisering</th> 
       <th>Signalstyrka</th> 
       <th>Tillverkare</th> 
      </tr> 
      </thead>"; 

      while($data_fetch=mysql_fetch_array($query_for_result)) 
       { 
       echo "<tr>"; 
        echo "<td>" . substr($data_fetch[ssid], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[mac], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[channel], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[privacy], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[ciper], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[auth], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[power], 0,32) . "</td>"; 
        echo "<td>" . substr($data_fetch[manuf], 0,32) . "</td>"; 
       echo "</tr>"; 
       } 
      echo "</table>"; 
      }    
     } 
    //If search is shorter than x characters, echo... 
    else 
     { 
     echo "<br /><h3>Sökningen måste innehålla minst 3 tecken</h3>"; 
     } 
    } 
    include $_SERVER["DOCUMENT_ROOT"] . "/includes/close_connection.php";   
    ?> 
+0

转换$查询特殊字符到他们的html实体 – 2014-11-25 14:24:59

+0

'str_replace('%','\%',$ query)',基本上。 %不会被m_r_e_s()转义。 – 2014-11-25 14:42:44

+1

对于所有神圣事物的爱,请使用'mysqli'或'PDO'而不是'mysql_ *'函数,因为它们将从下一个PHP版本中移除 – 2014-11-25 14:52:32

回答

3

mysql文档:

Character Description 
% Matches any number of characters, even zero characters 
_ Matches exactly one character 

为此你必须逃离他们在您的$查询变量。

$query = str_replace(array('%', '_'), array('\%', '\_'), mysql_real_escape_string($_GET['query'])); 

不过,我不建议你还是使用mysql_ *功能,为PHP 5.5.0的mysql_ *功能已被弃用。我建议你看看mysqlipdo

我知道你提到这是用于教育目的,你可能已经意识到这一点,但我仍然想指出。

+1

不错,这个作品! 是的,我一直在阅读的内容越来越多,我开始注意到“老方法”不再适用,我打算很快改变这一点。 我只发送查询到同一页面,这仍然是一个问题? – Frigol33t 2014-11-25 14:56:03

+0

假设yout $ _GET ['query']的种类是完整的查询,但似乎并非如此。所以这不会是一个大问题。但是,我仍然建议您在您的表单上使用POST作为方法。你不想最终通过你的网址发送密码。 – Seunhaab 2014-11-25 15:04:34

+0

好吧,现在将其更改为POST。我无法再搜索%%%,但是三个_给我所有的结果:/ – Frigol33t 2014-11-25 15:08:39