پاسخ : کد فیلتــــر . . .
از دوستان که کد دادند خواهش دارم در کد خودشان @ را ف ی ل ت ر نمایند تا کاربر هنگام تایید ، @ اجــرا نشود . . . و در فایل زید به صورت صحیح قرار دهند تا کار بکند . . .
با تشکر :
کد PHP:
<?php
require( ".".DIRECTORY_SEPARATOR."app".DIRECTORY_SEPARATOR."boot.php" );
require_once( MODEL_PATH."msg.php" );
class GPage extends securegamepage
{
var $showList = NULL;
var $selectedTabIndex = NULL;
var $errorText = NULL;
var $receiver = NULL;
var $subject = NULL;
var $body = NULL;
var $messageDate = NULL;
var $messageTime = NULL;
var $showFriendPane = NULL;
var $friendsList = NULL;
var $viewOnly = NULL;
var $isInbox = NULL;
var $sendMail = NULL;
var $dataList = NULL;
var $pageSize = 10;
var $pageCount = NULL;
var $pageIndex = NULL;
var $seckeyB = NULL;
var $time = 0;
var $seckey;
public function GPage( )
{
parent::securegamepage( );
$this->viewFile = "msg.phtml";
$this->contentCssClass = "messages";
}
public function load( )
{
parent::load( );
$this->pageSize = $this->data['active_plus_account'] ? $this->data['per_page'] : 10;
mysql_connect($this->appConfig['db']['host'],$this->appConfig['db']['user'],$this->appConfig['db']['password']);
mysql_select_db($this->appConfig['db']['database']);
$q = mysql_query("SELECT last_msg from p_players where id='{$this->player->playerId}'");
$q = mysql_fetch_array($q);
$this->time = $q['last_msg'];
@$this->seckeyB = $_SESSION['security'];
$this->sendMail = TRUE;
$this->isInbox = TRUE;
$this->viewOnly = FALSE;
$this->showFriendPane = FALSE;
$this->errorText = "";
$this->showList = !( isset( $_GET['t'] ) && is_numeric( $_GET['t'] ) && intval( $_GET['t'] ) == 1 );
$this->selectedTabIndex = isset( $_GET['t'] ) && is_numeric( $_GET['t'] ) && 1 <= intval( $_GET['t'] ) && intval( $_GET['t'] ) <= 2 ? intval( $_GET['t'] ) : 0;
$this->friendList = array( );
$friends_player_ids = trim( $this->data['friend_players'] );
if ( $friends_player_ids != "" )
{
$friends_player_ids = explode( "\n", $friends_player_ids );
foreach ( $friends_player_ids as $friend )
{
list( $playerId, $playerName ) = explode( " ", $friend );
$this->friendList[$playerId] = $playerName;
}
}
$m = new MessageModel( );
if ( !$this->isPost( ) )
{
if ( isset( $_GET['uid'] ) && is_numeric( $_GET['uid'] ) && 0 < intval( $_GET['uid'] ) )
{
$this->receiver = $m->getPlayerNameById( intval( $_GET['uid'] ) );
$this->showList = FALSE;
$this->selectedTabIndex = 1;
}
else if ( isset( $_GET['id'] ) && is_numeric( $_GET['id'] ) && 0 < intval( $_GET['id'] ) )
{
$result = $m->getMessage( $this->player->playerId, intval( $_GET['id'] ) );
if ( $result->next( ) )
{
$this->viewOnly = TRUE;
$this->showList = FALSE;
$this->isInbox = $result->row['to_player_id'] == $this->player->playerId;
$this->sendMail = !$this->isInbox;
$this->receiver = $this->isInbox ? $result->row['from_player_name'] : $result->row['to_player_name'];
$this->subject = $result->row['msg_title'];
$this->body = $this->getFilteredText( $result->row['msg_body'] );
$this->messageDate = $result->row['mdate'];
$this->messageTime = $result->row['mtime'];
$this->selectedTabIndex = $this->isInbox ? 0 : 2;
if ( $this->isInbox && !$result->row['is_readed'] && !$this->player->isSpy )
{
$m->markMessageAsReaded( $this->player->playerId, intval( $_GET['id'] ) );
--$this->data['new_mail_count'];
}
}
else
{
$this->showList = TRUE;
$this->selectedTabIndex = 0;
}
$result->free( );
}
}
else if ( isset( $_POST['sm'] ))
{
$this->receiver = trim( $_POST['an'] );
$this->subject = trim( $_POST['be'] );
$this->seckey = trim($_POST['seckey']);
$this->body = $_POST['message'];
if ( trim( $this->receiver ) == "" )
{
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->errorText = messages_p_noreceiver."<p></p>";
$m->dispose( );
} else if($this->message_ban == 1 && strtolower ( trim( $this->receiver ) ) != 'admin'){
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->errorText = msg_blocked."<p></p>";
$m->dispose( );
}
else
{
if ( trim( $this->body ) == "" )
{
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->errorText = messages_p_nobody."<p></p>";
$m->dispose( );
} elseif(empty($this->seckey)){
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->errorText = messages_p_secempty."<p></p>";
$m->dispose( );
}
elseif($this->seckey != $this->seckeyB){
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->errorText = messages_p_sec."<p></p>";
$m->dispose( );
}
else
{
if ( strtolower( trim( $this->receiver ) ) == "[sendtomem]" && 0 < intval( $this->data['alliance_id'] ) && $this->hasAllianceSendMessageRole( ) )
{
$pids = trim( $m->getAlliancePlayersId( intval( $this->data['alliance_id'] ) ) );
if ( $pids != "" )
{
if ( $this->subject == "" || preg_match( "/[>,\\. \\n\\r\\t\\s]+/", $this->subject ) || preg_match( "/[<,\\. \\n\\r\\t\\s]+/", $this->subject ))
{
$this->subject = messages_p_emptysub;
}
$arr = explode( ",", $pids );
foreach ( $arr as $apid )
{
if ( $apid == $this->player->playerId )
{
continue;
}
if($this->message_ban == 0 & $this->time < time()){
$time = time()+(1*60);
mysql_query("UPDATE p_players SET `last_msg`='$time' WHERE `id`='{$this->player->playerId}'");
$m->sendMessage( $this->player->playerId, $this->data['name'], $apid, $m->getPlayerNameById( $apid ), $this->subject, $this->body );
}
}
$this->showList = TRUE;
$this->selectedTabIndex = 2;
}
}
else
{
$receiverPlayerId = $m->getPlayerIdByName( $this->receiver );
if ( 0 < intval( $receiverPlayerId ) )
{
if ( $receiverPlayerId == $this->player->playerId )
{
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->errorText = "<b>".messages_p_noloopback."</b><p></p>";
}
else
{
if ( $this->subject == "" || preg_match( "/[>,\\. \\n\\r\\t\\s]+/", $this->subject ) || preg_match( "/[<,\\. \\n\\r\\t\\s]+/", $this->subject ))
{
$this->subject = messages_p_emptysub;
}
if($this->message_ban == 0 & $this->time < time()){
$time = time()+(0.5*60);
mysql_query("UPDATE p_players SET `last_msg`='$time' WHERE `id`='{$this->player->playerId}'");
$m->sendMessage( $this->player->playerId, $this->data['name'], $receiverPlayerId, $this->receiver, $this->subject, $this->body );
}
$this->showList = TRUE;
$this->selectedTabIndex = 2;
}
}
else
{
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->errorText = messages_p_notexists." <b>".$this->receiver."</b><p></p>";
}
}
}
}
}
else if ( isset( $_POST['fm'] ) )
{
$this->receiver = trim( $_POST['an'] );
$this->subject = trim( $_POST['be'] );
$this->body = $_POST['message'];
$this->showList = FALSE;
$this->selectedTabIndex = 1;
$this->showFriendPane = TRUE;
if ( $_POST['fm'] != "" && is_numeric( $_POST['fm'] ) )
{
$playerId = intval( $_POST['fm'] );
if ( 0 < $playerId && isset( $this->friendList[$playerId] ) )
{
unset( $this->friendList[$playerId] );
}
}
else if ( isset( $_POST['mfriends'] ) )
{
foreach ( $_POST['mfriends'] as $friendName )
{
$friendName = trim( $friendName );
if ( $friendName == "" )
{
continue;
}
$playerId = intval( $m->getPlayerIdByName( $friendName ) );
if ( 0 < $playerId && !isset( $this->friendList[$playerId] ) && $playerId != $this->player->playerId )
{
$this->friendList[$playerId] = $friendName;
}
}
}
$friends = "";
foreach ( $this->friendList as $k => $v )
{
if ( $friends != "" )
{
$friends .= "\n";
}
$friends .= $k." ".$v;
}
$m->saveFriendList( $this->player->playerId, $friends );
}
else if ( isset( $_POST['rm'] ) )
{
$this->receiver = trim( $_POST['an'] );
$this->subject = trim( $_POST['be'] );
$this->body = PHP_EOL.PHP_EOL."_________________________________".PHP_EOL.text_from_lang." ".$this->receiver.":".PHP_EOL.PHP_EOL.$_POST['message'];
preg_match( "/^(RE)\\^?([0-9]*):([\\w\\W]*)\$/", $this->subject, $matches );
if ( sizeof( $matches ) == 4 )
{
$this->subject = ( "RE^".( $matches[2] + 1 ) ).":".$matches[3];
}
else
{
$this->subject = "RE: ".$this->subject;
}
$this->showList = FALSE;
$this->selectedTabIndex = 1;
}
else if ( isset( $_POST['dm'] ) && isset( $_POST['dm'] ) )
{
foreach ( $_POST['dm'] as $messageId )
{
if ( $m->deleteMessage( $this->player->playerId, $messageId ) )
{
--$this->data['new_mail_count'];
}
}
}
if ( $this->showList )
{
$rowsCount = $m->getMessageListCount( $this->player->playerId, $this->selectedTabIndex == 0 );
$this->pageCount = 0 < $rowsCount ? ceil( $rowsCount / $this->pageSize ) : 1;
$this->pageIndex = isset( $_GET['p'] ) && is_numeric( $_GET['p'] ) && intval( $_GET['p'] ) < $this->pageCount ? intval( $_GET['p'] ) : 0;
$this->dataList = $m->getMessageList( $this->player->playerId, $this->selectedTabIndex == 0, $this->pageIndex, $this->pageSize );
if ( 0 < $this->data['new_mail_count'] )
{
$this->data['new_mail_count'] = $m->syncMessages( $this->player->playerId );
}
}
$m->dispose( );
}
public function getFilteredText( $text )
{
require_once( MODEL_PATH."wordsfilter.php" );
$filter = new FilterWordsModel( );
return $filter->FilterWords( $text );
}
public function _hasAllianceRole( $role )
{
$alliance_roles = trim( $this->data['alliance_roles'] );
if ( $alliance_roles == "" )
{
return FALSE;
}
list( $roleNumber, $roleName ) = $alliance_roles;
return $roleNumber & $role;
}
public function hasAllianceSendMessageRole( )
{
return $this->_hasAllianceRole( ALLIANCE_ROLE_SENDMESSAGE );
}
public function preRender( )
{
parent::prerender( );
if ( isset( $_GET['uid'] ) )
{
$this->villagesLinkPostfix .= "&uid=".intval( $_GET['uid'] );
}
if ( isset( $_GET['id'] ) )
{
$this->villagesLinkPostfix .= "&id=".intval( $_GET['id'] );
}
if ( isset( $_GET['p'] ) )
{
$this->villagesLinkPostfix .= "&p=".intval( $_GET['p'] );
}
if ( 0 < $this->selectedTabIndex )
{
$this->villagesLinkPostfix .= "&t=".$this->selectedTabIndex;
}
}
public function getNextLink( )
{
$text = "»";
if ( $this->pageIndex + 1 == $this->pageCount )
{
return $text;
}
$link = "";
if ( 0 < $this->selectedTabIndex )
{
$link .= "t=".$this->selectedTabIndex;
}
if ( $link != "" )
{
$link .= "&";
}
$link .= "p=".( $this->pageIndex + 1 );
$link = "msg.php?".$link;
return "<a href=\"".$link."\">".$text."</a>";
}
public function getPreviousLink( )
{
$text = "«";
if ( $this->pageIndex == 0 )
{
return $text;
}
$link = "";
if ( 0 < $this->selectedTabIndex )
{
$link .= "t=".$this->selectedTabIndex;
}
if ( 1 < $this->pageIndex )
{
if ( $link != "" )
{
$link .= "&";
}
$link .= "p=".( $this->pageIndex - 1 );
}
if ( $link != "" )
{
$link = "?".$link;
}
$link = "msg.php".$link;
return "<a href=\"".$link."\">".$text."</a>";
}
}
$p = new GPage( );
$p->run( );
?>
پاسخ : کد فیلتــــر . . .
ایو خط اول فایل بذار برای همه ورودی ها فــیلتر میکنه
البته هرچی کاربر @ وارد کنه * میزنه ، شما خودت * با هر چی میخای عوض کن مثلا فاصله یا ...
کد PHP:
<?php
function filter($tx) {
$tx = preg_replace('!@!',"*",$tx);
return $tx;
}
$_POST = array_map('filter',$_POST);
$_GET = array_map('filter',$_GET);
?>
پاسخ : کد فیلتــــر . . .
بله قرار دادم عالی بود . . .
حالا یک سوال داشتم خدمتتون ، الان ممکنه یک شخصی بخواهد با زدن < یا > یک باگی را در ورودی وارد نماید و با تایید آن باگ را انجام دهد . . .
اگر از این کد شما استفاده شود ، شخصی که مثلا < را در ورودی وارد کرده است تا باگ بزند ، جلوی باگ زدن گرفته می شود و < کاربردی ندارد ؟! . . .
با تشکر . . .
پاسخ : کد فیلتــــر . . .
نقل قول:
نوشته اصلی توسط
warpro
بله قرار دادم عالی بود . . .
حالا یک سوال داشتم خدمتتون ، الان ممکنه یک شخصی بخواهد با زدن < یا > یک باگی را در ورودی وارد نماید و با تایید آن باگ را انجام دهد . . .
اگر از این کد شما استفاده شود ، شخصی که مثلا < را در ورودی وارد کرده است تا باگ بزند ، جلوی باگ زدن گرفته می شود و < کاربردی ندارد ؟! . . .
با تشکر . . .
متوجه نمیشم ! شما میخاید < و > هم فیلـــتر بشن ؟
پاسخ : کد فیلتــــر . . .
نه عزیز ، بنده دارم میگم اگر کسی مثلا در جایی خواسته بود باگ بزنه یا شلی را با استفاده از دستور < یا > آپلود کند بر روی سرور از طریق فایلی ، ما اگر با کد شما < یا > را ف ی ت ل ر نماییم ، جلوی زدن باگ یا شل گرفته می شدو دیگر و دستور های < یا> اجرا نمی گردد . . .
درست است ؟! . . .
با تشکر . . .
پاسخ : کد فیلتــــر . . .
به این سادگی هم نیست. به طور کلی بهتر هست که متغیر های ورودی از $_GET , $_POST را همیشه sanitize کنیم با ***** های مختلف. دیگه بستگی به منطق برنامه نویسی داره.
اینجا سه مثال از این روند زده که به طور ساده توضیح می دم:
مثال. برنامه ی پی اچ پی ما از ورودی GET یا POST یک ورودی را می خواند و سپس در رابطه با آن ورودی کاری را انجام می دهد. همانطوری که این توضیحی که لینک کردم هم اشاره می کند بهترین کار ***** کردن و sanitize (فارسی ش رو نمی دونم پاکسازی احتمالا یا عفونت زدایی!) در محل استفاده هست. سه سناریو:
$safe_category_name = escapeshellargs($unsafe_category_name);
exec("external_binary -category_name '$safe_category_name'");
در اینجا کد نام یک فولدر یا چیزی شبیه اون هست که به یک برنامهی خارجی خرونده شده. در اینجا چون چیزی رو در شل اجرا کردیم با استفاده از دستور escapeshellargs مطمئن می شیم که چیز بدی به ترمینال پی اچ پی نمی ره!
$safe_category_name = mysql_real_escape_string ($unsafe_category_name);
mysql_query("SELECT * FROM items WHERE category_name = '$safe_category_name'");
در این حالت که عمومیت بیشتری داره چیزی رو از پایگاه داده فرا خوندیم. این جا هم با mysql_real_escape_string مطمئن میشیم که کسی چیز تاجوری رو به کوئری وارد نمی کنه! SQL Injection
$safe_category_name = htmlspecialchars($unsafe_category_name);
echo "<span>$safe_category_name</span>";
در این حالت با استفاده از اون متغیر چیزی رو به مرورگر فرستادیم. چرا این ممکنه خطرناک باشه؟ XSS ! برای اینکه ممکنه ما همین رو یه روزی به دیتابیس بفرستیم و برای کاربری «دیگری» فراخونی کنیم! سپس کد مخرب از طریق سرور ما روی کامپیوتر طرف اجرا می شه از طریق javascript! دنگ!
و به طور کلی همونطور که همیشه رعایت می کنیم: magic_gpc = off همیشه و استفاده نمی کنیم از eval یا include uploaded file
پاسخ : کد فیلتــــر . . .
نه قربـــان ، والا مـــن فقط می خواهم بــدانم ::
ببینـــید ما بازی آنلایــن داریم ، در قســمت پــروفایل بازی ما ، در قسمتــ تعویــض نـــام امپراطـــوری ، اگر در فیلد خالی که جای نوشتن نام جدید است <s> وارد کنیم - امپراطوری شما بی نام می شود و کسی نمی تـــواند به شما حمله کند . . .
حال با این کد وقتــی < یا > یا <s> را ف ی ل ت ر ، جلوگیــری نماییم ازش شخصی که می خواهــد بــاگ بزنــد تا نام خود را بی نام کنـــد ، جای کاراکـــتر هـــای بــاگ * می آیــد و بــاگ اجـــرا نمی گـــردد . . .
درســـت است ؟! . . .
پاسخ : کد فیلتــــر . . .
نقل قول:
نوشته اصلی توسط
warpro
نه قربـــان ، والا مـــن فقط می خواهم بــدانم ::
ببینـــید ما بازی آنلایــن داریم ، در قســمت پــروفایل بازی ما ، در قسمتــ تعویــض نـــام امپراطـــوری ، اگر در فیلد خالی که جای نوشتن نام جدید است <s> وارد کنیم - امپراطوری شما بی نام می شود و کسی نمی تـــواند به شما حمله کند . . .
حال با این کد وقتــی < یا > یا <s> را ف ی ل ت ر ، جلوگیــری نماییم ازش شخصی که می خواهــد بــاگ بزنــد تا نام خود را بی نام کنـــد ، جای کاراکـــتر هـــای بــاگ * می آیــد و بــاگ اجـــرا نمی گـــردد . . .
درســـت است ؟! . . .
بله هر چیزیو که میخاید میتونید فیلـتر کنید و ثبت نمیشه
توی همون قسمت کاراکترای که میخاید فیلـتر بشه با | از هم جدا کنید
این الان @ و < و > فیلـتر میکنه
کد PHP:
<?php
function filter($tx) {
$tx = preg_replace('!@|<|>!',"*",$tx);
return $tx;
}
$_POST = array_map('filter',$_POST);
$_GET = array_map('filter',$_GET);
?>