2013-01-13 57 views
0

可能重複:
「slash before every quote」 problem逃脫INSERT語句之前數組值在每個循環

我有一個奇怪的情況:我的代碼工作在本地計算機上時,在本地主機,但時我發佈它在Web服務器上的行爲有所不同。

我有一個複選框沿着他們的學生列表,以便用戶可以選擇複選框,並在點擊刪除按鈕後,那些從列表中刪除,這意味着我將它們插入到不同的表中。

注:studentid是一個像斜線KNC/2012/SEM1/BSC/125

現在我的JavaScript功能,使得Ajax請求併發送該值作爲參數向我的PHP文件,該文件經過所述陣列並使用foreach循環插入它們。

javascript代碼:

function flagRemovedStudents(iar){ 
displayBox = document.getElementById("studentBox"); 
elements = document.getElementsByName('stids[]'); 
data = []; 
for (i = 0; i < elements.length; i++){ 
if (elements[i].checked){ 
    data.push('stids[]='+encodeURIComponent(elements[i].value)); 
} 
} 
params = "iars="+encodeURIComponent(iar)+"&fl="+encodeURIComponent(1)+"&"+data.join('&'); 
alert(params); // just to check what values are being passed to php script 
if (window.XMLHttpRequest) 
{ 
xmlhttp=new XMLHttpRequest(); 
} 
else 
{ 
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xmlhttp.onreadystatechange=function() 
{ 
if (xmlhttp.readyState==4 && xmlhttp.status==200) 
{ 
result = xmlhttp.responseText; 
alert(result); 
displayBox.className = "dimBox"; 
setTimeout(function(){showStudentsAfterRemoval(iar);},200); 
} 
} 
xmlhttp.open("POST","remst.php",true); 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xmlhttp.send(params); 
} 

現在我的PHP工作原理:

$session = $_SESSION['sess']; 
$iarsid = mysql_real_escape_string($_POST['iars']); 
$studentid = $_POST['stids']; 
$num = 0; 

foreach ($studentid as $value) { 
$val = mysql_real_escape_string($value); 
$q1 = "insert into removedstudents(sessionid,iarsid,studentid)  values('$session','$iarsid','$value')"; 
$r1 = mysql_query($q1) or die(mysql_error()); 
if(mysql_affected_rows() > 0){ 
$num = $num + 1; 
} 
    } 
echo $num." student(s) have been removed from the responsibility."; 

問題是,在Web服務器上的studentid被插入爲KNC\/2012\/sem1\/BSC\/125這是影響我的進一步查詢。

令人驚訝的是,它被插入到本地主機所需的格式,即我的開發環境中,但是當我將相同的代碼放到網絡服務器上時,它會以某種方式表現出奇怪的行爲。 請幫忙。

+0

那麼,studentid的插入方式與您給出的第一個示例完全相同?這是一個什麼問題? – mario

+0

@mario ohh不,這個網站也逃過了我插入的studentid。它就像KNC然後反斜槓,然後正斜槓然後2012年然後再斜槓等等... – coder101

回答

0

mysql_real_escape_string將通過設計完成此操作(請參閱the docs)。

在這種特殊情況下,您最好使用正則表達式在php中驗證ID的格式,然後不要在數據庫中轉義它。顯然你需要非常小心,不要通過這樣做來打開安全漏洞。

mysql_ *函數現在也被棄用了,所以你也應該考慮使用mysqli_ *。

+0

謝謝但@mario上面提示它是一個魔術引號的問題,所以我用代碼'if(get_magic_quotes_gpc()) { $ your_text = stripslashes($ your_text); '它工作。 – coder101

+0

而我發送到PHP之前通過JavaScript編碼輸入,所以你認爲我在做什麼好嗎?我認爲這不會打開一個安全漏洞, – coder101

+0

馬里奧的建議是更好的,應該更安全,所以去那。但是,無論你使用javascript中的值做什麼都不相關,因爲攻擊者會創建自己的程序來向你的頁面發送請求。所以你應該真正驗證php代碼中的值。安全編碼的基本規則是不相信任何輸入,即使您認爲您是唯一調用該代碼的人。 – Rhumborl