2012-01-27 104 views
0

在我的php代碼中,我可以使用php $ _GET方法獲取數據。這裏是代碼看起來像這樣..php查詢字符串驗證

<?php 
<a href='userprofile.php?uname=$uname'>$uname</a> 
?> 

如果我點擊它顯示用戶個人資料頁面,使userprofile.php頁面的URL看起來像這樣的鏈接。

http://localhost/evantechbd1/userprofile.php?uname=shibbir 

我的問題是如何防止這個URL從SQL注入或任何其他攻擊。

如果我寫:

http://.......uname=shibbir'OR'='-1-' 

那麼它顯示:

SHIBBIR%27OR%27%3D%27-1-%27'S PROFILE. 

我想要的任何文本提供給鏈接它必須是隻顯示有效的用戶名的個人資料頁面。

任何想法。

回答

0

你不能阻止某人攻擊攻擊,你只能防止攻擊成功。但是,實際的預防措施完全取決於您要使用數據庫的方式。由於許多「清理」功能會破壞其他使用情況下所需的數據,因此沒有任何「神奇子彈」功能可以使每一部分數據在每種情況下都安全無虞。

例如如果在SQL查詢中永遠不會使用錯誤的數據,那麼使用(比如說)mysql_real_escape_string()來執行SQL注入攻擊防範就毫無意義。當字符串不會在HTML上下文中使用時做htmlspecialchars()同樣沒用。

0

在您的SQL中使用$uname之前,請將其轉義。
例如,如果使用舊的,但黃金PHP MySQL擴展:

$uname = mysql_real_escape_string($uname); 
$res = mysql_query("SELECT * FROM users WHERE name = '$uname'"); 

如果$unameshibbir'OR'='-1-',用我寫的功能之後,這將是shibbir\'OR\'=\'-1-\',那就是無法突破查詢。

在這裏閱讀更多:

http://php.net/manual/en/function.mysql-real-escape-string.php
http://www.php.net/manual/en/security.database.sql-injection.php

+0

Thanks @ lorenzo-s – user1161867 2012-01-27 15:55:24

1

最好的方法是使用事先準備好的聲明,請參閱examples here,雖然我通常做一些數據驗證甚至數據是將用於準備好的聲明中。

例如,如果有人註冊,用戶名中只允許某些字符,並且當有人輸入要提取的用戶名時我使用相同的檢查。

0

另一個問題是跨站點腳本攻擊。有幾種處理這種方法,但通常的方法是檢查$ _GET ['uname']是否在數據庫中作爲用戶名存在,然後在html塊中使用它。