2012-09-04 63 views
2

我是一個年輕的開發人員,試圖阻止Sql注入我最初沒有編碼自己的網站。我已經閱讀了許多關於他們背後的注射和理論的文章,​​但我似乎無法得到這個正確的。在我把頭伸過這臺顯示器之前,請幫助我。 感謝 我的顯示器爲什麼我的代碼在試圖阻止Sql注入時不工作?

這裏是代碼:

<div id="main"> 
<div id="header"><? include('site_headergraphics.php'); ?></div> 
<table width="800" height="100%" border="0" cellspacing="0" cellpadding="0" 
class="content"> 
    <tr> 
    <td width="800" valign="top"> 
     <div style="padding:10px;"> 


    <? if($_SESSION[$_SESSION['SFIX'].'_owner_id'] == ''){ ?> 
    <br><br> 
     <form name="balance_login" method="post" action="<? if ($_GET['passthru']){  
?>?passthru=<?= $_GET['passthru'] ?><? } else { ?>?<? } ?>"> 
     <input name="action" type="hidden" value="login" /> 
     <table width="780" border="0" cellpadding="5" bgcolor="#FFFFFF"> 
     <tr> 
      <td><table width="780" border="0" cellpadding="5" cellspacing="0" 
bgcolor="#F7C30F" class="body_text"> 
      <tr> 
       <td colspan="3" align="left" class="rightmenu"><?= $passmessage ?><?= 
$specialmessage ?></td> 
       </tr> 
      <tr> 
       <td colspan="2" align="left" valign="top" class="rightmenu">To sign on, 
enter your information below.</td> 
        <td width="412" rowspan="5" valign="top"><p>Welcome to Mediterranean 
Wellness!</p> 
        <p>Ready to join us? You can <a 
href="index.php?section=payment">GET STARTED here. </a></p></td> 
      </tr> 
      <tr valign="top"> 
       <td width="121" align="right" class="rightmenu">Username:</td> 
        <td width="217"><input name="username" type="text" class="body_text" 
id="username" /></td> 

        <!--Added in the prevent SQL code injections--> 
        <?php /*?><?php unset($FindUser);  
         if(isset($_POST['username'])) 
         { 
          $_POST['username'] = 
trim($_POST['username']); 
          if(preg_match('/^[a- 
zA-Z0-9^$.*+\[\]{,}]{1,32}$/u', $_POST['username'])) 
           $FindUser = 
$_POST['username']; 
         } 
         ?><?php */?> 
       </tr> 
      <tr valign="top"> 
       <td align="right" class="rightmenu">Password:</td> 
       <td><input name="password" type="password" class="body_text" 
id="password" /></td> 
       <?php /*?><?php unset($FindPass); 
         if(isset($_POST['password'])) 
         { 
          $_POST['password'] = 
trim($_POST['password']); 
          if(preg_match('/^[a- 
zA-Z0-9^$.*+\[\]{,}]{1,32}$/u', $_POST['password'])) 
           $$FindPass = 
$_POST['password']; 
         } 
         ?><?php */?> 
         <!--End of code added in the prevent SQL code injections--> 
      </tr> 

      <tr valign="top"> 
       <td>&nbsp;</td> 
        <td><input name="Submit" type="submit" class="body_text" 
value="Login" /> 

        <?php 
        function make_safe($variable) { 
         $variable = 
mysql_real_escape_string(trim($variable)); 
         return $variable; 
        } 

        $username = make_safe($_POST['username']); 
        $password = make_safe($_POST['password']); 
        $check = mysql_query("SELECT Username, 
Password, UserLevel FROM Users WHERE Username = '".$username."' and Password = 
'".$password."'"); 

        ?> 

        <br> 
        <br> 
        <a href="?section=forgot">Forgot your username or password?</a></td> 
       </tr> 
      <tr> 
       <td>&nbsp;</td> 
        <td colspan="2">&nbsp;</td> 
       </tr> 
      </table></td> 
      </tr> 
     </table> 
     </form> 
    <? } else { ?> 
    <p class="body_text">You must <a href="?user_action=logout">logout</a> to continue 
to this page</p> 
    <? } ?> 
     </div></td> 
    </tr> 
</table> 
</div> 
+5

您的'make_safe'函數在哪裏定義?此外,爲了清晰起見,您可能會從代碼示例中刪除所有HTML,因爲它與數據清理工作無關。 –

+3

你的代碼到底有多「不工作」? –

+0

旁註:'$$ FindPass = $ _POST ['password'];'應該可能是'$ FindPass = $ _POST ['password'];'。關於'make_safe',它在那裏,一路走到最後。 –

回答

1

我想避免SQL注入的最佳方式是使用prepared statements當你查詢數據庫。

此外,你應該清理你的代碼,使其更好的可讀性,並使用設計模式,如MVC會給它一個更好的結構。

+1

另請參閱http://bobby-tables.com/php.html以PHP方式進行速成課程避免SQL注入。 –

-1

mysql_ *已棄用,且不適用於較新的版本 - 您應該結賬PDOMySQLi

具體的bind_param()函數 - 這是怎麼了,你現在應該處理用戶輸入(mysql_real_escape_String()不是完美的)

這就是說,你永遠不會連接到數據庫中你的代碼 - 無活動數據庫連接mysql_real_escape_string()將不起作用

+1

'mysql_ *正在被刪除,不能在新版本中工作,哪個版本不起作用? – Deepak

+0

@Deepak在較新的版本,它不會但現在它仍然在工作 – rsz

+0

@rsz是的,我同意你的!從他的答案看來,它不適用於新版本......應該說未來的版本! – Deepak