문제

기본 사항 :

  • PHP를 사용하여 양식을 검증하는 연락처 양식이 있습니다. (클라이언트 측 외에도) 이것은 모든 서버 측 언어로 수행 할 수 있습니다.
  • 서버 측은 특정 필드에 대해 AZ 0-9 만 허용합니다 (이 필드를 매우 제한된 범위에서만 영어로 유효성을 검사하는 것이 허용됩니다).
  • 양식에 오류가 포함 된 경우 필드를 다시 채우므로 사용자가 다시 제출하기 전에 다시 입력 할 필요가 없습니다.
  • 합법적 인 사용을 찾을 수 있어도 다른 사이트가 내 형태에 게시하지 않겠습니다.

다른 웹 사이트에서 더러운 단어를 필드에 게시하는 양식을 쉽게 만들 수 있습니다. 유효성 검사 규칙에 따라 특정 더러운 단어는 완벽하게 합법적이지만 직원은 분명히 그런 일이 일어나지 않을 것입니다.

전용 해커는 쿠키, PHP 세션에 영향을 줄 수 있으며 물론 숨겨진 필드가 추천자 등과 함께 스푸핑하기 쉽다는 인상을받습니다. 제 3 자 사이트가 내 페이지에 게시되는 것을 차단하려면 어떻게해야합니까?

이를 위해 Google도 도와 주시기 바랍니다. 내 검색어는 약하고 내가 아는 방법을 불러 일으키는 것이 실패 할 것입니다.

누군가가 사이트의 양식을 통해 "d03boy가 고양이를 먹는다"를 제출하고 사람들이 내 양식에 그것을 제출하는 링크를 클릭하도록하는 경우 어떻게해야합니까? (가능하다고 인정하고 회사는 위험을 수락 할 수 없습니다) 그러면 사용자가 "이름"필드 내부에서 볼 수있는 링크를 클릭하면 "이름"필드 "D03Boy가 고양이를 먹고 사이트의 내용에 대해 PETA에 연락합니다. 우리는 사용자에게 무슨 일이 있었는지 설명 할 수 없습니다. 사실, 아무 일도 일어나지 않았지만 단일 사용자를 화나게하는 것은 내 고용주에게는 허용되지 않습니다.

현재 솔루션은 사용자 입력을보고하지 않는 것입니다. 제 생각에는 큰 유용성 문제입니다.

도움이 되었습니까?

해결책

이것은 기술적 인 솔루션이 아닌 사용자 생성 컨텐츠를위한 중재 시스템이 필요한 것처럼 들립니다. 분명히, 당신은 참조기 필드, 컨텐츠 스크럽을 확인하고, 비난을 걸러 내지 만, 열거하는 악을 열거 할 수 있습니다. 절대 공장. (허용 가능한 "첫 번째 패스"일 수 있지만 인간은 그러한 필터를 피할 때 무한히 수완이 있습니다).

사용자가 제출 된 콘텐츠를 대기열에 넣고 중재자가 컨텐츠를 검토하고 승인하도록합니다. 부하를 밝히기 위해 신뢰할 수있는 사용자를 "사전 승인"하도록 설정할 수 있지만 고객이 위험을 받아 들일 수 없다고 말합니다.

솔직히 말해서, 나는 불가능하다는 것을 알게됩니다. 중재자가 있더라도 중재자가 시스템을 파괴 할 위험이 있습니다. 그것이 실제로 사실이라면 (위험에 맞지 않는 경우) 사용자 입력을 받아들이지 않고 중재자를 신뢰하지 말고 실제로 사이트 자체를 제거하지 마십시오 (내부자가 불량으로 가서 부적절한 것을 넣을 수 있기 때문에). 분명히 모든 행동은 위험이 있습니다. 중재자 기반 승인 대기열과 같이 수용 할 수있는 양을 찾아야합니다.

다른 팁

나는 당신의 질문을 완전히 이해하지 못하지만 기본적인 답변을 제공하기 위해 최선을 다하겠습니다.

크로스 사이트 스크립팅 (XSS)은 일반적으로 다른 사람이 HTML을 양식에 넣을 때 발생합니다. 귀하의 웹 사이트를 사용하면 HTML을 올바르게 탈출하지 않기 때문에 웹 사이트가 발생할 수 있습니다. PHP를 사용하는 경우 htmlentities ($ str, ent_quotes) 함수를 사용하고 싶을 것입니다.

htmlentities($str, ENT_QUOTES)

php htmlentities

내 시도

...
<?
$form_token = "";
$token = "";
$encoded_token = "";
$salt = "ThiséèÞ....$ÖyiìeéèÞ";  //it is 70 characters long
...
...
$blnGoodToken = false;
...
...
//Check for the encoded token
session_start();
$encoded_token = GetSuper('POST', 'TOKEN');
if (isset($_SESSION['TOKEN'])) {
    if (sha1($_SESSION['TOKEN'] + $salt) === $encoded_token) {
        $blnGoodToken = true;
        //echo "Good Token";
        }
    else {
        //echo "Bad Token";
        $blnGoodToken = false;
        unset($_SESSION);
        session_unset();
        session_destroy();
        session_start();
        }
    }
else {
    $blnDoit = false;
    echo "No Token, possible no session";
    }

$token = uniqid(rand(), TRUE);
$_SESSION['TOKEN'] = $token;
$form_token = sha1($token + $salt);
...
...
?>
...
...
<form action="request.php?doit=y" method="post">
    <input type="text" name="TOKEN" id="TOKEN" value="<?=$form_token?>" />
    <!--
    form stuff
    -->
    <input type="reset"  value="Clear" />
    <input type="submit" value="Submit" />
</form>

사이트의 다른 곳에서는 세션을 사용하지 않기 때문에 세션 납치에 많이 노출되지 않았다고 생각합니다. 토큰은 각 부하를 변경하고 토큰이 세션에 맞게해야합니다.

  1. 나는 SHA를 사용하고 있습니다. 내 PHP 코드를 쉽게 추측 할 수 있습니다
  2. 나는 그것을 세션에 보관한다. 세션이 Gettable이라고 생각합니다
  3. 내 소금. 나는 이것이 좋은 비밀이라고 생각합니다. 그들이 내 소금을 알고 있다면 그들은 이미 내 서버를 소유하고 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top