2013-01-13 31 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