parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Вопрос по ^taint

TLoD,Snake 06.12.2006 18:47

@process_hobby[hobby_txt][hobbys;words;hobby;hid;hobby_html]
$hobby_html[]
^void:sql{DELETE FROM user_hobby WHERE uid=^user.id.int[]}
$hobbys[^hobby_txt.split[,;v]]
$result[
	^hobbys.menu{
		$words[	^hobbys.piece.split[ ;v] ]
		$hobby[^words.menu{^words.piece.trim[]}[ ]]
		^if(^hobby.length[] < 256 && ^hobby.match[^^[\w\-]+^$]){
			<a href="/userlist.html?act=search&hobby=^taint[uri][$hobby]">$hobby</a>
			$hid(^int:sql{SELECT id FROM hobby WHERE name='^taint[sql][$hobby]'}[$.default(0)])
			^if(!$hid){
				^void:sql{INSERT INTO hobby (name) VALUES('^taint[sql][$hobby]')}
				$hid(^int:sql{SELECT LAST_INSERT_ID() FROM hobby}[$.default(0) $.limit(1)])
			}
			^void:sql{INSERT INTO user_hobby (uid, hid) VALUES(^user.id.int[], $hid)}
		}{
			^taint[html][$hobby]
		}
	}[, ]
]
В переменной $result получаем то что надо, плохие куски запачканы как html, наши ссылки чистые. Но, если дальше пихнуть это в SQL
@update[param][set]
^if($user){
	^if(def $param.hobby){
		^dbconnect{
			$param.hobby_html[^process_hobby[$param.hobby]]
		}
	}
	$set[^param.foreach[key;value]{^if($value is string || !def $value){$key='^taint[sql][$value]'}{$key=$value}}[, ]]
	^MAIN:dbconnect{
		^void:sql{UPDATE user SET $set WHERE id=$user.id}
	}
	$result(1)
}
то все счастье исчезает, так как код метится, как sql ^taint[sql][$value], но если это убрать, то при присутствии в тексте одинарной кавычки SQL запрос рушится.
Как бы форсировать замену до ^taint[sql] ?