Можно ли заменять в SQL запросе ' на "?

Добрый день, у меня есть приложение, которое работает как с mysql, так и с mssql.

Для того, чтобы обезопасить его от всякой проказы я использую три ф-ции:

<?php
	
	// DATA VALIDATION
	
	function xss_clean($data){

		// Fix &entity\n;
		$data = str_replace(array('&amp;','&lt;','&gt;'), array('&amp;amp;','&amp;lt;','&amp;gt;'), $data);
		$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
		$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
		$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');

		// Remove any attribute starting with "on" or xmlns
		$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);

		// Remove javascript: and vbscript: protocols
		$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
		$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
		$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);

		// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
		$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
		$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
		$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);

		// Remove namespaced elements (we do not need them)
		$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);

		do{
			// Remove really unwanted tags
			$old_data = $data;
			$data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
		}while ($old_data !== $data);

		// we are done...
		return $data;
	
	}
	
	function slinj($input_text){
		$input_text = str_replace("'", "\"", $input_text);
		$input_text = iconv("UTF-8//IGNORE","WINDOWS-1251//IGNORE", htmlspecialchars(iconv("WINDOWS-1251//IGNORE","UTF-8//IGNORE", $input_text)));
		$input_text = mysql_real_escape_string($input_text);
		return $input_text;
	}
	
	function xss($input_text){
		$input_text = iconv("UTF-8//IGNORE","WINDOWS-1251//IGNORE", htmlspecialchars(iconv("WINDOWS-1251//IGNORE","UTF-8//IGNORE", $input_text)));
		$input_text = iconv("UTF-8//IGNORE","WINDOWS-1251//IGNORE", xss_clean(iconv("WINDOWS-1251//IGNORE","UTF-8//IGNORE", $input_text)));
		//$input_text = xss_clean($input_text);
		return $input_text;
	}
	
?>


Изначально вторая была без $input_text = str_replace("'", "\"", $input_text); и для mysql все работало отлично, но mssql выдовало ошибку, потом я добавил эту замену кавычек, можно ли так делать? Спс)
  • Вопрос задан
  • 363 просмотра
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Эти функции - какой-то ужас, летящий на крыльях ночи. mysql_real_escape_string - вообще за гранью добра и зла.

Но главное, что я не могу понять - это какое отношение к mysql и mssql имеет функция xss_clean. Ну то есть я даже представить себе не могу, как можно функцию для защиты от xss применять для любых манипуляций c SQL. Это - я не знаю - как положить деньги в презерватив от грабителей. Он же служит для безопасности. Ну вот деньги и будут в безопасности.

По теме: ради всего святого, используйте PDO с подготовленными выражениями. Это сделает ненужной всю эту мышиную возню с регулярками. PDO поддерживает как mysql, так и mssql, так что разница будет только в синтаксисе запросов, а сам код работы с запросами будет один и тот же

$sql = "SELECT TOP 10 * FROM user where mssql.department_id=?";  
$stmt = $conn->prepare($sql);  
$stmt->execute([$_GET['department_id']]); 
$users = $stmt->fetchAll();

$sql = "SELECT * FROM user where mysql.department_id=? LIMIT 10";  
$stmt = $conn->prepare($sql);  
$stmt->execute([$_GET['department_id']]); 
$users = $stmt->fetchAll();


Как можно заметить, в запросах нет ни одной кавычки вообще, что делает сам вопрос про замену бессмысленным.

От XSS же надо защищаться совсем в другом месте, и также без всего этого ужаса
Ответ написан
Acuna
@Acuna
Заполнил свой профиль
В плане самого вопроса - можно, почему нет, у меня все работает годами без проблем, другой вопрос что на определенном этапе проект разрастется до того, что нужно будет переходить на PostgreSQL, там западло и начнется, так как она принимает только одиночные кавычки, так что лучше изначально использовать одиночные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы