mirror of
https://github.com/php/doc-ru.git
synced 2025-07-24 09:59:46 +00:00
251 lines
9.4 KiB
XML
251 lines
9.4 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: e41806c30bf6975e452c0d4ce35ab0984c2fa68c Maintainer: shein Status: ready -->
|
||
<!-- Reviewed: yes -->
|
||
<!-- $Revision$ -->
|
||
<refentry xml:id="function.mysql-real-escape-string" xmlns="http://docbook.org/ns/docbook">
|
||
<refnamediv>
|
||
<refname>mysql_real_escape_string</refname>
|
||
<refpurpose>Экранирует специальные символы в строках для использования в выражениях SQL</refpurpose>
|
||
</refnamediv>
|
||
|
||
<refsynopsisdiv>
|
||
<warning>
|
||
&mysql.alternative.note;
|
||
<simplelist role="alternatives">
|
||
<member><function>mysqli_real_escape_string</function></member>
|
||
<member><methodname>PDO::quote</methodname></member>
|
||
</simplelist>
|
||
</warning>
|
||
</refsynopsisdiv>
|
||
|
||
<refsect1 role="description">
|
||
&reftitle.description;
|
||
<methodsynopsis>
|
||
<type>string</type><methodname>mysql_real_escape_string</methodname>
|
||
<methodparam><type>string</type><parameter>unescaped_string</parameter></methodparam>
|
||
<methodparam choice="opt"><type>resource</type><parameter>link_identifier</parameter><initializer>NULL</initializer></methodparam>
|
||
</methodsynopsis>
|
||
<para>
|
||
Экранирует специальные символы в <parameter>unescaped_string</parameter>,
|
||
принимая во внимание кодировку соединения, таким образом, что результат
|
||
можно безопасно использовать в SQL-запросе в функции <function>mysql_query</function>.
|
||
Если вставляются бинарные данные, то к ним так же необходимо применять эту функцию.
|
||
</para>
|
||
<para>
|
||
<function>mysql_real_escape_string</function> вызывает библиотечную функцию MySQL
|
||
mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам:
|
||
<literal>\x00</literal>, <literal>\n</literal>, <literal>\r</literal>, <literal>\</literal>,
|
||
<literal>'</literal>, <literal>"</literal> и <literal>\x1a</literal>.
|
||
</para>
|
||
<para>
|
||
Эта функция должна всегда (за несколькими исключениями) использоваться для того,
|
||
чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.
|
||
</para>
|
||
|
||
<caution>
|
||
<title>Безопасность: кодировка символов по умолчанию</title>
|
||
<para>
|
||
Кодировка символов должна устанваливаться как на сервере, так и с помощью функции
|
||
<function>mysql_set_charset</function>, чтобы влиять на поведение
|
||
<function>mysql_real_escape_string</function>. Подробнее описано в разделе <link
|
||
linkend="mysqlinfo.concepts.charset">кодировка символов</link>.
|
||
</para>
|
||
</caution>
|
||
</refsect1>
|
||
|
||
<refsect1 role="parameters">
|
||
&reftitle.parameters;
|
||
<para>
|
||
<variablelist>
|
||
<varlistentry>
|
||
<term><parameter>unescaped_string</parameter></term>
|
||
<listitem>
|
||
<para>
|
||
Экранируемая строка.
|
||
</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
&mysql.linkid.description;
|
||
</variablelist>
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="returnvalues">
|
||
&reftitle.returnvalues;
|
||
<para>
|
||
Возвращает строку, в которой экранированы все необходимые символы,
|
||
или &false; в случае ошибки.
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="errors">
|
||
&reftitle.errors;
|
||
<para>
|
||
Запуск этой функции без существующего соединения с MySQL вызовет ошибку уровня
|
||
<constant>E_WARNING</constant>. Данную функцию можно запускать только если есть
|
||
соединение с MySQL.
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="examples">
|
||
&reftitle.examples;
|
||
<para>
|
||
<example>
|
||
<title>Простой пример использования <function>mysql_real_escape_string</function></title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
// Соединение
|
||
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
|
||
OR die(mysql_error());
|
||
|
||
// Запрос
|
||
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
|
||
mysql_real_escape_string($user),
|
||
mysql_real_escape_string($password));
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Пример использования <function>mysql_real_escape_string</function> без наличия
|
||
соединения</title>
|
||
<para>
|
||
Этот пример показывает, что произойдет, если вызвать эту функцию без наличия
|
||
соединения с MySQL.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
// Коннекта к MySQL нет
|
||
|
||
$lastname = "O'Reilly";
|
||
$_lastname = mysql_real_escape_string($lastname);
|
||
|
||
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";
|
||
|
||
var_dump($_lastname);
|
||
var_dump($query);
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs.similar;
|
||
<screen>
|
||
<![CDATA[
|
||
Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5
|
||
Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5
|
||
|
||
bool(false)
|
||
string(41) "SELECT * FROM actors WHERE last_name = ''"
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
</para>
|
||
<para>
|
||
<example>
|
||
<title>Пример взлома с использованием SQL-инъекции</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
// Мы никак не проверили переменную $_POST['password'],
|
||
// а она может содержать совсем не то, что мы ожидали. Например:
|
||
$_POST['username'] = 'aidan';
|
||
$_POST['password'] = "' OR ''='";
|
||
|
||
// посылаем запрос, чтобы проверить имя и пароль пользователя
|
||
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
|
||
mysql_query($query);
|
||
|
||
// посмотрим, какой запрос будет отправлен в MySQL:
|
||
echo $query;
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
<para>
|
||
Запрос, который будет отправлен в MySQL:
|
||
</para>
|
||
<screen>
|
||
<![CDATA[
|
||
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
|
||
]]>
|
||
</screen>
|
||
<para>
|
||
Это позволит кому угодно войти в систему без пароля.
|
||
</para>
|
||
</example>
|
||
</para>
|
||
</refsect1>
|
||
|
||
<refsect1 role="notes">
|
||
&reftitle.notes;
|
||
<note>
|
||
<para>
|
||
Функцию <function>mysql_real_escape_string</function> можно использовать
|
||
только после того, как установлено соединение с MySQL. В противном
|
||
случае возникнет ошибка уровня <constant>E_WARNING</constant>, а функция
|
||
возвратит &false;. Если <parameter>link_identifier</parameter> не указан,
|
||
используется последнее открытое соединение.
|
||
</para>
|
||
</note>
|
||
<note>
|
||
<para>
|
||
Если <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link> включены,
|
||
то сначала данные следует обработать функцией <function>stripslashes</function>.
|
||
Если данную функцию применить к уже проэкранированным данным,
|
||
то данные будут проэкранированы дважды.
|
||
</para>
|
||
</note>
|
||
<note>
|
||
<para>
|
||
Если не пользоваться этой функцией, то запрос становится уязвимым для
|
||
<link linkend="security.database.sql-injection">взлома с помощью SQL-инъекций</link>.
|
||
</para>
|
||
</note>
|
||
<note>
|
||
<simpara>
|
||
<function>mysql_real_escape_string</function> не экранирует символы
|
||
<literal>%</literal> и <literal>_</literal>. Эти знаки являются масками
|
||
групп символов в операторах MySQL <literal>LIKE</literal>,
|
||
<literal>GRANT</literal> и <literal>REVOKE</literal>.
|
||
</simpara>
|
||
</note>
|
||
</refsect1>
|
||
|
||
<refsect1 role="seealso">
|
||
&reftitle.seealso;
|
||
<para>
|
||
<simplelist>
|
||
<member><function>mysql_set_charset</function></member>
|
||
<member><function>mysql_client_encoding</function></member>
|
||
<member><function>addslashes</function></member>
|
||
<member><function>stripslashes</function></member>
|
||
<member>Директива <link linkend="ini.magic-quotes-gpc">magic_quotes_gpc</link></member>
|
||
<member>Директива <link linkend="ini.magic-quotes-runtime">magic_quotes_runtime</link></member>
|
||
</simplelist>
|
||
</para>
|
||
</refsect1>
|
||
</refentry>
|
||
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|