PDA

Просмотр полной версии : Php и Ajax


skzi
11.01.2007, 16:25
ТО что имеем:
1)Есть Java код, который отправляет строку в файл php и получает md5 код посредствами AJAx

<script type="text/javascript" language="JavaScript"
src="lib/JsHttpRequest.js"></script>
<script type="text/javascript" language="JavaScript">
function doLoad(value) {
// Create new JsHttpRequest object.
var req = new JsHttpRequest();
// Code automatically called on load finishing.
req.onreadystatechange = function() {
if (req.readyState == 4) {
// Write result to page element ($_RESULT become responseJS).
document.getElementById('result').innerHTML =
'<b>MD5("'+req.responseJS.q+'")</b> = ' +
'"' + req.responseJS.md5 + '"<br> ';
// Write debug information too (output become responseText).
document.getElementById('debug').innerHTML = req.responseText;
}
}
// Prepare request object (automatically choose GET or POST).
req.open(null, 'handler.php', true);
// Send data to backend.
req.send( { q: value } );
}
</script>

<form>
Text: <input type="text" name="text">
<input type="button" value="Calculate MD5"
onclick="doLoad(this.form.text.value)">
</form>

<div id="result" style="border:1px solid #000; padding:2px">
Structured results
</div>
<div id="debug" style="border:1px dashed red; padding:2px">
Debug info
</div>

<hr>

2)Есть php код получающий строку и отправляющий md5 строку

<?php
require_once "lib/JsHttpRequest.php";
$JsHttpRequest =& new JsHttpRequest("windows-1251");
$_RESULT = array(
"q" => @$_REQUEST['q'],
"md5" => md5(@$_REQUEST['q']),
);
?>

3)Есть php код, выполняющий авторизацию пользователя из MySQL

<?php
if (isset($_POST['name'])){
//инклудим файл с настройками бд
include('settings.php');
// Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) {
echo( "<P>В настоящий момент сервер базы данных не
доступен, поэтому корректное отображение
страницы невозможно.</P>" );
exit();
}
// Выбираем базу данных
if (! @mysql_select_db($dbname,$dbcnx) ) {
echo( "<P>В настоящий момент база данных не доступна,
поэтому корректное отображение страницы
невозможно.</P>" );
exit();
}
// Формируем и выполняем SQL-запрос для посетителя с
// именем $_POST['name']
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
$nme = mysql_query($query);
if(!$nme)
{
echo mysql_error();
echo "Ошибка выполнения запроса";
exit();
}
// Если запрос вернул результат - производим дальнейшую обработку
if(mysql_num_rows($nme) > 0)
{
// Получаем пароль
$password = mysql_result($nme, 0);
// Сравниваем пароль из базы данных и введённый посетителем
if ($_POST['password'] == $password)
{
// Идентификация прошла успешно - осуществляем
// "вход" посетителя. Для того, чтобы в течении текущей
// сесси посетитель не вводил своё имя пароль повторно -
// передаём их через сессию
if(session_start())
{
$_SESSION['user'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
// Осуществляем автоматический переход на
// страницу index.php чтобы убедится, что
// посетитель "вошёл"
echo "<center><font color='green'>Вход успешно выполнен<br>Переадресация...</font></center> <body onLoad=window.setTimeout(\"location.href='index.php'\",2000)>";
}
}
else
{
echo "<center><font color='red'>Ошибка идентификации: неправильный пароль<br>Переадресация...</font></center> <body onLoad=window.setTimeout(\"location.href='index.php'\",2000)>";
exit();
}
}
// Если в результате запроса не получено ни одной
// строки - посетитель с таким именем не зарегистрирован
else
{
echo "<center><font color='red'>Ошибка идентификации: посетитель не зарегистрирован<br>Переадресация...</font></center> <body onLoad=window.setTimeout(\"location.href='index.php'\",2000)>";
exit();
}
}
?>


То что нужно:
Нужно чтобы Java код(пункт1) отправлял введенные логин и пароль в php код(пункт3), чтобы php код принимающий java скрипт(пункт2) обрабатывал введенные логин и пароль и отправлял обратно результат.

Моё мнение:
1)Нужно переделать java код(пункт1) отправлял данные в виде login:password в phph программу(пункт3)
2)Нужно чтобы php код принимал логин и пароль в виде login:password и разделял логин и пароль на две переменные, например в $login и $password
3)Нужно переписать php функцию(пункт3) выполняющую вход с переменными и чтобы отправлялись данные обратно в java функцию(пукнт1)

Уважаемые форумчане!
Очень срочно нужна ваша помощь...Буду очень благодарен если поможете...Просто сам не могу все реализовать...

DIAgen
11.01.2007, 21:27
Все как оказывается просто сделать!
И так первое что нам нужно, что javascript применял 2 переменые
function doLoad(value1,value2) {
и так далее, отсылаем 2 перемыние скрипту
req.send( { q: value1, q: value2 } );
потом уже в во втором скрипте делаешь операции 2 и 3 скрипта

<?php
require_once "lib/JsHttpRequest.php";
$JsHttpRequest =& new JsHttpRequest("windows-1251");
$login = @$_REQUEST['value1'],
$pass = @$_REQUEST['value2'],

if (isset($login) || isset($pass)){
//инклудим файл с настройками бд
include('settings.php');
// Соединяемся с сервером базы данных
//////////////
...
//////////////
$text='Удача въода or Х'//Текс который будет возращаться пользователю
$_RESULT = array(
"eval" => $text
);
?>

Переписываешь на вот это
document.getElementById('result').innerHTML = req.responseJS.eval;
Вот вроде бы в кратце расказал)))

ЗЫ.Писать не охото полность код!

EXSlim
12.01.2007, 00:27
мда...
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
Сколько ещё надо статей написать о MySQL-Inj.....?


Сплоит->В name вбиваем:
999999 UNION SELECT concat(name,':',password) FROM users INTO OUTFILE '<путь в веб-дыру>'

skzi
12.01.2007, 00:40
Напиши пожалуйста два кода, которые у тебя получились в результате.
Буду очень благодарен

Кстати пункт2 и пункт3 один и тот же файл

skzi
12.01.2007, 00:40
EXSlim
Напиши пожалуйста правильный запрос

EXSlim
12.01.2007, 01:01
Хотя бы так

$name = mysql_real_escape_string($_POST['name']);

$query = "SELECT `password` FROM `users` WHERE `name`='".$name."'";

но в идеале не слудует разрешать регистрировать имя содержащее спец символы, а только буквы, 0-9, нижнее подчёркивание и проверять потом это

if (!preg_match("/^[A-Za-z0-9_]...

skzi
12.01.2007, 01:10
Спасибо, а ты можешь посмотреть мой первый пост

EXSlim
12.01.2007, 02:05
DIAgen же всё написал...Правда кажись нужно просто отправить запрос яваскриптом =)

А php файл в за висимости от валидности данных сам сделает редирект. И вот ещё на всякий случай здесь поправить

// Prepare request object (automatically choose GET or POST).
req.open(null, 'handler.php', true);

на

req.open('post', 'handler.php', true); т.к. данные гонятся постом

skzi
12.01.2007, 03:03
Если можно, лучше прикрепите два файла или напишите их сюда... что то не получается у меня...

DIAgen
12.01.2007, 07:29
А php файл в за висимости от валидности данных сам сделает редирект. И вот ещё на всякий случай здесь поправить
// Prepare request object (automatically choose GET or POST).
req.open(null, 'handler.php', true);
на
req.open('post', 'handler.php', true); т.к. данные гонятся постом
А какая разница, там автоматически выберается метод отправки данных!

blaga
12.01.2007, 09:36
2EXSlim, твой пример это далеко не идеал. Посмотри, статья специально для тебя. https://forum.antichat.ru/thread30641.html

EXSlim
12.01.2007, 14:41
Предложи свой...
Я предложил регистрацию имён [A-Za-z0-9_] иначе пинком под зад. Чем неустраивает?

Насчёт запроса->
Я ведь незнаю с какими именами он пустил в базу юзеров. Если бы формат имён был таким как я предложил, то перед запросом проверял бы имя как и при регистрации preg_mathch`ем. А так это недочёт первоначального разработчика.

Вот тебе маленький квестик по теме =)

_http://community.ho.com.ua/antichat/sql-test/

Фильтр:
$name = mysql_real_escape_string($_POST['name']);


В базе всего 2 юзера:
user:qwerty;
admin:---

Цель: при правильном пароле админа появится ключевое слово. Его и написать сюда

blaga
12.01.2007, 14:52
Ты не понял, я не про mysql_real_escape_string(). А про if (!preg_match("/^[A-Za-z0-9_]... Зачем нужны эти филтры? Нужно только сделать так чтобы база нормально принимала данные. И mysql_real_escape_string() идеальный вариант если поле текстовое.

EXSlim
12.01.2007, 15:00
аааа.... квест ты бы не прошел =) там небыло уязвимости, хотя фильтр был такой =)

ты тоже непонял чуток =)
if (!preg_match("/^[A-Za-z0-9_] я бы поставил при регистрации, чтобы разрешить юзерам имена только из букв, цыфр и нижнего подчёркивания. Это неимеет отношения к фильтрации запроса в БД =)

skzi
12.01.2007, 16:51
Ребят! Я тему не для этого создавал! Помогите же мне!!! пожалуста