Я не уверен на 100%, но я бы сказал, что он все еще кажется мне уязвимым - тот факт, что он принимает одинарную кавычку (') в качестве разделителя и затем генерирует ошибку из последующего введенного кода, говорит мне, что он передает вещи, которые он не должен на MySQL.
Любые данные, которые возможно могут быть взяты откуда-то, кроме самого вашего приложения, должны сначала пройти mysql_real_escape_string () . Таким образом вся часть ' or 1=1
передается в качестве значения в MySQL ... если только вы не передаете "sc" прямо для порядка сортировки, например
$sql = "SELECT * FROM foo WHERE page='{$_REQUEST['page']}' ORDER BY data {$_REQUEST['sc']}";
... что вы тоже не должны делать. Попробуйте что-то вроде этого:
$page = mysql_real_escape_string($_REQUEST['page']);
if ($_REQUEST['sc'] == "desc")
$sortorder = "DESC";
else
$sortorder = "ASC";
$sql = "SELECT * FROM foo WHERE page='{$page}' ORDER BY data {$sortorder}";
Я до сих пор не могу сказать, что он ПОЛНОСТЬЮ защищен от инъекций, но он определенно более устойчив.