تالار گفتمان nCIS.ir

نسخه‌ی کامل: چطور آدرسم رو کوتاه کنم؟
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.

ABZiko

سلام، بنده برای هر محصولم نیاز به یک آدرس دارم مثل :
http://www.dribbble.net?id=30
از طرفی شنیدم که این آدرس ها مطئن نیستند و باعث هک شدنش می شن، حالا باید چی کار کنم؟
خیر این آدرسها باعث هم نمیشن به خودی خود. البته اگه اصول امنیتی رو رعایت کنید. مثلاً اگه id عددی هست، به این شکل باهاش توی کد کار کنید:
$id = (isset($_GET['id'] ? intval($_GET['id']), 0);
اینطوری مطمئن خواهید بود که id$ همیشه یک عدد هست و میتونید بدون نگرانی درمورد SQL Injection ازش توی کوئریها استفاده کنید. اگه با PDO و به روش Prepared Statements و با Bind Parameters کار کنید هم که دیگه مشکلی ازنظر امنیت نخواهد بود و خودش Escape میکنه.
شما اگه با دستور intval مقدار id رو ارزیابی کنید و هنگام انتخاب از دیتابیس از prepared statements استفاده کنید مشکل امنیتی خاصی نخواهید داشت
برای کوتاه کردن آدرس هم نیاز به htaccess. دارین. یک فایل به این شکل با نام htaccess. توی پوشه ریشه سایتتون بسازین:
کد:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (\d+)$ index.php?id=$1 [L,NC,QSA]

اگه روی لوکال هاست کار میکنید و سایتتون توی یک پوشه فرعی داخل ریشه سایت هست، باید به این شکل انجام بدین:
کد:
Options +FollowSymlinks
RewriteEngine On
RewriteBase /folderName
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (\d+)$ index.php?id=$1 [L,NC,QSA]

و بجای folderName اسم پوشه سایتتون رو بگذارین. حالا میتونید از لینکهایی به این شکل استفاده کنید:
http://www.dribble.com/30

و سیستم خودش این آدرس رو اجرا میکنه (بدون اطلاع و نمایش به کاربر) :
http://www.dribble.com/index.php?id=30

نکته 1: باید توی تنظیمات Apache قابلیت mod_rewrite رو فعال کرده باشین.
نکته 2: وظیفه قراردادن لینکهای کوتاه شده توی سایت بعهده شماست و این روش، لینکها رو کوتاه نمیکنه بلکه به شما فقط اجازه استفاده از لینکهای کوتاه رو میده و به سرور میگه هروقت لینک کوتاه با ساختاری که گفتم رو دیدی، اون لینک بلندی که جلوش توضیح دادم رو اجرا کن.
خوبی اینجور آدرس دهی ها اینه که seo پسند هست.ونقش مهمی توی seo داره

ABZiko

(02-03-1394، 02:22 ب.ظ)Mohammadsgh نوشته: [ -> ]خوبی اینجور آدرس دهی ها اینه که seo پسند هست.ونقش مهمی توی seo داره

همین آدرس هایی که مثل ?id=20 نوشته می شن، SEO پسند هستن؟

ABZiko

(02-03-1394، 01:40 ب.ظ)ADMIN نوشته: [ -> ]خیر این آدرسها باعث هم نمیشن به خودی خود. البته اگه اصول امنیتی رو رعایت کنید. مثلاً اگه id عددی هست، به این شکل باهاش توی کد کار کنید:


$id = (isset($_GET['id'] ? intval($_GET['id']), 0);
اینطوری مطمئن خواهید بود که id$ همیشه یک عدد هست و میتونید بدون نگرانی درمورد SQL Injection ازش توی کوئریها استفاده کنید. اگه با PDO و به روش Prepared Statements و با Bind Parameters کار کنید هم که دیگه مشکلی ازنظر امنیت نخواهد بود و خودش Escape میکنه.

درسته، من والا از intval استفاده نکردم ولی از PDO استفاده می کنم، ممنون ... فقط فرق این بخش کد های PDO با اون Prepare Statement چیه؟


<?php
    define('PDO_DSN','mysql:host=localhost;dbname=dribbble');
    define('DB_User','root');
    define('DB_Pass','');

	class Database
	  { 
         private static $handler;
		
		 private static function getHandler(){
			if(!isset(self::$handler)){ 
				try{
					self::$handler=new PDO(PDO_DSN,DB_User,DB_Pass);}
					
                catch(PDOException $e){
					trigger_error('Error: Please Call Your Admin : '.$e->getMessage(), E_USER_ERROR);}}
			 
				return self::$handler;}
				
         private static function close(){
			self::$handler=null;}
			
         public static function Execute($query){
			try{
				$connection=self::gethandler();
				$sqlStatement=$connection->query($query);
 				return true;}
				  
			catch( PDOException $pe){
				self::close();
				trigger_error($pe-getMessage(),E_USER_ERROR);//E_USER_ERROR 
				return false;}}
				
 	     public static function FetchAll($query){
			try{
				$handler=self::getHandler();
				$result=$handler->query($query);
 				return $result->fetchAll(PDO::FETCH_ASSOC);}
				
			catch(PDOEception $pe){
				self::close();
				trigger_error($pe-getMessage());//E_USER_ERROR 
				return false;}}
				
	     public static function FetchOne($query){
			try{
				$handler=self::getHandler();
				$result=$handler->query($query);
 				return $result->fetch(PDO::FETCH_ASSOC);}
				
			catch(PDOEception $pe){
				self::close();
				trigger_error($pe->getMessage());//E_USER_ERROR 
				return false;}}
				
	     public static function FetchFiled($query){
			   $connection=self::gethandler();
			   $sqlstatement=$connection->query($query);
			   $result=$sqlstatement->fetch(PDO::FETCH_NUM)	;
               return  $result=$result[0];}}
?>
نقل قول: همین آدرس هایی که مثل ?id=20 نوشته می شن، SEO پسند هستن؟
خیر. آدرسهایی که به این شکل هستند
site.com/aaa/bbb
یا
site.com/محصول-یک

کلاسی که قرار دادید اصلا از prepared statements استفاده نکرده به این لینک نگاه کنید به مثال PDO آن دقت کنید باید مقادیر را خارج از دستور SQL به آن Bind کنید
http://www.w3schools.com/php/php_mysql_p...ements.asp

ABZiko

تشکر از دوستان، این کد رو من نوشتم ولی کار نمی کنه :
$id = (isset($_GET['id'] ? intval($_GET['id']), 0); 

این ارور رو می ده :
کد:
( ! ) Parse error: syntax error, unexpected '?', expecting ',' or ')' in D:\Wamp\www\dribbble\DashBoard.php on line 5

مشکل از چیه؟
خب غلط نوشتین باید به این صورت بنویسید
$id = (isset($_GET['id']) ? intval($_GET['id']) : 0;

پ.ن. ادیتور فروم هیچی نداره واسه همین کدهارو اینجوری گزاشتم
(03-03-1394، 10:07 ب.ظ)hamo نوشته: [ -> ]پ.ن. ادیتور فروم هیچی نداره واسه همین کدهارو اینجوری گزاشتم

برای مشاهده ادیتور کامل، روی دکمه «پاسخ جدید» در پایین صفحه کلیک کنید و از ادیتور پاسخ سریع استفاده نکنید. اونجا میتونید کد PHP درج کنید.