Защита при GET

bganonymous

Registered
Файлът news.php?id=X показва новини, където X е ID-то на новината. Установих че ако напиша news.php?id=1asd пак ще покаже новина с ID 1. Въпросът е как да се защитя напълно?
 
Като използваш mysqli драйвер и примерно:

http://php.net/manual/en/mysqli.real-escape-string.php

като за начинаещи е идеално,а ако си напреднал чети за prepared statements.
 
bganonymous каза:
Файлът news.php?id=X показва новини, където X е ID-то на новината. Установих че ако напиша news.php?id=1asd пак ще покаже новина с ID 1. Въпросът е как да се защитя напълно?

Дай си кода :)
 
dakata__92 каза:
bganonymous каза:
Файлът news.php?id=X показва новини, където X е ID-то на новината. Установих че ако напиша news.php?id=1asd пак ще покаже новина с ID 1. Въпросът е как да се защитя напълно?

Дай си кода :)
Код:
$get_id = (int) $_GET["id"];

if(!isset($get_id) or !is_numeric($get_id) or $get_id < 1) { header("Location: index.php"); exit(); }

else {

$get_news_information = mysql_query("SELECT * FROM `news` WHERE `id` = '$get_id'");

if(mysql_num_rows($get_news_information) == 0) { header("Location: index.php"); exit(); }

else {
 
Кода (news.php?id=1asd), който си подал минава през системата защото вероятно го приема в 16-тична бройна система. Уморен съм и не съм се заглеждал но в краен случай ако и това не проработи един regex ще свърши работа. Или пробвай добавяйки и :
http://php.net/manual/en/function.ctype-digit.php
към иф проверката.

PHP:
$get_id = (int) trim($_GET["id"]);
if($get_id and is_numeric($get_id) and $get_id < 1){
	$get_news_information = mysql_query("SELECT * FROM `news` WHERE `id` = '$get_id'");
	if(mysql_num_rows($get_news_information) == 0) { header("Location: index.php"); exit(); }

}else{
	header("Location: index.php"); 
	exit();
}
 
Използването на (int) ти дава във всеки случай цяло число, с оглед на което си защитен. Ако не искаш да допускаш невалидни стойности можеш да направиш проверка от вида if($_GET['id'] != (int) $_GET['id']) или за най-лесно regex \d
 
Както вече са ти споменали - реда $get_id = (int) $_GET["id"]; ти предоставя доста добра защита, макар и по кофти метод. За по-добър стил, ползвай mysqli или pdo (модула mysql е деприкейтнат, следва пълното му премахване) и prepared statements. Другото, което може да внедриш са филтрите за POST и GET.
 

Back
Горе