2012-02-24 3 views
0

Я использую этот код для получения данных из запроса mysql.Ampersand and hash crash my MYSQL Query

if ($filter == "All" && $filter != "") {date_default_timezone_set('America/Denver'); 
$todays123 = date("Y-m-d H:i"); 
$query = "SELECT * FROM events WHERE events.name LIKE '%".$search."%' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."'"; 
}else{ $todays123 = date("Y-m-d H:i"); 
$query = "SELECT * FROM events WHERE events.name LIKE '%".$search."%' AND events.price = '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."' OR events.description LIKE '%".$search."%' AND events.price = '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."' OR events.user = '".$_SESSION['username']."' AND events.address LIKE '%".$search."%' AND events.price = '".$filter."' AND events.end > '".$todays123."' "; 
} 

Вот мой код Javascript

function user_display() { 

var search = document.getElementById("search").value; 

if (search == "" || search == null) { 
    search=""; 
} 

var filter = document.getElementById("filter").value; 

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
} else {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 

xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
     document.getElementById("table-content").innerHTML=xmlhttp.responseText;    
    } 
} 
    xmlhttp.open("GET","./xxx.php?action=display&search="+search+"&filter="+filter, true); 
xmlhttp.send(); 

}

Это соответствует правильно, когда значение поиска не содержит "&" и "#". Когда я ввожу символ амперсанда или хэша, запрос падает и ничего не отображает.

Любые предложения о том, почему это делается? Заранее спасибо

+0

Это работает, если вы используете другую часть имени события, исключая хэш? Убедитесь, что это не один из других параметров, из-за которых он не появляется. – jprofitt

+0

@DavidEugenePeterson Я имел в виду, что сказал, что у вас есть событие «# 1 событие», не ищет ли поиск «1» или «событие» при поиске «# 1»? – jprofitt

+0

@jprofitt да, это правильно –

ответ

3

Возможно, вы используете encodeURIComponent() в своем JavaScript. Вероятно, вы не получаете результатов, потому что они не пропускают ничего в переменной поиска (или сокращают ее). Рассмотрим, если поиск «a & foo = c &». URL вы запрашиваете теперь xxx.php?action=display&search=a&foo=c&filter=..., так что вы в конечном итоге с другой переменной GET по имени foo

var search = encodeURIComponent(document.getElementById("search").value); 

Сделайте то же самое для filter, если это то, что пользователь будет поставлять.

+2

Это решение. Причина '#' не будет работать, так это то, что серверы не интерпретируют URL [идентификаторы фрагментов] (http://en.wikipedia.org/wiki/Fragment_identifier) ​​(т. Е. 'Xxx.php? Search = # 1') – Phil

0

изменить код, чтобы по крайней мере выглядеть следующим образом

$search = mysql_real_escape_string($search); 
$filter = mysql_real_escape_string($filter); 
// hopefully username in $_SESSION is clean else repeat above for that and rerun your query 
if ($filter == "All" && $filter != "") {date_default_timezone_set('America/Denver'); 
$todays123 = date("Y-m-d H:i"); 
$query = "SELECT * FROM events WHERE events.name LIKE '%".$search."%' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."'"; 
}else{ $todays123 = date("Y-m-d H:i"); 
$query = "SELECT * FROM events WHERE events.name LIKE '%".$search."%' AND events.price = '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."' OR events.description LIKE '%".$search."%' AND events.price = '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."' OR events.user = '".$_SESSION['username']."' AND events.address LIKE '%".$search."%' AND events.price = '".$filter."' AND events.end > '".$todays123."' "; 
    } 

Вышеприведенных изменения будет по крайней мере убедиться, что SQL инъекцию можно избежать.

+1

Просьба не рекомендовать экранирование параметров SQL. Связывание параметров намного превосходит – Phil

+0

@phil, если вы перечитаете мой ответ, он говорит: «Измените свой код, чтобы по крайней мере выглядеть так», поэтому «atleast» является ключевым словом в моем ответе. Я не рекомендую это, но пытаюсь по крайней мере очистить этот код. Я всегда использую привязку и также рекомендую ее. Но, учитывая первый код, я должен буду сказать, что было предоставлено очень мало информации, и это в то время 3 часа назад могло быть лучшим ответом –